运行Spark Mllib决策树会产生块大小错误

时间:2016-05-16 01:14:37

标签: apache-spark decision-tree

我在大约2000点和500个功能的数据框架上运行决策树。 Maxbins是182.无论我如何将混洗块大小从200增加到4000,我仍然在决策树训练的第3阶段失败,说“达到最大整数”是指Spark块大小改组大小。注意我的数据帧不是rdds而是spark sql数据帧。

以下是错误:

...
Caused by: 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)
    at org.apache.spark.storage.DiskStore.getBytes(DiskStore.scala:134)
    at org.apache.spark.storage.BlockManager.doGetLocal(BlockManager.scala:522)
    at org.apache.spark.storage.BlockManager.getBlockData(BlockManager.scala:312)
    at org.apache.spark.network.netty.NettyBlockRpcServer$$anonfun$2.apply(NettyBlockRpcServer.scala:58)
    at org.apache.spark.network.netty.NettyBlockRpcServer$$anonfun$2.apply(NettyBlockRpcServer.scala:58)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
    at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    ...

以下是生成它的代码:

val assembled = assembler.transform(features)  
val dt = new DecisionTreeClassifier().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setImpurity(impurity).setMaxBins(maxBins).setMaxDepth(maxDepth)
val pipeline = new Pipeline().setStages(Array(labelIndexer, dt))
val model = pipeline.fit(assembled)

感谢您提供有关可能导致此问题以及如何解决问题的任何建议。 谢谢。

1 个答案:

答案 0 :(得分:0)

尝试增加分区数 - 尝试使用repartition()方法。

出现此错误的原因是spark使用内存映射文件来处理分区数据块,但目前无法对内存映射的内容超过2GB(Integer.MAX_VALUE),而不是Spark问题。

解决方法是增加分区数量。这将减少特定分区的块大小,并可能有助于解决问题。

还有一些活动可以解决Spark本身的问题 - 以块的形式处理分区块。