Spark新手在这里。我在hive中有一个相当大的表(约130m条记录,180列),我正在尝试使用spark将其打包为Parquet文件。我使用默认的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获得所有数据。配置单元表本身还没有分区或集群(我还需要一些建议)。
你能帮助我理解我做错了什么,我应该从这里走到哪里,以及如何从我拥有的资源中获得最大的性能吗?
谢谢您!
1条答案
按热度按时间piv4azn71#
我有一个类似的用例,我使用spark来编写s3,但出现了性能问题。主要原因是spark创建了大量零字节的部件文件,而将临时文件替换为实际文件名会减慢写入过程。尝试以下方法作为解决方法
将spark的输出写入hdfs,并使用hive写入s3。性能更好,因为配置单元创建的零件文件数量更少。我遇到的问题是(使用spark时也有相同的问题),prod env中由于安全原因没有提供对策略的删除操作。s3桶是kms加密的。
将spark输出写入hdfs,将hdfs文件复制到本地,并使用awss3copy将数据推送到s3。这种方法的效果次之。他们和亚马逊一起创建了一张机票,并建议使用这张。
使用s3 dist cp将文件从hdfs复制到s3。这是工作没有问题,但没有表现