
# Kafka客户端使用实践
#### 操作场景
该任务指导用户在运维场景或业务场景中使用Kafka客户端。
本章节适用于MRS 3.x及后续版本。
#### 前提条件
- 已安装集群客户端，例如安装目录为"/opt/client"。
- 各组件业务用户由MRS集群管理员根据业务需要创建。"机机"用户需要下载keytab文件，"人机"用户第一次登录时需修改密码。（普通模式不涉及）
- 在修改集群域名后，需要重新下载客户端，以保证客户端配置文件中kerberos.domain.name配置为正确的服务端域名。
 
#### 使用Kafka客户端
1. 以客户端安装用户，登录安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录。 
   **cd /opt/client**
   
   
3. 执行以下命令配置环境变量。 
   **source bigdata_env**
   
   
4. 执行以下命令，进行用户认证。（普通模式跳过此步骤） 
   **kinit** *组件业务用户*
   
   
5. 执行以下命令切换到Kafka客户端安装目录。 
   **cd Kafka/kafka/bin**
   
   
6. 执行以下命令使用客户端工具查看帮助并使用。 
   - **./kafka-console-consumer.sh**：Kafka消息读取工具
   
   - **./kafka-console-producer.sh**：Kafka消息发布工具
   
   - **./kafka-topics.sh**：Kafka Topic管理工具
   
   
   
   
7. MRS 3.x之前版本：执行以下命令，管理Kafka主题。 
   - 创建主题 **sh kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份个数* **--zookeeper** ***ZooKeeper** 角色实例所在节点IP地址**:clientPort*** **/kafka**
     
   
   - 删除主题 **sh kafka-topics.sh --delete --topic** *主题名称* **--zookeeper** *ZooKeeper角色实例所在节点IP地址* **:** ***clientPort*** **/kafka**
     
   
   
   ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
   - 主题分区数和主题备份个数不能大于Kafka角色实例数量。
   
   - 默认情况下，ZooKeeper的"clientPort"为"2181"。
   
   - ZooKeeper角色实例所在节点IP地址，填写三个角色实例其中任意一个的IP地址即可。
    
   
   
8. MRS 3.x及后续版本：使用**kafka-topics.sh** 管理Kafka主题。
   
   - 创建主题： Topic的Partition自动划分时，默认根据节点及磁盘上已有的Partition数进行均衡划分，如果期望根据磁盘容量进行Partition划分，那么需要修改Kafka服务配置"log.partition.strategy"为"capacity"。
     Kafka创建Topic时，支持基于"机架感知" 和 "跨AZ特性" 两种选项组合生成分区及副本的分配方案且支持 "--zookeeper" 和 "--bootstrap-server"两种方式
     - 禁用机架策略 \& 禁用跨AZ特性 (默认策略)。 基于此策略新建的Topic的副本会**完**全随机分配到集群中任意节点上。
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--zookeeper** *ZooKeeper的任意一个节点的业务IP:clientPort* **/kafka**
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--** **bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties**
       其中，使用"--bootstrap-server"方式创建Topic时，需配置"rack.aware.enable=false"和"az.aware.enable=false"。
       
     
     - 启用机架策略 \& 禁用跨AZ特性。 基于此策略新建的Topic的各个Partition的Leader会在集群节点上随机分配，但会确保同一Partition的不同Replica会分配在不同的机架上，所以当使用此策略时，需保证各个机架内的节点个数一致，否则会导致节点少的机架上的机器负载远高于集群平均水平。
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--zookeeper** *ZooKeeper*的任意一个节点的业务*IP:clientPort* **/kafka --enable-rack-aware**
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--** **bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties**
       其中，使用 "--bootstrap-server"方式创建Topic时，需配置"rack.aware.enable=true"和"az.aware.enable=false"。
       
     
     - 禁用机架策略 \& 启用跨AZ特性。 基于此策略新建的Topic的各个Partition的Leader会在集群节点上随机分配，但会确保同一Partition的不同Replica会分配在不同的AZ上，所以当使用此策略时，需保证各个AZ内的节点个数一致，否则会导致节点少的AZ上的机器负载远高于集群平均水平。
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--zookeeper** *ZooKeeper*的任意一个节点的业务*IP:clientPort* **/kafka --enable-az-aware**
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--** **bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties**
       其中，使用 "--bootstrap-server"方式创建Topic时，需配置"rack.aware.enable=false"和"az.aware.enable=true"。
       
     
     - 启用机架策略 \& 启用跨AZ特性。 基于此策略新建的Topic的各个Partition的Leader会在集群节点上随机分配，但会确保同一Partition的不同Replica会分配到不同AZ内的不同RACK上，使用此策略需保证每个AZ内的每个RACK上的节点个数一致，否则会导致集群内负载不均衡。
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--zookeeper** *ZooKeeper的任意一个节点的业务IP* *:clientPort* **/kafka --enable-rack-aware --enable-az-aware**
       **./kafka-topics.sh --create --topic** *主题名称* **--partitions** *主题占用的分区数* **--replication-factor** *主题的备份数* **--** **bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties**
       使用 "--bootstrap-server"方式创建Topic时，需配置"rack.aware.enable=true"和"az.aware.enable=true"。
       
     
     
     ![](https://support.huaweicloud.com/cmpntguide-mrs/public_sys-resources/note_3.0-zh-cn.png)
     - Kafka创建Topic支持 "--zookeeper" 和 "--bootstrap-server"两种方式，区别如下：
       - "--zookeeper"方式由客户端生成副本分配方案，社区从一开始就支持这种方式，为了降低对Zookeeper组件的依赖，社区将在后续版本中删除对这种方式的支持。基于这种方式创建Topic时，可以通过 "--enable-rack-aware" 和 "--enable-az-aware"这两个选项自由组合来选用副本分配策略。注意：使用"--enable-az-aware"选项的前提是服务端开启了跨AZ特性，即服务端启动参数"az.aware.enable"为"true",否则会执行失败。
       
       - "--bootstrap-server"方式由服务端生成副本分配方案，后续版本，社区将只支持这种方式来进行Topic管理。基于这种方式创建Topic时，不支持 "--enable-rack-aware" 和 "--enable-az-aware"选项来控制副本分配策略，支持 "rack.aware.enable"和"az.aware.enable"这两个服务启动参数组合来控制副本分配策略，需注意的是"az.aware.enable"参数不可修改，在创建集群时，如果开启跨AZ特性，会自动配置为"true";"rack.aware.enable"参数支持用户自定义修改。
        
       
   
   - 罗列主题：
     - **./kafka-topics.sh --list --zookeeper** *ZooKeeper* **的任意一个节点的业务*IP:clientPort* **/kafka**
     
     - **./kafka-topics.sh --list --bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties**
      
   
   - 查看主题：
     - **./kafka-topics.sh --describe --zookeeper** *ZooKeeper* **的任意一个节点的业务*IP:clientPort* **/kafka** --**topic** *主题名称*
     
     - **./kafka-topics.sh --describe --bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties** **--topic** *主题名称*
      
   
   - 修改主题：
     - **./kafka-topics.sh --alter --topic** *主题名称* **--config** *配置项=* *配置值* **--zookeeper** *ZooKeeper* ***的任意一个节点的业务**IP:clientPort* **/kafka**
      
   
   - 扩展分区：
     - **./kafka-topics.sh --alter --topic** *主题名称* **--zookeeper** *ZooKeeper的任意一个节点的业务IP:clientPort* **/kafka --command-config Kafka/kafka/config/client.properties --partitions** *扩展后分区个数*
     
     - **./kafka-topics.sh --alter --topic** *主题名称* **--bootstrap-server** *Kafka集群IP* *:21007* **--command-config Kafka/kafka/config/client.properties --partitions** *扩展后分区个数*
      
   
   - 删除主题：
     - **./kafka-topics.sh --delete --topic** *主题名称* **--zookeeper** *ZooKeeper* ***的任意一个节点的业务**IP:clientPort* **/kafka**
     
     - **./kafka-topics.sh --delete --topic** *主题名称* **--bootstrap-server** *Kafka* *集群IP:21007* **--command-config ../config/client.properties**
      
   
   
   
   
 
