【问题标题】:Get uncompressed size of the dataset on HDFS after being read by Spark在被 Spark 读取后,获取 HDFS 上数据集的未压缩大小
【发布时间】:2019-05-27 07:20:09
【问题描述】:

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

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

hdfs dfs -du -s {data_path}

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

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

【问题讨论】:

  • 您的意思是反序列化数据大小吗?解压很简单,解压文件就可以得到结果。
  • @Clock Slave 您是否能够在不解压缩的情况下获得文件的未压缩大小?

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


【解决方案1】:

随机分区与数据大小无关。
数据未压缩,然后根据 shuffle 分区的数量(使用 hash partitioner、range partitioner 等)进行 shuffle。
通常,shuffle 分区是经过调整的
1.增加reducer阶段可用的并行度。
2.减少shuffle partition处理的数据量(如果我们观察到溢出或者reduce阶段是内存密集型的)

我从多个来源了解到每个分区应该是 128 MB 左右。

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

并且shuffle partitions(使用spark.sql.shuffle.partitions配置,默认为200)与reducer stage相关。

简而言之,压缩只在 mapper 阶段而不是 reducer 阶段发挥作用。

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多