如何提高大数据性能?
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会根据集群带宽自动获取资源。
【讨论】:
以上是关于如何提高大数据性能?的主要内容,如果未能解决你的问题,请参考以下文章