为啥文件拆分的大小不会随着我重新分区数据而减少?

Posted

技术标签:

【中文标题】为啥文件拆分的大小不会随着我重新分区数据而减少?【英文标题】:Why don't Sizes of File Splits decrease as I repartition data?为什么文件拆分的大小不会随着我重新分区数据而减少? 【发布时间】:2017-04-28 22:42:41 【问题描述】:

我正在运行一个使用 spark-xml datasource 处理大型 (51G) xml 文件的 Spark 批处理作业。我在我的机器上本地运行。

我想使用我所有的内核 (8),但我想保持每个任务的大小很小,这样所有任务使用的总 RAM 不会增长超过我可用的内存。

所以我像这样使用repartition

val df: DataFrame = spark.sqlContext.read
  .option("mode", "FAILFAST")
  .format("com.databricks.spark.xml")
  .schema(customSchema)
  .option("rowTag", "row")
  .load(s"$pathToInputXML")
  .repartition(30)

所以我认为每个任务将处理大约 (51GB / 30 个分区 / 8 cores) == 每个任务 212MB。

问题是,看起来每个任务只有 33MB 长,从输出中可以看出:

17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:0+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:134217728+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:33554432+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:234881024+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:201326592+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:100663296+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:167772160+33554432
17/04/28 19:40:02 INFO NewHadoopRDD: Input split: file:/media/felipe/SAMSUNG/StackHeavy/Posts.xml:67108864+33554432

谁能给我解释一下?为什么更改分区数后文件拆分的大小没有变化?

【问题讨论】:

尝试coalesce(30) 而不是repartition(30)repartition 将创建一个随机播放。 顺便说一句,我认为输入拆分总是相同的。您应该检查任务编号。 @zsxwing 我明白了。那么请添加答案。 【参考方案1】:

为什么当我改变分区数量时文件分割的大小没有改变?

因为repartitioning 不影响输入拆分。您的代码在将数据加载到 Spark 后对其进行打乱。

如果您想修改输入拆分的数量,请使用should adjust spark.sql.files.maxPartitionBytes 参数。

【讨论】:

以上是关于为啥文件拆分的大小不会随着我重新分区数据而减少?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server表分区

SQL Server表分区

SQL Server表分区

SQL Server表分区

SQL Server表分区

SQL Server表水平分区