如何解决Spark 2.2在每个分区中写入少量文件
我知道在stackoverflow和其他站点中有很多类似的问题和答案,我已经尝试了其中的每一个,但仍然无法获得想要的东西。
我的源数据在“天”列上有分区,每个分区有大约1.4亿条记录(约2 GB appx)。
总记录数:700个day_id分区(平均分配2年的数据)* 1.4亿= 98,000,000条记录-1.2 TB数据。
源每个分区有2000-3000个小文件,这会影响群集的整体性能。
目标是,我希望每个分区中的文件大小不超过10 mb至600 mb。
我的代码:(我可以负担得起火花提交的最大配置是100个执行器,每个执行器5个内核,每个16gb)
from pyspark.sql.functions import *
df = spark.read.orc('/hdfs/path/for/source/data/')
#option-1 > with this I can achieve what I want but its awfully slow
df.repartition(8000,col("day_id")).write.mode('overwrite').option("maxRecordsPerFile",500000).partitionBy("day_id").orc('/target/location/')
#option-2 > with this its faster but I end up with small files again
df.repartition(8000).write.mode('overwrite').option("maxRecordsPerFile",500000).partitionBy("day_id").orc('/target/location/')
#option-3 > with this also its faster but I end up with small files again
df.repartition(8000,col("day_id"),rand(seed=100)).write.mode('overwrite').option("maxRecordsPerFile",500000).partitionBy("day_id").orc('/target/location/')
如果我不使用col(“ day_id”)并在重新分区中使用一个小数字,例如。 10或20,然后spark尝试首先将整个数据放入20个分区中,然后失败。
您能为此建议最好的方法吗?我可以拥有大量的内存分区,这将给我带来大量的工作人员,但同时,每个分区都不会有超过5-10个day_ids,因此,最后由那些在该分区上工作的工作人员在每个分区中创建5-10个文件。
此外,我了解到我可以编写自己的分区功能,但是我不够熟练:(
如果我对问题的陈述不清楚,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。