我正在尝试提高Spark应用程序的性能。为此,我正在尝试确定数据集的最佳混洗分区数。我从多个来源获悉,每个分区大约应为128 MB。
因此,如果我有一个1GB的文件,则大约需要8个分区。但是我的问题是如何找到文件大小?我知道我可以使用以下命令在hdfs上找到文件大小
hdfs dfs -du -s {data_path}
但是据我了解,这是压缩后的大小,文件的实际大小是不同的。 (默认情况下snappy
,Spark在编写镶木地板文件时使用压缩编解码器)。这实际上导致了我两个问题
答案 0 :(得分:1)
随机播放分区与数据大小无关。
数据将被解压缩,然后根据混洗分区的数量(使用哈希分区器,范围分区器等)进行混洗。
通常,对shuffle分区进行调整
1.增加减速器阶段可用的并行度。
2.减少通过混洗分区处理的数据量(如果我们观察到溢出情况,则减少阶段会占用大量内存)
我从多个来源获悉,每个分区大约应为128 MB。
这仅适用于映射器阶段。映射器中的拆分大小是根据压缩数据的大小计算的。您可以使用spark.sql.files.maxPartitionBytes
随机排序分区(使用spark.sql.shuffle.partitions
配置,默认为200)与reducer阶段有关。
简而言之,压缩仅在映射器阶段起作用,而在缩减器阶段不起作用。