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

时间:2017-04-28 22:42:42

标签: apache-spark apache-spark-sql apache-spark-2.0

我正在运行使用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

有人可以向我解释一下吗?为什么当我更改分区数时,文件分割的大小不会改变?

1 个答案:

答案 0 :(得分:2)

  

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

因为repartitioning不会影响输入拆分。在将数据加载到Spark之后,您的代码会对数据进行洗牌。

如果您想要修改输入数量,请将should adjust spark.sql.files.maxPartitionBytes参数分开。