Spark 从 Kafka 读数并发问题

本文讨论了在Spark Direct方式下从Kafka读数据时遇到的并发问题,提出通过修改`topic.partition.subconcurrency`参数实现分区并行消费的解决方案,但该方案可能导致数据乱序和破坏原有设计。社区不推荐在Spark内部实现,建议用户在处理数据前使用`repartition`或`coalesce`重分区,或在`mapPartitions`中创建多线程。对于数据倾斜问题,需要考虑Kafka分区设置和增加Spark资源。
摘要由CSDN通过智能技术生成

经常使用 Apache Spark 从 Kafka 读数的同学肯定会遇到这样的问题:某些 Spark 分区已经处理完数据了,另一部分分区还在处理数据,从而导致这个批次的作业总消耗时间变长;甚至导致 Spark 作业无法及时消费 Kafka 中的数据。为了简便起见,本文讨论的 Spark Direct 方式读取 Kafka 中的数据,这种情况下 Spark RDD 中分区和 Kafka 分区是一一对应的,更多的细节请参见官方文档,这里就不介绍。

那么有没有办法解决这个问题呢?我们先来看看社区是咋解决这个问题。

SPARK-22056 这个 issue 正好提出了这个问题,并给出了一种解决方案。

640?wx_fmt=png

如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop

也就是修改了 KafkaRDD 类的 getPartitions 方法:
原实现:

override def getPartitions: Array[Partition] = {
   
 offsetRanges.zipWithIndex.map { case (o, i) =>
     val (host, port) = leaders(TopicAndPartition(o.topic, o.partition))
     new KafkaRDDPartition(i, o.topic, o.partition, o.fromOffset, o.untilOffset, host, port)
 }.toArray
}

修改后的实现:

override def getPartitions: Array[Partition] = {
   
 val subconcurrency = if (kafkaParams.contains("topic.partition.subconcurrency"))
   kafkaParams.getOrElse("topic.partition.subconcurrency","1").toInt
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值