为什么Spark RDD分区对HDFS有2GB的限制?

bou*_*eli 14 scala apache-spark rdd

使用mllib RandomForest训练数据时出错.由于我的数据集很大,默认分区相对较小.所以抛出异常表示"Size超过Integer.MAX_VALUE",原始堆栈跟踪如下,

15/04/16 14:13:03 WARN scheduler.TaskSetManager:阶段6.0中的丢失任务19.0(TID 120,10.215.149.47):java.lang.IllegalArgumentException:大小超过
sun.nio.ch.FileChannelImpl处的Integer.MAX_VALUE.在org.apache上的org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:123)的org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:132)中映射(FileChannelImpl.java:828) .spark.storage.BlockManager.doGetLocal(BlockManager.scala:517)org.apache.spark.storage.BlockManager.getLocal(BlockManager.scala:432)atg.apache.spark.storage.BlockManager.get(BlockManager.scala) :618)org.apache.spark.CacheManager.putInBlockManager(CacheManager.scala:146)at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:70)

Integer.MAX_SIZE是2GB,似乎有些分区内存不足.所以我将我的rdd分区重新分配到1000,这样每个分区可以保存比以前少得多的数据.最后,问题解决了!

所以,我的问题是:为什么分区大小有2G限制?似乎没有为spark中的限制设置配置

Shy*_*nki 14

spark中块的基本抽象是a ByteBuffer,不幸的是它有一个Integer.MAX_VALUE(~2GB)的限制.

这是一个关键问题,可以防止在非常大的数据集中使用spark.增加分区的数量可以解决它(如在OP的情况下),但并不总是可行的,例如当存在大的转换链时,其中一部分可以增加数据(flatMap等)或者在数据倾斜的情况下.

提出的解决方案是提出像LargeByteBuffer这样的抽象,它可以支持块的字节缓冲区列表.这会影响整体火花结构,因此在相当长一段时间内仍未解决.