【问题标题】:Running Spark Mllib Decision Tree gives block size error运行 Spark Mllib 决策树给出块大小错误
【发布时间】:2016-09-11 17:45:22
【问题描述】:

我正在对大约 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)

感谢您提供有关可能导致此问题的原因以及如何解决此问题的任何指示。 谢谢。

【问题讨论】:

  • 你能粘贴你的代码或错误吗?

标签: apache-spark decision-tree


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-11
    • 2016-10-07
    • 1970-01-01
    • 2015-05-12
    • 2015-10-25
    • 1970-01-01
    • 2016-11-15
    • 2016-09-04
    • 2016-07-07
    相关资源
    最近更新 更多