kafka常用术语、命令及参数

一、常见术语

  • broker:kafka集群包括一个或多个服务器,这种服务器叫做broker。broker接受来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。broker为消费者提供服务,对读取分区的请求作出相应,返回已经提交到磁盘上的信息。
  • topic(主题):每条发布到kafka的消息都有一个类别,这个类别叫做topic。topic就好比数据库的表或者文件系统中的文件夹。一个主题可以分为多个分区,一个分区就是一个提交日志。消息以追加的方式写入分区,然后以先入先出的顺序读取。注意,由于一个主题可以多个分区,因此无法在整个主题范围内保证消息的顺序,但可以保证消息在单个分区内的顺序。其实就是队列存储
  • message(消息):kafka的数据单元。
  • 批次:就是一组消息,这些消息属于同一个主题和分区。为了提高效率,消息被分批次写入kafka。
  • partition(分区):物理上的概念,一个topic通常有多个partition,类似队列。提高读写的并发。
  • offset(偏移量):一种元数据,它是一个不断递增的整数值,在创建消息时,kafka会把它添加到消息里。kafka为每条在分区的消息保存这个offset,这也是消费者在分区的位置。比如一个偏移量为10的消费者,表示它已经消费了0-9偏移量的消息,下一个要消费的消息是偏移量为10的。kafka 0.9版本之前存在zookeeper,0.9之后存在kafka。
  • producer(生产者):消息的生产者,负责发送指定topic的消息到broker。默认情况下把消息均衡地分布到主题的所有分区上。
  • consumer(消费者):消息读取客户端,通过订阅一组topic的消息从broker拉取消息
  • consumer group(消费者群组):消费者是消费者群组的一部分,就是说,会有一个或者多个消费者共同读取一个topic。群组保证每个分区只能被一个消费者使用可以为消费者指定group name,若不指定则属于默认的group。
  • rebalance(重平衡):消费者组内某个消费者实例挂了之后,其它消费者实例自动重新分配订阅主题分区的过程。rebalance是kafka消费端实现高可用的重要手段。

二、启动zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties &

三、启动kafka

bin/kafka-server-start.sh config/server.properties 

四、kafka生产者

 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test_topic

producer参数:

参数值类型说明有效值
--bootstrap-serverString

要连接的服务器(kafka_2.12-2.5.0版本后加入的)

必需(除非指定--broker-list)

形如:host1:prot1,host2:prot2
--topicString(必需)接收消息的主题名称 
--broker-listString(kafka_2.12-2.5.0版本前)要连接的服务器形如:host1:prot1,host2:prot2
--batch-sizeInteger单个批处理中发送的消息数200(默认值)
--compression-codecString压缩编解码器none、gzip(默认值)snappy、lz4、zstd
--max-block-msLong在发送请求期间,生产者将阻止的最长时间60000(默认值)
--max-memory-bytesLong生产者用来缓冲等待发送到服务器的总内存33554432(默认值)
--max-partition-memory-bytesLong为分区分配的缓冲区大小16384
--message-send-max-retriesInteger最大的重试发送次数3
--metadata-expiry-msLong强制更新元数据的时间阈值(ms)300000
--producer-propertyString将自定义属性传递给生成器的机制形如:key=value
--producer.configString

生产者配置属性文件

[--producer-property]优先于此配置

配置文件完整路径
--propertyString自定义消息读取器

parse.key=true|false

key.separator=<key.separator>

ignore.error=true|false

--request-required-acksString生产者请求的确认方式0、1(默认值)、all
--request-timeout-msInteger生产者请求的确认超时时间1500(默认值)
--retry-backoff-msInteger生产者重试前,刷新元数据的等待时间阈值100(默认值)
--socket-buffer-sizeIntegerTCP接收缓冲大小102400(默认值)
--timeoutInteger消息排队异步等待处理的时间阈值1000(默认值)
--sync 同步发送消息 
--version 

显示 Kafka 版本

不配合其他参数时,显示为本地Kafka版本

 
--help 打印帮助信息 

五、kafka消费者

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_topic --from-beginning

consumer参数:

参数值类型说明有效值
--topicstring被消费的topic 
--whiteliststring正则表达式,指定要包含以供使用的主题的白名单 
--partitioninteger指定分区 除非指定’–offset’,否则从分区结束(latest)开始消费 
--offsetstring执行消费的起始offset位置 默认值:latestlatest earliest <offset>
--consumer-propertystring将用户定义的属性以key=value的形式传递给使用者 
--consumer.configstring

消费者配置属性文件

请注意,[consumer-property]优先于此配置

 
--formatterstring

用于格式化kafka消息以供显示的类的名称

默认值:kafka.tools.DefaultMessageFormatter

kafka.tools.DefaultMessageFormatter

kafka.tools.LoggingMessageFormatter

kafka.tools.NoOpMessageFormatter

kafka.tools.ChecksumMessageFormatter

--propertystring初始化消息格式化程序的属性

print.timestamp=true|false

print.key=true|false

print.value=true|false

key.separator=<key.separator>

line.separator=<line.separator>

key.deserializer=<key.deserializer>

value.deserializer=<value.deserializer>

--from-beginning 从存在的最早消息开始,而不是从最新消息开始 
--max-messagesinteger消费的最大数据量,若不指定,则持续消费下去 
--timeout-msinteger在指定时间间隔内没有消息可用时退出 
--skip-message-on-error 如果处理消息时出错,请跳过它而不是暂停 
--bootstrap-serverstring必需(除非使用旧版本的消费者),要连接的服务器 
--key-deserializerstring  
--value-deserializerstring  
--enable-systest-events 除记录消费的消息外,还记录消费者的生命周期 (用于系统测试) 
--isolation-levelstring

设置为read_committed以过滤掉未提交的事务性消息

设置为read_uncommitted以读取所有消息

默认值:read_uncommitted

 
--groupstring指定消费者所属组的ID 
--blackliststring要从消费中排除的主题黑名单 
--csv-reporter-enabled 如果设置,将启用csv metrics报告器 
--delete-consumer-offsets 如果指定,则启动时删除zookeeper中的消费者信息 
--metrics-dirstring输出csv度量值 需与[csv-reporter-enable]配合使用 
--zookeeperstring

必需(仅当使用旧的使用者时)连接zookeeper的字符串。

可以给出多个URL以允许故障转移

 

六、常用命令

1、启动kafka服务
bin/kafka-server-start.sh config/server.properties &

2、停止kafka服务
./kafka-server-stop.sh 

3、查看所有的话题
./kafka-topics.sh --list --zookeeper localhost:2181
./kafka-topics.sh --list --zookeeper localhost:2181/kafka2   #当zk管理多套kafka集群的时候,要指定具体的kafka集群,否则查的就是默认的那个

4、查看所有话题的详细信息
./kafka-topics.sh --zookeeper localhost:2181 --describe

5、列出指定话题的详细信息
./kafka-topics.sh --zookeeper localhost:2181 --describe  --topic demo

6、删除一个话题
./kafka-topics.sh --zookeeper localhost:2181 --delete  --topic test

7、创建一个叫test的话题,有两个分区,每个分区3个副本
./kafka-topics.sh --zookeeper localhost:2181 --create --topic test --replication-factor 3 --partitions 2

8、测试kafka发送和接收消息(启动两个终端)
#发送消息(注意端口号为配置文件里面的端口号)
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
#消费消息(可能端口号与配置文件保持一致,或与发送端口保持一致)
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning   #加了--from-beginning 重头消费所有的消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test         #不加--from-beginning 从最新的一条消息开始消费

9、查看某个topic对应的消息数量
./kafka-run-class.sh  kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic test --time -1

10、显示所有消费者
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

11、获取正在消费的topic(console-consumer-63307)的group的offset
./kafka-consumer-groups.sh --describe --group console-consumer-63307 --bootstrap-server localhost:9092

12、显示消费者
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

参考:https://blog.youkuaiyun.com/qq_29116427/article/details/80206125

https://www.cnblogs.com/liyuanhong/p/12345751.html

 
<think>嗯,用户想了解在Python中如何操作Kafka。首先,我需要回想一下Python中常用Kafka库有哪些。记得有kafka-python这个库,应该是最常用的,还有confluent-kafka,它是基于librdkafka的,性能可能更好。另外,可能还有其他库,比如pykafka,不过好像不太活跃了。 接下来,我应该先介绍这两个主要的库,然后分别说明它们的安装和使用方法。用户可能对生产者和消费者的基本操作感兴趣,比如如何发送消息和接收消息。另外,可能还需要提到一些高级配置,比如异步发送、批量处理、错误处理,以及消费者群组和分区分配之类的。 需要考虑到用户的不同水平,有些可能是刚接触Kafka,所以需要解释一些基本概念,比如broker、topic、partition、producer、consumer这些术语。但用户的问题直接是操作,可能已经有基本了解,所以可以适当简化。 然后,比较一下kafka-python和confluent-kafka的优缺点。比如kafka-python纯Python实现,安装简单,但性能可能不如后者。而confluent-kafka需要C库依赖,安装可能麻烦一些,但性能更好,适合高吞吐量场景。 可能还需要提到版本兼容性,比如Kafka的不同版本可能有不同的API,需要注意库的版本是否支持。另外,如何处理消息的序列化和反序列化,比如使用JSON、Avro等格式,可能需要结合具体的序列化库。 另外,错误处理也是关键部分,比如生产者发送消息时的重试机制,消费者处理消息时的提交偏移量问题,避免重复消费或者丢失消息。还要注意消费者的群组管理,分区再平衡的情况如何处理。 可能还需要给出一些示例代码,比如创建生产者发送消息,创建消费者订阅主题并消费消息。在示例中展示基本的配置参数,比如bootstrap_servers,group_id,auto_offset_reset等。 还要提醒用户注意生产环境中的最佳实践,比如合理配置acks参数,使用异步发送提升吞吐量,消费者如何手动提交偏移量,处理异常情况,比如网络问题或者broker不可用。 可能用户的实际应用场景是什么?如果是数据处理管道,可能需要结合像Apache Spark或者Flink之类的工具,但这里的问题集中在Python操作Kafka,所以保持相关。 总结一下,应该分步骤介绍两个主要库,安装方法,基本生产者和消费者的代码示例,配置选项,错误处理,性能优化建议,以及一些注意事项。确保内容清晰,结构合理,让用户能够快速上手并根据需要选择合适的库。</think>在 Python 中操作 Kafka 主要使用第三方库实现,以下是两个常用库及操作指南: --- ### 一、常用库 1. **kafka-python** - 纯 Python 实现,安装简单,适合轻量级应用。 - 安装命令:`pip install kafka-python` 2. **confluent-kafka** - 基于 C 库 `librdkafka`,性能更高,适合生产环境。 - 安装命令:`pip install confluent-kafka` --- ### 二、基础操作示例 #### 1. 生产者(Producer) **发送消息到 Kafka:** ```python # 使用 kafka-python from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers='localhost:9092', # Kafka 服务器地址 value_serializer=lambda v: str(v).encode('utf-8') # 消息序列化 ) producer.send('test_topic', value='Hello Kafka!') # 发送消息 producer.flush() # 确保消息发送完成 # 使用 confluent-kafka from confluent_kafka import Producer conf = {'bootstrap.servers': 'localhost:9092'} producer = Producer(conf) producer.produce('test_topic', value='Hello Kafka!') producer.flush() ``` #### 2. 消费者(Consumer) **从 Kafka 读取消息:** ```python # 使用 kafka-python from kafka import KafkaConsumer consumer = KafkaConsumer( 'test_topic', bootstrap_servers='localhost:9092', auto_offset_reset='earliest', # 从最早的消息开始读取 group_id='my_group' # 消费者组 ID ) for msg in consumer: print(f"Received: {msg.value.decode('utf-8')}") # 使用 confluent-kafka from confluent_kafka import Consumer conf = { 'bootstrap.servers': 'localhost:9092', 'group.id': 'my_group', 'auto.offset.reset': 'earliest' } consumer = Consumer(conf) consumer.subscribe(['test_topic']) while True: msg = consumer.poll(1.0) # 超时时间 1 秒 if msg is None: continue print(f"Received: {msg.value().decode('utf-8')}") ``` --- ### 三、高级配置与场景 #### 1. 生产者配置 - **异步发送:** 提升吞吐量,但需处理回调。 ```python # confluent-kafka 异步发送示例 def delivery_report(err, msg): if err: print(f'Message failed: {err}') else: print(f'Message delivered to {msg.topic()}') producer.produce('test_topic', value='Async Message', callback=delivery_report) ``` - **批量发送:** 通过 `linger.ms` 和 `batch.size` 参数优化。 #### 2. 消费者配置 - **手动提交偏移量:** 避免消息丢失或重复消费。 ```python # kafka-python 手动提交 consumer = KafkaConsumer(..., enable_auto_commit=False) for msg in consumer: process(msg) consumer.commit() # 手动提交 ``` - **分区分配:** 可指定消费特定分区。 ```python from kafka import TopicPartition consumer.assign([TopicPartition('test_topic', 0)]) ``` --- ### 四、常见问题 1. **消息序列化** 使用 `JSON`、`Avro` 等格式时,需自定义序列化器: ```python import json producer = KafkaProducer(value_serializer=lambda v: json.dumps(v).encode('utf-8')) ``` 2. **错误处理** 捕获 `KafkaTimeoutError`、`KafkaError` 等异常,实现重试逻辑。 3. **性能优化** - 生产者:调整 `acks`(0/1/all)、`compression.type`。 - 消费者:增加 `fetch.max.bytes`、`max.poll.records`。 --- ### 五、适用场景 - **实时流处理**:结合 Spark/Flink 分析数据流。 - **日志收集**:集中处理分布式系统日志。 - **事件驱动架构**:服务间通过消息解耦。 --- 根据需求选择合适的库:`kafka-python` 适合快速开发,`confluent-kafka` 适合高性能生产环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值