【问题标题】:Spark with BloomFilter of billions of records causes Kryo serialization failed: Buffer overflow.具有数十亿条记录的 BloomFilter 的 Spark 导致 Kryo 序列化失败:缓冲区溢出。
【发布时间】:2018-01-15 21:12:07
【问题描述】:

我在 Apache spark 中使用了 Breeze 实现的布隆过滤器。我的布隆过滤器预计有 200,000,000 个键。但我面临以下异常:

User class threw exception: org.apache.spark.SparkException: Job aborted due to stage failure: Task 1 in stage 5.0 failed 4 times, most recent failure: Lost task 1.3 in stage 5.0 (TID 161, SVDG0752.ideaconnect.com): org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 1 

我知道要避免这种情况,我可以增加 spark.kryoserializer.buffer.max 值,但由于集群资源限制,我不能将其增加超过 2GB。

下面是代码:

val numOfBits=2147483647
val numOfHashFun=13
val bf = hierachyMatching.treeAggregate(new BloomFilter[String](numOfBits,numOfHashFun))(
  _ += _, _ |= _)

其中 hierachyMatching 是包含 200M 条记录的 String 类型的 Rdd。

我的问题:

  • 如何在不增加 buffer.max 值的情况下解决此异常以及如何处理?
  • 是否可以使用驱动程序内存 6512mb 构建一个包含超过 20 亿位的布隆过滤器?

任何与此相关的想法或建议将不胜感激。提前致谢。

【问题讨论】:

    标签: scala apache-spark bloom-filter bigdata


    【解决方案1】:

    尝试在spark-default.conf(或被覆盖的属性)中指定spark.kryoserializer.buffer.max1 gb(或对此属性进行试验,以便选择更好的值)并重新启动您的spark 服务,它应该会对您有所帮助。

    【讨论】:

    • 我已经尝试将 spark.kryoserializer.buffer.max 的大小增加到 2gb(在执行参数中),但它仍然给了我同样的异常,我不能将它增加超过 2gb。
    • @mayur 尝试使用属性spark.kryoserializer.buffer.max.mb 和值512
    • 仍然无法正常工作。如果它不能使用 2gb,那么它如何仅使用 512mb?
    • @mayur 这意味着为 kryoserializer 缓冲区分配的大小不足以满足您处理的数据量
    • 是的。我想要解决方法。我怀疑我是否正确使用了带有布隆过滤器的树聚合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2021-06-15
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多