一、部署

部署Kafka前需先部署Zookeeper

两台虚拟机(CentOS Linux 7):
    192.168.190.200 master
    192.168.190.201 slave1

所有节点都执行(hadoop用户)
1. 下载 Kafka,安装版本:kafka_2.11-2.2.1.tgz,放于 /opt/ 目录下
2. 解压
    $ cd /opt
    $ tar -zxvf kafka_2.11-2.2.1.tgz
3. 创建日志目录
    $ mkdir /opt/kafka_2.11-2.2.1/logs
4. 修改配置文件 (各节点 broker.id 和 host.name 不同)
    $ cd kafka_2.11-2.2.1/config
    $ vi server.properties
    <修改如下内容:>
    zookeeper.connect=master:2181,slave1:2181/kafka    # 配置ZK连接,设置kafka的zk根路径chroot为:/kafka
    broker.id=0    # 服务器唯一ID    (***根据服务器不同配置 master节点为0;slave1节点为1)
    port=9092    # 服务器提供客户端连接的端口
    host.name=master    # broker的主机名 (***根据不同主机配置 另一个slave1)
    log.dirs=/opt/kafka_2.11-2.2.1/logs    # 日志目录
5. 配置环境变量(root用户执行)
    $ vi /etc/profile
    <文件末尾追加如下内容:>
    export KAFKA_HOME=/opt/kafka_2.11-2.2.1
    export PATH=$PATH:$KAFKA_HOME/bin
    立即生效环境变量
    $ source /etc/profile
6. 启动各节点的kafka (确保ZooKeeper已启动)
    $ kafka-server-start.sh -daemon /opt/kafka_2.11-2.2.1/config/server.properties
    注:-daemon 为隐藏启动日志,否则,屏幕会打印启动日志(可能会卡在界面上)
   可通过jps命令查看:(需配有Java环境才可查看Java相关进程)
    $ jps
    Kafka
    QuorumPeerMain
   停止命令:
    $ kafka-server-stop.sh

7. 启动后测试
  1. 创建一个topic主题:
    $ kafka-topics.sh --topic test --create 
      --partitions 2 --replication-factor 2 
      --zookeeper master:2181,slave1:2181/kafka
    <创建成功后显示:>
    Created topic test.
    注:配置文件中默认的:
            分支数 partitions=1
            冗余数 replication-factor=1
  2. 查看topic信息:
    $ kafka-topics.sh --describe 
      --zookeeper master:2181,slave1:2181/kafka 
      --topic test
    <查询结果如下:>
    Topic:test      PartitionCount:2        ReplicationFactor:2     Configs:
        Topic: test     Partition: 0    Leader: 0       Replicas: 0,1   Isr: 0,1
        Topic: test     Partition: 1    Leader: 1       Replicas: 1,0   Isr: 1,0
    注:可以看到,主题test的分支数两个 0 和 1
        冗余副本Replicas 分别存放在 broker 0 和 1 上

8. 创建一个生产者和消费者,并观察Kafka队列中的数据情况:
  1. 使用Kafka自带脚本启动一个从头开始的生产者,
     会随机生成一个group,然后读入标准输入文本到Kafka中:
   (master节点执行:)
    $ kafka-console-producer.sh 
      --broker-list master:9092 --topic test
    >
  2. 创建一个从头开始消费的消费者:
   (slave1节点执行:)
    $ kafka-console-consumer.sh 
      --bootstrap-server master:9092 --topic test 
      --group tg1 --from-beginning

  3. 在生产者中输入 "Hello Kafka",会在消费者中显示,如下:
    <生产者:>
    $ kafka-console-producer.sh 
      --broker-list master:9092 --topic test
    >Hello Kafka
    >

    <消费者:>
    $ kafka-console-consumer.sh 
      --bootstrap-server master:9092 --topic test 
      --group tg1 --from-beginning
    Hello Kafka

  4. 查看某一主题中某个消费者的offset情况:
     $ kafka-consumer-groups.sh 
      --bootstrap-server master:9092 
      --describe --group tg1
    <注1:--bootstrap-server:引导服务列表,host:port,host:port格式,只用于初始化引导,Server不必全部列出;
     注2:--group:消费者组名称>

    <显示如下信息:输入一条信息后>
    TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST             CLIENT-ID
    test            0          1               1               0               consumer-1-e9ac32fd-2d07-4a92-8663-678dd6cea385 /192.168.190.201 consumer-1
    test            1          1               1               0               consumer-1-e9ac32fd-2d07-4a92-8663-678dd6cea385 /192.168.190.201 consumer-1
        
    <显示如下信息:输入另一条信息后>
    TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                     HOST             CLIENT-ID
    test            0          1               1               0               consumer-1-e9ac32fd-2d07-4a92-8663-678dd6cea385 /192.168.190.201 consumer-1
    test            1          2               2               0               consumer-1-e9ac32fd-2d07-4a92-8663-678dd6cea385 /192.168.190.201 consumer-1

二、Kafka相关概念

1. Kafka是一个提供容错存储、搞实时性,基于发布-订阅的分布式消息系统
  1)分布式流平台(或 分布式提交日志)
    a. 发布-订阅记录流;
    b. 存储记录流,并有容错能力;
    c. 高实时性:可以第一时间处理新产生的记录流
  2)应用于高实时性、高可靠性的流式数据传输中。
2. 消息和批次:
  1)消息:Kafka数据单元,字节数组组成,没有特定格式或含义;
  2)元数据(键):也是字节数组组成,无特殊格式、含义;
     通过键的散列值对主题分区数取模,可为消息分区,保证相同键的消息写入相同分区上;
  3)批次:一组消息,消息按批次写入Kafka,减少消息传输带来的网络开销;
3. 主题和分区:(如下图)
  1)主题:对消息分类,好比数据库的表、文件系统的文件夹;
  2)分区:一个主题分为若干个分区,一个分区就是一个提交日志;
    a. 写入:消息以追加的方式写入分区尾部;
    b. 读取:消息以先入先出的顺序从头读取(队列);
  3)分区可以分布于不同服务器上,也就是一个主题可以横跨多个服务器。
  4)流:一组从生产者移动到消费者的数据,一个主题的数据被看作流。


kafka 如何修改端口 kafka默认端口_服务器

包含多个分区的主题表示


<截图自Kafka权威指南>


4. 生产者和消费者:
  1)Kafka用户(客户端),分为两种基本类型:生产者、消费者。
  2)生产者:创建消息。
    a. 默认情况下,生产者把消息均衡分布到主题的所有分区上,不关心特定消息写到哪个分区;
    b. 特殊情况下,生产者把消息直接写到指定分区上;
         实现:通过分区器(可自定义)为消息键生成散列值,再映射到指定分区上;
         意义:保证了同一个键的消息被写入同一个分区。
  3)消费者:读取消息。
    a. 消费者可订阅一个或多个主题,并按照消息生成的顺序读取;
    b. 偏移量:另一种元数据,是一个不断递增的整数值;
       1. 创建消息时,被添加到消息中;每个分区的每个消息的偏移量都唯一。
       2. 消费者把每个分区最后读取的偏移量保存在ZooKeeper或Kafka中,即使消费者关闭重启,读取状态不会丢失。
    c. 消费者群组:(如下图)
       1. 群组中的一个或多个消费者共同读取一个主题;
       2. 群组保证每个分区只能被一个消费者读取;
       3. 所有权关系:消费者对分区的映射。
       应用场景:
         1. 用过这种方式,消费者可以消费包含大量消息的主题;
         2. 如果一个消费者失效,群组中的其它消费者可以接管失效消费者的工作。


kafka 如何修改端口 kafka默认端口_kafka_02

消费者群组从同一主题读取消息

<截图自Kafka权威指南>


5. broker和集群
  1)borker:一个独立的Kafka服务器
     a. 接收生产者的消息,设置消息偏移量,并提交至磁盘保存;
     b. 为消费者提供服务,响应读取分区的请求,返回磁盘上的消息。
  2)集群:由broker组成
     a. 集群控制器:每个集群都只有一个broker充当,自动从集群的活跃成员中选举产生;
         负责管理工作,将分区分配给broker和监控broker;
     b. 分区首领:分区从属的broker;
     c. 分区复制:一个分区可以分配给多个broker;
         1. 实现了消息冗余;
         2. 当某个broker失效时,其它broker可以接管领导权,
            相关的消费-生产者需要重连到新的首领。
     d.保留消息策略:
         1. 上限1(时间):Kafka默认保留消息一段时间(如:7天)
         2. 上限2(大小):或者保留到消息达到一定大小的字节数(如:1GB)
         3. 当消息达到其中之一时,旧消息会被删除。
         4. 主题可以自定义配置保留策略,当作 紧凑型日志。


kafka 如何修改端口 kafka默认端口_kafka_03

集群里的分区复制(消息冗余)


<截图自Kafka权威指南>


   

6. 大数据生态系统,利用Kafka解耦生产者与消费者系统(如下图)


kafka 如何修改端口 kafka默认端口_kafka 如何修改端口_04

大数据生态系统

 

三、参考文章:

1. 《Spark Streaming 实时流式大数据处理实战》5.2 Kafka简介