kafka 生产/消费API、offset管理/原理、kafka命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zimiao552147572/article/details/89553787

大数据组件使用 总文章

创建topic
kafka-topics --create --zookeeper node1:2181 --replication-factor 3 --partitions 3 --topic test

展示topic
kafka-topics --list --zookeeper node1:2181
 
描述topic
kafka-topics --describe --zookeeper node1:2181 --topic test

生产者:
kafka-console-producer --broker-list node1:9092 --topic test
 
修改topic的分区数
kafka-topics --zookeeper node1:2181 --alter --partitions 3 --topic test

消费者:
旧版:kafka-console-consumer --zookeeper node1:2181 --topic test --from-beginning

新版:新版中仍然使用旧版的消费者命令会报错:zookeeper is not a recognized option
        kafka-console-consumer --bootstrap-server node1:9092 --topic test --from-beginning
        指定消费者组:kafka-console-consumer --bootstrap-server node1:9092 --group testGroup --topic test --from-beginning

删除topic
kafka-topics --delete --zookeeper node1:2181 --topic test

查看消费位置
指定消费者组:
    kafka-consumer-groups --bootstrap-server node1:9092 --describe --group testGroup 
    kafka-consumer-groups --bootstrap-server node1:9092 --describe --group testGroup --all-topics
 

=============================================
创建topic
kafka-topics --create --zookeeper 10.0.0.181:2181 --replication-factor 3 --partitions 3 --topic test

展示topic
kafka-topics --list --zookeeper 10.0.0.181:2181

生产者:
kafka-console-producer --broker-list 10.0.0.181:9092 --topic test

消费者:
旧版:kafka-console-consumer --zookeeper 10.0.0.181:2181 --topic test --from-beginning
新版:kafka-console-consumer --bootstrap-server 10.0.0.181:9092 --topic test --from-beginning

删除topic
kafka-topics --delete --zookeeper 10.0.0.181:2181 --topic test

==============================================

创建topic:同时指定key,那么生产数据时必须同时输入key和value

创建一个向主题 kafka-action 发送消息的生产者,同时指定每条消息包含有key
kafka-console-producer --broker-list 10.0.0.181:9092 --topic test --property parse.key=true


由于以上命令没有指定消息key与消息载荷值value(payload)之间的分隔符,默认为制表符,如果希望修改分隔符,可通过key.separator指定。
kafka-console-producer --broker-list 10.0.0.181:9092 --topic test --property parse.key=true --property key.separator=' '

数据分发策略:
    如果生产者指定了partition,同时发送消息中有key,可以指定数据发往哪个partition,当ProducerRecord 的构造参数中有partition的时候,就可以发送到对应partition上,
    如new ProducerRecord<String, String>("topic主题名",partition,"key", "value")
    如果生产者没有指定partition,但是发送消息中有key,那么将根据key的hash值的方式发送数据到那个partition分区/分片中

==============================================

kafka 0.9 及以上 有了一个大版本变化,
主要有以下几个方面:
  1.kafka-client 不再区分高低api
  2.kafka 消费者偏移量信息 不再单纯的存储在 zookeeper 中, kafka 会自己维护自己的 消费情况。
    对于某些特殊的情况:如 kafka-console-consumer,目前在 0.10.0.1 还是会存储在 zookeeper 中。

我们先启动消费者,再启动生产者, 再通过 bin/kafka-consumer-groups.sh 进行消费偏移量查询,
注意:
    在执行脚本查询的时候,对于新的 kafka 自维护的 偏移量的  消费者来说, 消费者 同时运行 是必须的。
    否则会出现 group.id 指定 的 group 查找不到的错误 !!!!
由于kafka 消费者记录 group 的消费 偏移量 有两种方式 :
    1)kafka 自维护 (新)
    2)zookpeer 维护  (旧)  ,已经逐渐被废弃
所以 ,脚本查看  消费偏移量的方式有两种   kafka自维护  / zookeeper维护
 

kafka 维护 消费偏移量的 情况:
    1. 查看有那些 group ID 正在进行消费: 
        kafka-consumer-groups --bootstrap-server node1:9092 --list
        注意:
            这里面是没有指定 topic 的,所以查看的所有的 topic 的 消费者 的 group.id  的列表。
            注意: 重名的 group.id 只会显示一次 
            
    2.查看指定group.id 的消费者消费情况 
        kafka-consumer-groups --bootstrap-server node1:9092 --group testGroup --describe    

        
zookeeper 维护  消费偏移量的 情况:(kafka 0.9及以后的版本的kafka-consumer-groups命令后面已不带有--zookeeper的参数)
    1. 查看有那些 group ID 正在进行消费:
            kafka-consumer-groups --zookeeper node1:2181 --list
    2.查看指定group.id 的消费者消费情况 
            kafka-consumer-groups --zookeeper node1:2181 --group testGroup --describe
            
            
=====================================================================================
zookeeper 的shell 命令窗口
    执行 zookeeper-client 命令
        ls /consumers/testGroup/offsets/test
        get /consumers/testGroup/offsets/test/0
        get /consumers/testGroup/offsets/test/1
        get /consumers/testGroup/offsets/test/2
=====================================================================================

        1.kafka消费者在会保存其消费的进度,也就是offset,存储的位置根据选用的kafka api不同而不同。
        2.使用 zookeeper.connect 代表 使用kafka-0.10.1.X版本之前的消费者API
                    auto.offset.reset 的值为 smallest(最小值) 和 largest(最大值) (offest保存在zk中)
                    根据javaapi来消费,也就是【kafka.javaapi.consumer.ConsumerConnector、kafka.javaapi.consumer.SimpleConsumer】,我们会配置参数【zookeeper.connect】来消费
                    消费者的offset会更新到zookeeper的【consumers/{group}/offsets/{topic}/{partition}】目录下。消费者API会把offset保存在 /consumers/groupID/offsets/topic/分区号 中。
                    ls /consumers/testGroup1/offsets/test:得 分区号 [0, 1, 2]
                    get /consumers/testGroup1/offsets/test/分区号:得 分区中的 offsets偏移量
                                [zk: localhost(CONNECTED) 0] get /kafka/consumers/zoo-consumer-group/offsets/my-topic/0
                                5662
                                cZxid = 0x20006d28a
                                ctime = Wed Apr 12 18:20:51 CST 2017
                                mZxid = 0x30132b0ed
                                mtime = Tue Aug 22 18:53:22 CST 2017
                                pZxid = 0x20006d28a
                                cversion = 0
                                dataVersion = 5758
                                aclVersion = 0
                                ephemeralOwner = 0x0
                                dataLength = 4
                                numChildren = 0


            3.如果是根据kafka默认的api来消费,即【org.apache.kafka.clients.consumer.KafkaConsumer】,我们会配置参数【bootstrap.servers】来消费。
              而其消费者的offset会更新到一个kafka自带的topic【__consumer_offsets】下面,查看当前group的消费进度,则要依靠kafka自带的工具【kafka-consumer-offset-checker】
                    kafka 0.8版本以前:kafka-consumer-offset-checker --zookeeper node1:2181/kafka --group testGroup  --topic test --broker-info
                    kafka 0.8版本以后:kafka-consumer-groups --bootstrap-server node1:9092 --group testGroup --describe    
                            Group           Topic                          Pid Offset          logSize         Lag             Owner
                            test-consumer-group stable-test                    0   601808          601808          0               none
                            test-consumer-group stable-test                    1   602826          602828          2               none
                            test-consumer-group stable-test                    2   602136          602136          0               none

              4.Group : 消费者组
                Topic : topic的名字
                Pid : partition的ID
                Offset : kafka消费者在对应分区上已经消费的消息数【位置】
                logSize : 已经写到该分区的消息数【位置】
                Lag : 还有多少消息未读取(Lag = logSize - Offset)
                Owner : 分区创建在哪个broker

            5.offset更新的方式,不区分是用的哪种api,大致分为两类:
                    1.自动提交,设置enable.auto.commit=true,更新的频率根据参数【auto.commit.interval.ms】来定。这种方式也被称为【at most once】,
                                fetch到消息后就可以更新offset,无论是否消费成功。
                    2.手动提交,设置enable.auto.commit=false,这种方式称为【at least once】。fetch到消息后,等消费完成再调用方法【consumer.commitSync()】,
                                手动更新offset;如果消费失败,则offset也不会更新,此条消息会被重复消费一次。
 

猜你喜欢

转载自blog.csdn.net/zimiao552147572/article/details/89553787