在这里点火新手。 我在Hive中有一个非常大的表(~130M记录,180列),我正在尝试使用Spark将其打包为镶木地板文件。 我正在使用默认的EMR集群配置,6 * r3.xlarge实例来提交我用Python编写的spark应用程序。然后我在YARN上以集群模式运行它,通常给驱动程序提供少量内存(几个gb),其余部分给执行程序。这是我的代码:
from pyspark import SparkContext
from pyspark.sql import HiveContext
sc = SparkContext(appName="ParquetTest")
hiveCtx = HiveContext(sc)
data = hiveCtx.sql("select * from my_table")
data.repartition(20).write.mode('overwrite').parquet("s3://path/to/myfile.parquet")
稍后,我提交类似的内容:
spark-submit --master yarn --deploy-mode cluster --num-executors 5 --driver-memory 4g --driver-cores 1 --executor-memory 24g --executor-cores 2 --py-files test_pyspark.py test_pyspark.py
然而,我的任务需要永远完成。在作业开始后,Spark会很快关闭所有工作人员,因为其他人没有被使用,并且需要几个小时才能获得来自Hive的所有数据。 Hive表本身没有分区或集群(我还需要一些建议)。
你能帮助我理解我做错了什么,我应该从哪里开始,如何从我拥有的资源中获得最大的性能?
谢谢!
答案 0 :(得分:0)
我有类似的用例,我使用spark写入s3并且有性能问题。主要原因是spark创建了大量零字节部分文件,将临时文件替换为实际文件名正在减慢写入过程。尝试下面的方法作为解决方法