提问者:小点点

在被Spark读取后,获取HDFS上数据集的未压缩大小


我正在尝试提高我的Spark应用程序的性能。为此,我正在尝试确定数据集的最佳随机分区数。我从多个来源中读到,每个分区应该大约是128MB。

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

hdfs dfs -du -s {data_path}

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

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

共1个答案

匿名用户

随机分区与数据大小无关。
数据是未压缩的,然后根据随机分区的数量(使用哈希分区器、范围分区器等)进行随机分区。
通常,随机分区经过调整
1。增加减少阶段可用的并行性。
2。减少随机分区处理的数据量(如果我们观察到溢出或它,减少阶段是内存密集型的)

我从多个来源读到,每个分区应该是大约128MB。

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

而shaffle分区(使用火花. sql.shuffle.分区配置,默认为200)与减速机阶段有关。

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