【问题标题】:Spark NegativeArraySizeException火花 NegativeArraySizeException
【发布时间】:2017-06-07 13:43:23
【问题描述】:

在 Spark 工作中,我加入了两个 RDD,

val data: RDD[(Long, (String, String))] = sc.objectFile[(Long, scala.collection.mutable.HashMap[String, Object])](outputFile)
  .leftOuterJoin(attributionData)

这里的 outputFile 是另一个处理 hive 数据的 spark 作业的输出。 hive 中的一张表有 4000 万条记录,当我限制读取表以仅获取 1000 万条记录时,代码工作正常。但是,对于完整数据(如果我删除 limit())会发生以下错误,

10:43:27 WARN TaskSetManager: Lost task 0.0 in stage 1.0 (TID 2, buysub.com): java.lang.NegativeArraySizeException
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.resize(IdentityObjectIntMap.java:409)
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.putStash(IdentityObjectIntMap.java:227)
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.push(IdentityObjectIntMap.java:221)
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.put(IdentityObjectIntMap.java:117)
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.putStash(IdentityObjectIntMap.java:228)
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.push(IdentityObjectIntMap.java:221)
at com.esotericsoftware.kryo.util.IdentityObjectIntMap.put(IdentityObjectIntMap.java:117)
at com.esotericsoftware.kryo.util.MapReferenceResolver.addWrittenObject(MapReferenceResolver.java:23)
at com.esotericsoftware.kryo.Kryo.writeReferenceOrNull(Kryo.java:598)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:566)
at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:29)
at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:27)
at scala.collection.immutable.HashMap$HashMap1.foreach(HashMap.scala:224)
at scala.collection.immutable.HashMap$HashTrieMap.foreach(HashMap.scala:403)
at com.twitter.chill.TraversableSerializer.write(Traversable.scala:27)
at com.twitter.chill.TraversableSerializer.write(Traversable.scala:21)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:29)
at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:27)
at scala.collection.immutable.List.foreach(List.scala:318)
at com.twitter.chill.TraversableSerializer.write(Traversable.scala:27)
at com.twitter.chill.TraversableSerializer.write(Traversable.scala:21)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at com.twitter.chill.Tuple2Serializer.write(TupleSerializers.scala:37)
at com.twitter.chill.Tuple2Serializer.write(TupleSerializers.scala:33)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)
at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:29)
at com.twitter.chill.TraversableSerializer$$anonfun$write$1.apply(Traversable.scala:27)
at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:98)
at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:98)
at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:226)
at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:39)
at scala.collection.mutable.HashMap.foreach(HashMap.scala:98)
at com.twitter.chill.TraversableSerializer.write(Traversable.scala:27)
at com.twitter.chill.TraversableSerializer.write(Traversable.scala:21)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:568)

我使用的是 Spark 1.6。以下是spark配置,

conf.set("spark.driver.memory", "4G")
conf.set("spark.executor.memory", "30G")
conf.set("spark.rdd.compress", "true")
conf.set("spark.storage.memoryFraction", "0.3")
conf.set("spark.shuffle.consolidateFiles", "true")
conf.set("spark.shuffle.memoryFraction", "0.5")
conf.set("spark.akka.frameSize", "384")
conf.set("spark.io.compression.codec", "lz4")
conf.set("spark.serializer","org.apache.spark.serializer.KryoSerializer")

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    我发现一些信息表明这是 Kryo 序列化中的一个错误:

    https://github.com/EsotericSoftware/kryo/issues/382

    它已在 Kryo 4 中修复,但 spark 尚未使用该版本:

    https://issues.apache.org/jira/browse/SPARK-20389

    作为一种临时解决方法,听起来可能会有所帮助:

    spark.executor.extraJavaOptions –XX:hashCode=0
    spark.driver.extraJavaOptions –XX:hashCode=0
    

    (来自https://github.com/broadinstitute/gatk/issues/1524#issuecomment-189368808

    或者您可以简单地使用不同的序列化程序,但这可能会减慢速度。

    【讨论】:

    • 传递参数没有帮助(我将对此进行更多测试)。使用java序列化解决了这个问题。然而,4000 万条记录对于 spark 来说听起来并不像太大的数据。我是否缺少其他配置?
    • 4000万对spark来说不算大。但是这 4000 万条记录中的某些东西触发了这个错误,而只有前 1000 万条没有。与其说是数据的大小,不如说是随着你的数据越来越多,通过执行更多的代码路径,你更有可能遇到 bug。
    • 我们现在有解决这个问题的办法吗?传递参数没有帮助。
    【解决方案2】:

    当 Kryo 的参考表超过最大整数值(整数溢出)时会发生这种情况。 这解决了这个问题,将spark.kryo.referenceTracking设置为false

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2016-10-20
      • 2023-03-26
      • 2016-06-07
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多