java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access

7 篇文章 0 订阅
2 篇文章 0 订阅

 

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80412688

交流QQ: 824203453

欢迎关注B站,收看更多视频内容:https://space.bilibili.com/383891492 

 

spark streaming 2.2  整合 kafka 0.10 后,

当有对同一个rdd的多次filter,再聚合的操作时报错如下:

 

java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
代码如下:
val ssc: StreamingContext = new StreamingContext(conf, Seconds(3))
// Kafka的参数配置
val kafkaParams = Map[String, Object](
  "bootstrap.servers" -> "hdp-02:9092,hdp-03:9092",
  "key.deserializer" -> classOf[StringDeserializer],
  "value.deserializer" -> classOf[StringDeserializer], 
  "group.id" -> "group_hello",
  "auto.offset.reset" -> "earliest"
)

val topics = Array("helloTopic8")
val directStream: InputDStream[ConsumerRecord[String, String]] = KafkaUtils.createDirectStream(ssc,
  LocationStrategies.PreferConsistent,
  ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
)

val maped: DStream[String] = directStream.map(crd => (crd.value())) /*.cache()*/

val rdd = maped.foreachRDD(rdds => {

  // 具体的业务逻辑是否合理不重要,对同一个rdd执行两次操作,然后进行join,这里会报错:
  // Caused by: java.util.ConcurrentModificationException: KafkaConsumer is not safe for multi-threaded access
  val rdd1 = rdds.filter(_.equals("a")).map((_, 1))
  val rdd2 = rdds.filter(_.equals("b")).map((_, 1))
  rdd1.leftOuterJoin(rdd2).foreach(println)
})

报错原因:

这里的两个rdd读取的是同一份数据,当执行action时,都会触发两次数据的读操作,(rdd中的一个分区对应着topic中的一个分区,也就是说kafka中的一个分区的数据这里被读取了2次) 但是,同一个分区的数据只能被一个consumer消费,所以这里报错。

解决方案:一个可行的解决方案是对rdd进行缓存或者checkpoint,然后要能保证,原始的kafka中的数据,只会被消费一次,然后剩下的数据消费都从缓存中获取数据。

    maped.foreachRDD(rdd => {
//      val rdds = rdd.cache()
      val rdds = rdd.persist(StorageLevel.DISK_ONLY)
      val rdd1 = rdds.filter(_.equals("a")).map((_, 1))
      val rdd2 = rdds.filter(_.equals("b")).map((_, 1))
      rdd1.leftOuterJoin(rdd2).foreach(println)
    })
 

关于该问题,在stackoverflow中,有多篇文章,这里贴出来,供大家参考:

https://stackoverflow.com/questions/44530234/kafkaconsumer-is-not-safe-for-multi-threading-access 

https://stackoverflow.com/questions/45115905/concurrent-exception-for-kafkaconsumer-is-not-safe-for-multi-threaded-access 

https://stackoverflow.com/questions/42762020/kafkaconsumer-is-not-safe-for-multi-threaded-access-from-sparkstreaming 

https://stackoverflow.com/questions/41245752/spark2-0-2-java-util-concurrentmodificationexception-kafkaconsumer-is-not-safe 

https://blog.csdn.net/NeverKnowPig/article/details/78460031

 

版权声明:本文为博主原创文章,未经博主允许不得转载!!

欢迎访问:https://blog.csdn.net/qq_21439395/article/details/80412688

交流QQ: 824203453

欢迎关注B站,收看更多视频内容:https://space.bilibili.com/383891492 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值