我正在尝试提高我的Spark应用程序的性能。为此,我正在尝试确定数据集的最佳随机分区数。我从多个来源中读到,每个分区应该大约是128MB。
因此,如果我有一个1GB的文件,我将需要大约8个分区。但我的问题是如何找到文件大小?我知道我可以使用以下方法在hdfs上找到文件大小
hdfs dfs -du -s {data_path}
但据我所知,这是压缩大小和文件的实际大小不同。(Spark在编写镶木地板文件时使用压缩编解码器,默认情况下snappy
)。这实际上让我想到了两个问题
随机分区与数据大小无关。
数据是未压缩的,然后根据随机分区的数量(使用哈希分区器、范围分区器等)进行随机分区。
通常,随机分区经过调整
1。增加减少阶段可用的并行性。
2。减少随机分区处理的数据量(如果我们观察到溢出或它,减少阶段是内存密集型的)
我从多个来源读到,每个分区应该是大约128MB。
这仅适用于映射器阶段。映射器中的拆分大小是根据压缩数据的大小计算的。您可以使用park. sql.files.maxParttionBytes
调整映射器拆分的大小
而shaffle分区(使用火花. sql.shuffle.分区
配置,默认为200)与减速机阶段有关。
简而言之,压缩只在映射器阶段起作用,而不是减速器阶段。