我喜欢使用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中调整它们吗?
增加分区数?通常(通常)Spark 会根据群集(或本地计算机)功能选择适当数量的分区。
如果您查看此处:"通常,Spark会尝试根据您的集群自动设置分区数。但是,您也可以手动设置它..."
根据我的个人经验,增加数量并不总是能提高处理效率,除非你的数据集很小(它适合机器的内存),并且机器有可用的空闲内核来处理新分区。
关于您的问题,有一个名为 spark.default.parallelism
的配置属性,您可以设置它来控制并行级别,您可以在此处找到它,在这里您可以找到有关确定分区数的默认 Spark 行为的说明。
手动设置分区数量可能很棘手,而且不灵活(当您在不同的机器或集群上执行应用程序时,必须确保调整此数字)。