提问者:小点点

如何在Spark中将拼花文件拆分为多个分区?


所以我只有1个我正在用Spark阅读的镶木地板文件(使用SQL的东西),我希望它用100个分区来处理。我尝试过将火花. default.并行性设置为100,我们还尝试过将镶木地板的压缩更改为无(从gzip)。无论我们做什么,火花作业的第一阶段只有一个分区(一旦发生洗牌,它就会重新分区为100,此后显然速度要快得多)。

现在根据一些来源(如下所示),镶木地板应该是可拆分的(即使使用gzip!),所以我非常困惑,希望得到一些建议。

https://www.safaribooksonline.com/library/view/hadoop-application-architectures/9781491910313/ch01.html

我使用的是火花1.0.0,显然的默认值是200,所以不可能是这样。事实上,并行度的所有默认值都远远超过1,所以我不明白发生了什么。


共3个答案

匿名用户

您应该使用较小的块大小编写拼花文件。默认为每个块128Mb,但可以通过在编写器中设置parque. block.size配置来配置。

ParquetOuputFormat的源代码在这里,如果你想深入了解细节。

块大小是您可以从逻辑上可读的parquet文件中读取的最小数据量(因为parquet是列式的,所以您不能按行或类似的琐碎内容进行拆分),因此您不能拥有比输入块更多的读取线程。

匿名用户

新的操作方式(Spark 2. x)是设置

spark.sql.files.maxPartitionBytes

来源:https://issues.apache.org/jira/browse/SPARK-17998(官方留档还不正确,错过了. sql)

根据我的经验,Hadoop设置不再有效。

匿名用户

也许你的拼花文件只需要一个HDFS块。创建一个有许多HDFS块的大拼花文件并加载它

val k = sc.parquetFile("the-big-table.parquet")
k.partitions.length

您将看到与HDFS块相同数量的分区。这对我来说很好(火花-1.1.0)