Kafka实践

 

以下命令示范在kafka版本为0.10.1.0下进行。

* 查看kafka版本

   kafka没有提供version命令,不确定是否有方便的方法,但你可以进入kafka/libs文件夹。你应该看到像kafka_2.11-0.10.1.0.jar这样的文件,其中2.11是Scala版本,0.10.1.0是Kafka版本。

   链文

* 启动

  Kafka使用ZooKeeper,因此如果您还没有ZooKeeper服务器,则需要先启动它。 您可以使用与kafka一起打包的便捷脚本来获得快速且简单的单节点ZooKeeper实例。

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

 or

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

  然后:

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

  or

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

  集群:
  
  zookeeper集群化:  
  ①:  
  在zookeeper.properties中添加相关配置(在各服务器对应的dataDir目录下新建myid,值分别对应server.x)
   server.1=xx.xx.xx.30:2888:3888
   server.2=xx.xx.xx.31:2888:3888
   server.3=xx.xx.xx.32:2888:3888
   
  ②     

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

  kafka集群化:

  ①:   

   cp config/server.properties config/server-1.properties
   cp config/server.properties config/server-2.properties

   
   编辑以下两个文件:
   
   config/server-1.properties:
    broker.id=1
    listeners=PLAINTEXT://:9093
    log.dirs=/tmp/kafka-logs-1
 
   config/server-2.properties:
    broker.id=2
    listeners=PLAINTEXT://:9094
    log.dirs=/tmp/kafka-logs-2
  
  ②:  

  > bin/zookeeper-server-start.sh config/zookeeper.properties
  > bin/kafka-server-start.sh config/server.properties &
  > bin/kafka-server-start.sh config/server-1.properties &   
  > bin/kafka-server-start.sh config/server-2.properties &

  官网   or  其它

* 停止

    bin/kafka-server-stop.sh
    bin/zookeeper-server-stop.sh

* 配置

* kafka0.8版本前后
   0.8 以前,消费进度是直接写到 zookeeper 的,consumer 必须知道 zookeeper 的地址。这个方案有性能问题,0.9 的时候整体大改了一次,brokers 接管了消费进度,consumer 不再需要和 zookeeper 通信了。
   


* zookeeper在kafka的作用

       Apache Kafka的一个关键依赖是Apache Zookeeper,它是一个分布式配置和同步服务。 Zookeeper是Kafka代理和消费者之间的协调接口。 Kafka服务器通过Zookeeper集群共享信息。 Kafka在Zookeeper中存储基本元数据,例如关于主题,代理,消费者偏移(队列读取器)等的信息。
       由于所有关键信息存储在Zookeeper中,并且它通常在其整体上复制此数据,因此Kafka代理/ Zookeeper的故障不会影响Kafka集群的状态。 Kafka将恢复状态,一旦Zookeeper重新启动。 这为Kafka带来了零停机时间。       Kafka代理之间的领导者选举也通过使用Zookeeper在领导者失败的情况下完成。

* Kafka中bootstrap-server、broker-list和zookeeper的区别

  broker-list: 对于console生产者,--broker-list参数指定了所使用的broker;
  zookeeper:对于消费者,对于旧版本kafka的消费者,由--zookeeper参数设置,consumer的信息将会存放在zk之中;
  bootstrap-server:对于消费者,对于新版本kafka的消费者,由--bootstrap-server参数设置,consumer的信息将会存放在kafka之中

kafka工作流程

* 查看现在topic列表

    bin/kafka-topics.sh --list --zookeeper localhost:2181
   (在笔者作用版本下,官网的 bin/kafka-topics.sh --list --bootstrap-server localhost:9092  命令无法正常执行,报: bootstrap-server is not a recognized option,另换为broker-list,同样报:broker-list is not a recognized option)   
    猜测上述原因为构建的集群形式为zookeeper形式,因为按照正常情况下0.8之后的版本用bootstrap-server应该都正常,用zookeeper报上面这个异常才对,真怀疑现在用的kafka实际是0.8版本以下。

* 查看现在consumer group列表,使用--list参数

   bin/kafka-consumer-groups.sh --zookeeper 127.0.0.1:2181 --list

Kafka查看topic、consumer group状态命令

* 查看特定consumer group 详情,使用--group与--describe参数

   bin/kafka-consumer-groups.sh --zookeeper 127.0.0.1:2181 --group console-consumer-708 --describe

   
   GROUP                          TOPIC                          PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             OWNER
   console-consumer-708           bjjs-framework                 0          0               0               0               none

   其中依次展示group名称、消费的topic名称、partition id、consumer group最后一次提交的offset、最后提交的生产消息offset、消费offset与生产offset之间的差值、当前消费topic-partition的group成员id(不一定包含hostname)

   
* 创建topic

  bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic rz_test

  
  注: partitions指定topic分区数,replication-factor指定topic每个分区的副本数

    partitions分区数:
        partitions :分区数,控制topic将分片成多少个log。可以显示指定,如果不指定则会使用broker(server.properties)中的num.partitions配置的数量
        虽然增加分区数可以提供kafka集群的吞吐量、但是过多的分区数或者或是单台服务器上的分区数过多,会增加不可用及延迟的风险。因为多的分区数,意味着需要打开更多的文件句柄、增加点到点的延时、增加客户端的内存消耗。
        分区数也限制了consumer的并行度,即限制了并行consumer消息的线程数不能大于分区数
        分区数也限制了producer发送消息是指定的分区。如创建topic时分区设置为1,producer发送消息时通过自定义的分区方法指定分区为2或以上的数都会出错的;这种情况可以通过alter –partitions 来增加分区数。
        
    replication-factor副本:
        replication factor 控制消息保存在几个broker(服务器)上,一般情况下等于broker的个数。
        如果没有在创建时显示指定或通过API向一个不存在的topic生产消息时会使用broker(server.properties)中的default.replication.factor配置的数量
        
   Kafka Shell基本命令(包括topic的增删改查)
  

* 控制台向topic生产数据

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

* 控制台消费topic的数据

  从最新offset处消费:

  bin/kafka-console-consumer.sh  --zookeeper localhost:2181  --topic rz_test

 从kafka保存数据的最起始地方处消费(默认保留数据7天):

# 此命令根据实际需要增删参数
  bin/kafka-console-consumer.sh  --zookeeper localhost:2181  --topic rz_test --consumer-property group.id=old-consumer-test --consumer-property consumer.id=old-consumer-cl --from-beginning --delete-consumer-offsets

  consumer-property 参数以键值对的形式指定消费者级别的配置.
  from-beginning 设置消息起始位置开始消费。默认是从新位置 latest开始消费.
  delete-consumer-offsets 删除在zookeeper中记录已消费的偏移量.
  
         旧版消费者默认将消费偏移量保存到zookeeper中,可以通过offsets.storage=kafka设置offsets.storage=kafka,则保存到kafka主题中,offsets.storage=zookeeper, 则保存到zookeeper中。

  kafka consumer消费者 offset groupID详解

  kafka消费者基本操作

* 查看topic某分区偏移量最大(小)值

bin/kafka-run-class.sh kafka.tools.GetOffsetShell --topic rz_test --time -1 --broker-list localhost:9092 --partitions 0  

 rz_test:0:8  

 topic为rz_test,分区为0的偏移量最大为8,即消费了8条数据(位置)
  
  注: time为-1时表示最大值,time为-2时表示最小值
  

* 设置consumer group的offset

   确保在这之前停止所有消费者,否则他们可能会这样做覆盖你写的补偿。

 1. 启动zookeeper client

/zookeeper/bin/zkCli.sh

2. 通过下面命令设置consumer group:DynamicRangeGroup topic:DynamicRange partition:0的offset为1288:

set /consumers/DynamicRangeGroup/offsets/DynamicRange/0 1288

3. 注意如果你的kafka设置了zookeeper root,比如为/kafka,那么命令应该改为:

set /kafka/consumers/DynamicRangeGroup/offsets/DynamicRange/0 1288

生效:  重启相关的应用程序,就可以从设置的offset开始读数据了。 

kafka的offset的重置

手动更新Kafka存在Zookeeper中的偏移量。我们有时候需要手动将某个主题的偏移量设置成某个值,这时候我们就需要更新Zookeeper中的数据了。Kafka内置为我们提供了修改偏移量的类:kafka.tools.UpdateOffsetsInZK,我们可以通过它修改Zookeeper中某个主题的偏移量,具体操作如下:

[www@kafka ~]$ ./bin/kafka-run-class.sh kafka.tools.UpdateOffsetsInZK
USAGE: kafka.tools.UpdateOffsetsInZK$ [earliest | latest] consumer.properties topic

在不输入参数的情况下,我们可以得知kafka.tools.UpdateOffsetsInZK类需要输入的参数。
这个工具只能把Zookeeper中偏移量设置成earliest或者latest,如下:

[www@kafka ~]$ ./bin/kafka-run-class.sh kafka.tools.UpdateOffsetsInZK  earliest config/consumer.properties connect-test
     
updating partition 0 with new offset: 8
updated the offset for 1 partitions


* 查看topic消费进度

    

   bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --group testgroup --topic rz_test --zookeeper 127.0.0.1:2181

GROUP     TOPIC      PID                 OFFSET                   LOGSIZE   LAG

消费者组   topic名字  partition id    当前已消费的条数   总条数        未消费的条数 

Kafka常用命令使用说明       


* 查看指定topic信息          

 bin/kafka-topics.sh --zookeeper localhost:2181 --describe --topic rz_test

    Topic:rz_test   PartitionCount:1        ReplicationFactor:1     Configs:
            Topic: rz_test  Partition: 0    Leader: 2       Replicas: 2     Isr: 2
  
    第一行显示partitions的概况,列出了Topic名字,partition总数,存储这些partition的broker数

    以后每一行都是其中一个partition的详细信息:

    leader 

    是该partitons所在的所有broker中担任leader的broker id,每个broker都有可能成为leader

    replicas 

    显示该partiton所有副本所在的broker列表,包括leader,不管该broker是否是存活,不管是否和leader保持了同步。

    isr 

    in-sync replicas的简写,表示存活且副本都已同步的的broker集合,是replicas的子集
    
    Kafka常用命令使用说明    


* 查看指定topic所在group


* 删除topic(慎用)


   ① 删除kafka的topic(只会删除zookeeper中的元数据,消息文件须手动删除)   
      

bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic rz_test1

     如果server.properties中没有把delete.topic.enable设为true,那么此时的删除并不是真正的删除,而是把topic标记为:marked for deletion

   ② 删除kafka中该topic相关的目录
   
     在server.properties中找到配置log.dirs,把该目录下test0相关的目录删掉
     
   ③ 登录zookeeper client。  

 /home/ZooKeeper/bin/zkCli.sh

   ④ 删除zookeeper中该topic相关的目录

    rm -r /kafka/config/topics/test0

    rm -r /kafka/brokers/topics/test0

    rm -r /kafka/admin/delete_topics/test0 (topic被标记为marked for deletion时需要这个命令)

   ⑤重启zookeeper和broker

* 修改topic的partition数量(只能增加不能减少) 

 bin/kafka-topics.sh --alter --zookeeper 127.0.0.1:2181 --partitions 2 --topic rz_test

  
  Kafka常用命令使用说明  


* 修改topic的副本数

    ① 自己写一个文件addReplicas.json,文件的内容是JSON格式的,比如:

    

{
       "version": 1,
       "partitions": [
           {
               "topic": "test0",
               "partition": 0,
               "replicas": [
                    1,2
               ]
           },
           {
               "topic": "test0",
               "partition": 1,
               "replicas": [
                    1,2,3
               ]
           },
           {
               "topic": "test0",
               "partition": 2,
               "replicas": [
                    1,2,3
               ]
           }
        ]
    }

   ② 运行命令:   

bin/kafka-reassign-partitions.sh --zookeeper 127.0.0.1:9092 --reassignment-json-file addReplicas.json --execute

* 下线broker

    比如下线broker0  

 bin/kafka-run-class.sh kafka.admin.ShutdownBroker --zookeeper 127.0.0.1:2181 --broker 0 --num.retries 3 --retry.interval.ms 60
   
 shutdown broker

    
    如果需要迁移,需要其他额外的操作


* 生产消息的模型

  • At most once 消息可能会丢,但绝不会重复传输
  • At least one 消息绝不会丢,但可能会重复传输
  • Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的。 

   Kafka delivery保证(kafka消息投递保证)

   
* 消费消息的几种方式

   最新(lastest)
   开头(earliest or beginning)
   指定offset
   
kafka consumer消费者 offset groupID详解
   


* 生产者生产过程缺失数据、消费者重复消费数据的原因和解决方案

 

Kafka学习之怎么保证不丢,不重复消费数据

Kafka重复消费和丢失数据研究

kafka学习总结(处理多个consumer只消费topic数据一次)

kafka中partition和消费者对应关系


* 需要重启的操作和不需要重启的操作

需要重启: 

1. 配置文件变更内容

不需要重启:

1. 配置文件内容以命令形式变更,但若kafka服务重启则还是按照配置文件中的内容执行(比如:kafka修改日志保留时间参数) 。

2. topic、partition的变更。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值