我正在运行使用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
有人可以向我解释一下吗?为什么当我更改分区数时,文件分割的大小不会改变?
答案 0 :(得分:2)
为什么我更改分区数时文件分割的大小没有变化?
因为repartitioning
不会影响输入拆分。在将数据加载到Spark之后,您的代码会对数据进行洗牌。
如果您想要修改输入数量,请将should adjust spark.sql.files.maxPartitionBytes
参数分开。