spark2.2在每个分区中编写少量文件

6g8kf2rb  于 2021-05-24  发布在  Spark
关注(0)|答案(0)|浏览(207)

我知道在stackoverflow和其他网站上有很多类似的问题和答案,我已经浏览并尝试了其中的每一个,但我仍然无法得到我想要的。
我的源数据在一个day列上有分区,每个分区大约有1.4亿条记录(2GB appx)。
总记录数:700天\u id分区(平均分布2年的数据)*1.4亿=9800000000条记录-1.2 tb的数据。
源代码每个分区有2000-3000个小文件,这会影响集群的整体性能。
在target中,我希望每个分区中的文件不超过10个,大小为100 mb到600 mb。
我的代码:(spark submit的最大配置是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\u id”)并且在重分区中使用一个小的数字,例如10或20,那么spark会首先尝试将整个数据放入20个分区,但是失败了。
你能建议一个最好的方法吗?在这个方法中,我可以有大量的内存分区,这将给我提供大量的工作人员,但同时,每个分区不会有超过5-10天的ID,因此,我最终在每个分区中有5-10个文件,这些工作人员在该分区上工作。
此外,我还了解到我可以编写自己的分区函数,但我的技能还不够:(
请让我知道如果我不清楚我的问题陈述。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题