由Spark

时间:2019-05-27 07:20:09

标签: apache-spark pyspark apache-spark-sql

我正在尝试提高Spark应用程序的性能。为此,我正在尝试确定数据集的最佳混洗分区数。我从多个来源获悉,每个分区大约应为128 MB。

因此,如果我有一个1GB的文件,则大约需要8个分区。但是我的问题是如何找到文件大小?我知道我可以使用以下命令在hdfs上找到文件大小

hdfs dfs -du -s {data_path}

但是据我了解,这是压缩后的大小,文件的实际大小是不同的。 (默认情况下snappy,Spark在编写镶木地板文件时使用压缩编解码器)。这实际上导致了我两个问题

  1. 如何找到文件的实际未压缩大小?
  2. 混洗分区的数量应基于压缩大小或实际大小?

1 个答案:

答案 0 :(得分:1)

随机播放分区与数据大小无关。
数据将被解压缩,然后根据混洗分区的数量(使用哈希分区器,范围分区器等)进行混洗。
通常,对shuffle分区进行调整
1.增加减速器阶段可用的并行度。
2.减少通过混洗分区处理的数据量(如果我们观察到溢出情况,则减少阶段会占用大量内存)

  

我从多个来源获悉,每个分区大约应为128 MB。

这仅适用于映射器阶段。映射器中的拆分大小是根据压缩数据的大小计算的。您可以使用spark.sql.files.maxPartitionBytes

调整映射器拆分的大小

随机排序分区(使用spark.sql.shuffle.partitions配置,默认为200)与reducer阶段有关。

简而言之,压缩仅在映射器阶段起作用,而在缩减器阶段不起作用。