从kafka读数据写到ES

http://kafka.apache.org/documentation.html#newconsumerconfigs

kafka是一款基于发布与订阅的消息系统,它一般被称为“分布式提交日志”或者“分布式流平台”。kafka的数据是按照一定顺序持久化保存的,可以按需读取。

 核心概念:

消费者与消费组

Kafka消费者是消费组的一部分,当多个消费者形成一个消费组来消费topic时,每个消费者会收到不同分区的消息。假设有一个topic T1,该topic有4个分区;同时我们有一个消费组G1,这个消费组只有一个消费者C1。那么消费者C1将会收到这4个分区的消息。如果我们增加新的消费者C2到消费组G1,那么每个消费者将会分别收到两个分区的消息,但如果我们继续增加消费者到这个消费组,剩余的消费者将会空闲,不会收到任何消息。所以,我们可以通过增加消费组的消费者来进行水平扩展提升消费能力。这也是为什么建议创建topic时使用较多的分区数,这样可以在消费负载高的情况下增加消费者来提升性能。另外,消费者的数量不应该比分区数多,因为多出来的消费者是空闲的,没有任何帮助。

Kafka一个很重要的特性就是,只需写入一次消息,可以支持任意多的应用读取这个消息。为了使得每个应用都能读到全量消息,应用需要有不同的消费组

当消费者离开消费组(比如重启、宕机等)时,它所消费的分区会分配给其他分区。这种现象称为重平衡(rebalance)。重平衡是Kafka一个很重要的性质,这个性质保证了高可用和水平扩展。不过也需要注意到,在重平衡期间,所有消费者都不能消费消息,因此会造成整个消费组短暂的不可用。而且,将分区进行重平衡也会导致原来的消费者状态过期,从而导致消费者需要重新更新状态,这段期间也会降低消费性能。所以,尽量避免重平衡。

消费者通过定期发送心跳(hearbeat)到一个作为组协调者(group coordinator)的broker来保持在消费组内存活。这个broker不是固定的,每个消费组都可能不同。当消费者拉取消息或者提交时,便会发送心跳。如果消费者超过一定时间没有发送心跳,那么它的会话(session)就会过期,组协调者会认为该消费者已经宕机,然后触发重平衡。从消费者宕机到会话过期是有一定时间的,这段时间内该消费者的分区都不能进行消息消费;通常情况下,我们可以进行关闭,这样消费者会发送离开的消息到组协调者,这样组协调者可以立即进行重平衡而不需要等待会话过期。

在0.10.1版本,Kafka对心跳机制进行了修改,将发送心跳与拉取消息进行分离,这样使得发送心跳的频率不受拉取的频率影响。另外更高版本的Kafka支持配置一个消费者多长时间不拉取消息但仍然保持存活,这个配置可以避免活锁(livelock,指应用没有故障但是由于某些原因不能进一步消费)

注意:消费者对象不是线程安全的,也就是不能够多个线程同时使用一个消费者对象,也不能够一个线程有多个消费者对象,即一个线程一个消费者,如果需要多个消费者那么请用多线程来进行一一对应。

max.poll.records与session.timeout.ms参数问题

例如:consumer.properties配置中max.poll.records=40  (一次最多拉取40条数据)  session.timeout.ms=30000    (会话时间)

假设kafka此时一次拉取了40条数据,但在处理第31条的时候抛出了异常,就会导致本次offset不会提交,完了这40条消息都会在接下来的某刻被再次消费,这其中就包含了其实已经消费了的30条数据;

另一种情况是,如果poll下来数据后,处理这些数据的时间比 session.timeout.ms配置的时间要长,从而导致 rebalanced

所以,session.timeout.ms和小max.poll.records 具体配置为多少,得看你处理一条消息花费多长时间 x,需要满足 x乘以max.poll.records < session.timeout.ms

 

  读取kafka消息只需要创建一个kafka消费者(可以认为一个group是一个“订阅者”):

import com.alibaba.fastjson.JSONObject;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值