所以我只有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,所以我不明白发生了什么。
您应该使用较小的块大小编写拼花文件。默认为每个块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)