为啥文件拆分的大小不会随着我重新分区数据而减少?
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
参数。
【讨论】:
以上是关于为啥文件拆分的大小不会随着我重新分区数据而减少?的主要内容,如果未能解决你的问题,请参考以下文章