2016-11-09 71 views
2

我是这个概念的新手,还在学习。我在AWS S3中共有10 TB json文件,AWS EC2中有4个实例(m3.xlarge)(1位主,3位员工)。我目前在Apache Zeppelin上使用python进行Spark。如何提高大数据性能?

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

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

在飞艇解释器设置:

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

它需要1分钟至约读1GB。我能更高效地阅读大数据,我能做些什么?

  • 我应该多做一些编码工作吗?
  • 我应该增加实例吗?
  • 我应该使用其他笔记本电脑平台吗?

谢谢。

回答

2

对于性能问题,最好的办法是知道性能瓶颈在哪里。或者尝试查看性能问题的位置。

由于1分钟读取1GB很慢。我会尝试以下步骤。

  • 尝试显式指定的,而不是inferSchema
  • 尝试使用的模式星火2.0,而不是1.6
  • 检查S3和EC2之间的连接,如果有一些错误配置
  • 使用像不同的文件格式parquetjson
  • 增加执行程序内存并减少驱动程序内存
  • 使用Scala代替Python,althou在这种情况下,这个问题的可能性最小。
+0

非常感谢。这对我来说是非常明确的答案。因此,对于10TB的数据,3个工作者和1个主人(每个m3.xlarge)应该够了,对吧? –

+0

这实际上取决于你想要做什么。对于简单的统计数据,可以用一些中间聚合的帮助来确定。对于密集型机器学习,可能不会。 –

1

可以在拼花格式持久化数据JSON读

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

后//在火花1.6创建在火花2.0或registerAsTemp表的临时视图并使用SQL用于进一步逻辑

hcDataDF.createOrReplaceTempView("T_hcDataDF") 

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

执行,使用Dyanamic资源分配的火花提交命令:

//确保在集群中启用以下,否则,你可以使用火花峰会命令这些参数作为--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 

//星火提交命令

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

//对于动态资源分配我们并不需要指定遗嘱执行人的#。 //作业将根据群集带宽自动获取资源。

1

我在十月介绍了这一主题为顶嘴:Spark and Object Stores

本质:为了有效利用木/兽人,但调整设置读取。一旦发布,获取针对Hadoop 2.8构建的Spark 2.0.x,以实现我们已经完成的大量加速工作,特别是使用ORC & Parquet。我们也添加了很多指标,尽管还没有把它们全部带回到spark UI。

如果必须通过整个数据集(CSV推理,我不知道JSON),模式推断可能会很慢。我建议先做一次,抓住模式细节,然后在下一次绕路时明确声明它为模式。