如何提高大数据性能?

Posted

技术标签:

【中文标题】如何提高大数据性能?【英文标题】:How can I increase big data performance? 【发布时间】:2016-11-09 13:47:50 【问题描述】:

我是这个概念的新手,还在学习。我在 AWS S3 中总共有 10 TB json 文件,在 AWS EC2 中有 4 个实例(m3.xlarge)(1 个主节点,3 个工作节点)。我目前在 Apache Zeppelin 上使用带有 python 的 spark。

我正在使用以下命令读取文件;

hcData=sqlContext.read.option("inferSchema","true").json(path)

在 zeppelin 解释器设置中:

master = yarn-client
spark.driver.memory = 10g
spark.executor.memory = 10g
spark.cores.max = 4

读取 1GB 大约需要 1 分钟。为了更高效地读取大数据,我还能做些什么?

我应该在编码方面做得更多吗? 我应该增加实例吗? 我应该使用其他笔记本平台吗?

谢谢。

【问题讨论】:

【参考方案1】:

对于性能问题,最好知道性能瓶颈在哪里。或者尝试查看性能问题可能出在哪里。

因为 1 分钟读取 1GB 非常慢。我会尝试以下步骤。

尝试显式指定架构而不是inferSchema 尝试使用 Spark 2.0 而不是 1.6 检查 S3 和 EC2 之间的连接,以防出现配置错误 使用不同的文件格式,例如parquet,而不是json 增加执行程序内存并减少驱动程序内存 使用 Scala 而不是 Python,尽管在这种情况下最不可能出现问题。

【讨论】:

非常感谢。这对我来说是非常解释性的答案。所以,对于 10 TB 的数据,3 个 worker 和 1 个 master(每个 m3.xlarge)应该足够了,对吧? 这实际上取决于你想做什么。对于简单的统计,借助中间聚合应该是可以的。对于强化机器学习,可能不会。【参考方案2】:

我在 10 月就这个话题发表过演讲:Spark and Object Stores

本质上:使用 parquet/orc 但调整设置以提高读取效率。发布后,获取针对 Hadoop 2.8 构建的 Spark 2.0.x,以进行我们已经完成的大量加速工作,尤其是使用 ORC 和 Parquet。我们还添加了许多指标,但还没有将它们全部拉回 spark UI。

架构推理可能会很慢,如果它必须遍历整个数据集(CSV 推理可以;我不了解 JSON)。我建议这样做一次,获取架构详细信息,然后在下一次明确地将其声明为架构。

【讨论】:

【参考方案3】:

json读取后可以以parquet格式持久化数据

hcData=sqlContext.read.option("inferSchema","true").json(path)
hcData.write.parquet("hcDataFile.parquet")
val hcDataDF = spark.read.parquet("hcDataFile.parquet")

// 在 Spark 2.0 中创建一个临时视图或在 Spark 1.6 中创建 registerAsTemp 表,并使用 SQL 进行进一步的逻辑

hcDataDF.createOrReplaceTempView("T_hcDataDF")

//这是一种手动进行RDD检查点的方式(DataFrames不支持),这将减少RDD Lineage从而提高性能。

要执行,请为您的 spark-submit 命令使用动态资源分配:

//确保在你的集群中启用了以下参数,否则你可以在spark-summit命令中使用这些参数作为--conf

•   spark.dynamicAllocation.enabled=true
•   spark.dynamicAllocation.initialExecutors=5 
•   spark.dynamicAllocation.minExecutors=5
•   spark.shuffle.service.enabled=true
•   yarn.nodemanager.aux-services=mapreduce_shuffle,spark_shuffle
•   yarn.nodemanager.aux-services.spark_shuffle.class
    =org.apache.spark.network.yarn.YarnShuffleService

//Spark-提交命令

 ./bin/spark-submit --class package.hcDataclass \
 --master yarn-cluster \
 --deploy-mode cluster \
 --driver-memory 1G \
 --executor-memory 5G\
 hcData*.jar

//对于动态资源分配我们不需要指定执行者的数量。 //Job会根据集群带宽自动获取资源。

【讨论】:

以上是关于如何提高大数据性能?的主要内容,如果未能解决你的问题,请参考以下文章

java中大量数据如何提高性能?

如何设计java程序能提高大数据量的计算速度?

数据库统计有多大用处

Laravel - 提高大数据(8m+ 行)查询读取性能的可能解决方案

EF大数据批量处理----BulkInsert

Docker上跑数据库会导致的性能损失大吗