本文介绍如何通过E-MapReduce,从Kafka客户端采集Metrics数据,从而有效地进行性能监控。

前提条件

已创建Kafka集群,详情请参见创建集群
说明 本文以EMR-3.21.3版本为例介绍。

背景信息

Kafka提供了一套非常完善的Metrics数据,覆盖Broker、Consumer、Producer、Stream以及Connect 。E-MapReduce通过Ganglia收集了Kafka Broker Metrics信息,可以监控Broker运行状态。Kafka应用包括Kafka Broker和Kafka客户端这两个角色,当出现读写性能问题时,仅从Broker角度难以分析,因此可以结合客户端的运行状况联合分析。

本文实现原理如下:
  • 收集Metrics

    因为Metrics默认提供了包含JmxReporter的Metrics Reporter插件扩展功能,即可以通过JMX工具来查看Kafka的Metrics ,所以可以使用Metrics Reporter(实现org.apache.kafka.common.metrics.MetricsReporter)来自定义收集Metrics。

  • 存放Metrics
    因为Kafka是一种存储系统,所以可以将Metrics存储至Kafka中。优势如下:
    • 无需第三方存储系统。
    • 数据可以接入到其他系统中。
完整的客户Metrics采集方案如下图所示。Metrics

操作步骤

  1. 通过SSH方式登录集群。
    详情请参见使用SSH连接主节点
  2. 执行如下命令,下载emr-kafka-client-metrics包。
    wget https://repo1.maven.org/maven2/com/aliyun/emr/emr-kafka-client-metrics/1.4.3/emr-kafka-client-metrics-1.4.3.jar

    本文以emr-kafka-client-metrics-1.4.3.jar为例介绍。

  3. 执行如下命令,复制JAR包至/usr/lib/kafka-current/libs/目录。
    cp emr-kafka-client-metrics-1.4.3.jar /usr/lib/kafka-current/libs/
  4. 执行如下命令,创建一个测试Topic。
    kafka-topics.sh --zookeeper emr-header-1:2181 --partitions 10 --replication-factor 2 --topic test-metrics  --create
  5. 配置Producer的配置项至client.conf文件中。
    1. 新建client.conf文件。
      vim client.conf
    2. 新增如下内容。
      metric.reporters=org.apache.kafka.clients.reporter.EMRClientMetricsReporter
      emr.metrics.reporter.bootstrap.servers=emr-worker-1:9092
      emr.metrics.reporter.zookeeper.connect=emr-header-1:2181/kafka-1.0.1
      bootstrap.servers=emr-worker-1:9092
    3. 执行如下命令,发送测试数据。
      kafka-producer-perf-test.sh --topic test-metrics --throughput 1000 --num-records 100000 --record-size 1024 --producer.config client.conf
  6. 执行如下命令以消费Metrics默认的_emr-client-metrics
    kafka-console-consumer.sh --topic _emr-client-metrics --bootstrap-server emr-worker-1:9092 --from-beginning
    返回信息如下所示:
    {prefix=kafka.producer, client.ip=192.168.***.***, client.process=25536@emr-header-1.cluster-***, 
    attribute=request-rate, value=894.4685104965012, timestamp=1533805225045, group=producer-metrics, 
    tag.client-id=producer-1}
    参数说明如下:
    参数 描述
    client.ip 客户端所在服务器的IP地址。
    client.process 客户端程序进程ID。
    attribute Metric属性名。
    value Metric值。
    timestamp Metric采集的时间戳。
    group Metric所属的组。
    tag.client-id 客户端所在服务器的ID。