学习kafka的内容总结
kafka的基本介绍:
Kafka 是linkedin 公司用于日志处理的分布式消息队列,同时支持离线和在线日志处理。kafka 对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka 集群有多个kafka 实例组成,每个实例(server)称为broker。无论是kafka集群,还是producer和consumer 都依赖于zookeeper 来保证系统可用性,为集群保存一些meta 信息。Kafka 是一种分布式的、分区的、多副本的基于发布/订阅的消息系统。它是通过 zookeeper 进行协调,常见可以用于 web/nginx 日志、访问日志、消息服务等。主要应用场景为:日志收集系统和消息系统。
- 以时间复杂度为 O(1) 的方式提供持久化能力,即使对 TB 级别以上的数据也能保证常数时间的访问性能。
- 高吞吐率,即使在十分廉价的机器上也能实现单机支持每秒 100K 条消息的传输。
- 支持 Kafka Server (即 Kafka 集群的服务器)间的消息分区,及分布式消费,同时保证每个 partition 内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理
kafka中最主要的生产者和消费者:
生产者(Producers)
Producer 将消息发布到指定的Topic中,同时Producer 也能决定将此消息归属于哪个partition;这可以通过简单的循环的方式来实现,或者使用一些分区方法(比如根据消息的key来分区)
消费者(Consumers)
传统的消息传递有两种方式: 队列方式(queuing)、发布-订阅(publish-subscribe)方式.
-
队列方式:一组消费者从机器上读消息,每个消息只传递给这组消费者中的一个。
-
分布-订阅方式:消息被广播到所有的消费者。Kafka提供了一个消费组(consumer group)的说法来概括这两种方式。
from kafka import KafkaConsumer from kafka import TopicPartition from kafka import KafkaProducer #kafka consumer consumer = KafkaConsumer( group_id= 'test', #消费组id auto_offset_reset='earliest', enable_auto_commit = True, # 每过一段时间自动提交所有已消费的消息(在迭代时提交) auto_commit_interval_ms = 1000, # 自动提交的周期(毫秒) max_poll_records=10, # 每次最大消费数量 key_deserializer=bytes.decode, #bytes value_deserializer=bytes.decode, #bytes bootstrap_servers= "node01:9092,node02:9092,node03:9092",#kafka集群地址 ) consumer.assign([ TopicPartition(topic= 'news_tag', partition= 0), TopicPartition(topic= 'news_tag', partition= 1), TopicPartition(topic= 'news_tag', partition= 2), TopicPartition(topic= 'news_tag', partition= 3), TopicPartition(topic= 'news_tag', partition= 4), TopicPartition(topic= 'news_tag', partition= 5), ]) for msg in consumer: recv = "offset=%d Partition=%d key=%s value=%s" % (msg.offset, msg.partition, msg.key, msg.value) print(recv)
利用python来操作kafka:生产者
1 from kafka import KafkaConsumer 2 from kafka import TopicPartition 3 from kafka import KafkaProducer 4 5 # Kafka Producer 6 producer=KafkaProducer( 7 bootstrap_servers="node01:9092,node02:9092,node03:9092", # kafka集群地址 8 key_serializer=str.encode, #str 9 value_serializer=str.encode, #str 10 ) 11 12 parts = int(my_key[0:2]) % 6 13 result_msg = str(result) 14 producer.send('news_tag_label', key=my_key, value=result_msg, partition=parts) 15 print('发送成功')
1、https://www.jianshu.com/p/615ffebf605b
---------------------------本博客所有内容以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,并且是非商业用途,谢谢!---------------------
作者:enhaofrank
出处:https://www.cnblogs.com/enhaofrank/
中科院硕士毕业
现为深漂打工人
posted on 2021-01-15 11:30 enhaofrank 阅读(113) 评论(0) 编辑 收藏 举报