我可以用SQL语句指定并行度吗?

问题描述:

我很喜欢使用Spark sql,但之前遇到过一个问题。 由于每个分区的RDD大小限制,Spark sql会吐出以下错误消息; (INT_MAX)。我可以用SQL语句指定并行度吗?

16/03/03 15:41:20 INFO TaskSetManager: Lost task 142.2 in stage 4.0 (TID 929) on executor 10.1.100.116: java.lang.RuntimeException (java.lang.IllegalArgumentException: Size exceeds Integer.MAX_VALUE 
    at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:828) 
    at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:125) 
    at org.apache.spark.storage.DiskStore$$anonfun$getBytes$2.apply(DiskStore.scala:113) 
    at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1206) 
    at org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:127) 

所以我想增加每个RDD的分区数来解决这个问题。我可以在Spark sql中调整它们吗?

为什么要增加分区数量? 通常(并且经常)Spark根据您的群集(或本地计算机)功能选择适当数量的分区。

如果你看看here:“通常情况下,星火尝试设置分区的数量自动根据您的集群。但是,您也可以手动设置它...。”

从我个人的经验,增加了数量并不总是会导致处理效率的提高,除非数据集很小(它适合机器的内存),并且机器具有可用空闲内核来处理新分区。

关于你的问题,有一个名为spark.default.parallelism,您可以设置来控制并行性级别配置属性,你可以找到它here,并here你可以找到关于决定分区的数量默认星火行为的说明。

手动设置分区数量可能会很棘手,并且不灵活(在不同的机器或集群上执行应用程序时,必须确保调整此数字)。