为什么在我重新分区数据时文件拆分的大小没有减少?

Why don't Sizes of File Splits decrease as I repartition data?

我是 运行 一个使用 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 核心)==每个任务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

有人能给我解释一下吗?为什么当我更改分区数时文件拆分的大小没有改变?

Why doesn't the size of the file split change as I change the number of partitions?

因为 repartitioning 不影响输入拆分。在将数据加载到 Spark 后,您的代码会随机播放数据。

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