我很享受使用Spark sql,但之前遇到过一个问题。 由于每个分区的RDD大小限制,Spark sql会发出以下错误消息; (INT_MAX)。
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中调整它们吗?
答案 0 :(得分:1)
为什么要增加分区数? 通常(通常)Spark会根据您的群集(或本地计算机)功能选择合适数量的分区。
如果查看here:"通常,Spark会尝试根据您的群集自动设置分区数。但是,您也可以手动设置..."
根据我的个人经验,增加数量并不总是会提高处理效率,除非您的数据集很小(它适合机器的内存)并且机器可用空闲核心来处理新分区。
关于您的问题,有一个名为spark.default.parallelism
的配置属性可以设置为控制并行度,您可以找到它here,here可以找到解释关于决定分区数量的默认Spark行为。
手动设置分区数可能很棘手且不灵活(在不同的计算机或群集上执行应用程序时,必须确保调整此数字)。