使用数十亿条记录的BloomFilter引发Kryo序列化失败:缓冲区溢出。

时间:2017-08-08 10:31:23

标签: scala apache-spark bloom-filter bigdata

我在Apache spark中使用了Breeze实现了Bloom过滤器。我的Bloom Filter需要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值和How?
  • 的情况下处理此异常
  • 是否可以使用驱动程序内存6512mb构建一个包含超过20亿位的Bloom过滤器?如何?

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

1 个答案:

答案 0 :(得分:2)

尝试在spark.kryoserializer.buffer.max(或覆盖属性)中指定1 gbspark-default.conf(或尝试使用此属性以便选择更好的值)并重新启动您的Spark服务,它应该可以帮助您