【python】Kafka介绍及confluent-kafka的使用

kafka介绍

kafka是高效的数据流处理平台。可以理解为数据的写入和读取的“中转站”。

相关概念
  • Broker
    一个broker对应一个kafka实例,可以分别在多台服务器上各启动一个broker, 也可在一个服务器上启动多个broker。

  • Topic
    消息的主题,一个broker可有多个topic。

  • Partition
    每个Topic中的信息可以分配在多个Partition中,有利于高效消费和后续的管理和扩展

  • Producer
    生产者,即数据来源

  • Consumer
    数据消费者

  • Consumer Group
    不同的Consumer可以分在相同的group中,在同一个group中,不同的consumer消费同一个Topic的不同partition的信息。这样能保证统一topic的信息不会被重复消费。
    因此consumer数量如果能正好等于partition数量,能高效读取数据,但若consumer数量大于partition数量,会有部分consumer没有被利用起来,因为同一个partition不能被多个consumer消费。

  • Leader和Replication
    对于partition而言,每个partition在不同的broker上都有存储,但会选择某个broker的partition作为Leader, 其余的作为Replication。
    producer写入数据时仅会写入leader中,replication会主动从leader中pull数据进行备份,同理consumer读取数据时也是只从leader中读取。当leader所在broker宕机时,kafka会从replication中选取broker作为新的leader,由此保证数据不丢失和高效读取。

  • Segment
    在一个Parition中会有多个segment,每个segment一般包含这三样东西:index、timeIndex、log。其中index和
    timeIndex用于索引,log中存放数据信息。每segment中有会有一条或多条信息。
    运用分段和索引的方法检索信息能提高数据查询效率。

  • Offset
    用于确定每条信息在partition中的位置。

confluent-kafka的使用

kafka提供了包括C、Java、Python等多种语言接口,在本次使用中我主要进行Consumer端的开发,使用的是python的confluent_kafka库。

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,使用confluent-kafka库,可以通过以下代码修改Kafka消费者组的重平衡策略为StickyAssignor: ```python from confluent_kafka import Consumer, KafkaError from confluent_kafka import TopicPartition from confluent_kafka import Offset from confluent_kafka import ConsumerRebalanceListener class StickyAssignorListener(ConsumerRebalanceListener): def on_partitions_revoked(self, revoked): # 在分区重新分配之前,你可以在这里保存消费者组的偏移量, # 并在分配新分区时重新分配它们 pass def on_partitions_assigned(self, assigned): # 在分区重新分配之后,你可以在这里读取消费者组的偏移量, # 并从上次的偏移量继续消费新分配的分区 pass conf = { 'bootstrap.servers': 'localhost:9092', 'group.id': 'my-group-id', 'enable.auto.commit': False, 'partition.assignment.strategy': 'org.apache.kafka.clients.consumer.StickyAssignor', 'session.timeout.ms': 6000, # 添加重平衡监听器 'on_assign': StickyAssignorListener() } consumer = Consumer(conf) # 手动指定分区和偏移量 consumer.assign([TopicPartition('my-topic', 0, Offset(1234)), TopicPartition('my-topic', 1, Offset(5678)), TopicPartition('my-topic', 2, Offset(9012))]) # 消费消息 while True: msg = consumer.poll(1.0) if msg is None: continue if msg.error(): if msg.error().code() == KafkaError._PARTITION_EOF: print('End of partition reached {0}/{1}' .format(msg.topic(), msg.partition())) else: print('Error: {0}'.format(msg.error())) else: print('Received message: {0}'.format(msg.value())) consumer.commit(msg) consumer.close() ``` 在上面的代码中,我们使用Kafka消费者的`on_assign`配置项,将`StickyAssignorListener`监听器传递给消费者,从而实现了StickyAssignor策略。需要注意的是,我们需要手动指定分区和偏移量,以便在分区重新分配时重新分配它们。 当消费者需要退出时,需要调用`close()`方法关闭消费者,以确保所有未提交的偏移量都已提交: ```python consumer.close() ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值