1. 背景
我們知道Kafka提供一套非常完善的Metrics資料,覆寫Broker,Consumer,Producer,Stream以及Connect。E-MapReduce通過Ganglia收集了Kafka Broker metrics資訊,可以很好地監控Broker運作狀态。但完整的Kafka應用包括Kafka Broker和Kafka 用戶端這兩個角色,當發生讀寫性能問題時,常常從Broker角度難以發現問題,需要結合用戶端的運作狀況來聯合分析才行。那麼Kafka用戶端metrics就是一類非常重要的資料。E-MapReduce是如何進行Kafka用戶端metrics采集的呢?
(歡迎關注E-MapReduce開源項目:
https://github.com/aliyun/aliyun-emapreduce-sdk)
2. 實作
2.1 如何采集metrics
Kafka提供了Metrics Reporter的插件擴充功能,預設提供了JmxReporter實作,也即我們已經可以通過JMX工具來檢視Kafka的Metrics。是以,我們可以自己實作一套Metrics Reporter(實作org.apache.kafka.common.metrics.MetricsReporter),來自定義擷取這些Metrics。
2.3 如何存放metrics
以上我們可以實作自定義的采集Kafka Metrics,還需要選擇一個存儲系統将這些metrics存儲起來,以便後續的使用和分析。考慮到Kafka自身就是一種存儲系統,我們可以将Metrics存儲到Kafka中,這有幾種優勢:
- 無需第三方存儲系統支援
- 資料很友善地接入到其他系統中
是以,完整的用戶端metrics采集方案如下圖:

E-MapReduce提供了一個開源實作emr-kafka-client-metrics,源碼
位址。
3. 測試
我們無需自己編譯,E-MapReduce已經向Maven釋出了Jar包,直接下載下傳最新版本即可,
3.1 配置
配置項 | 說明 |
---|---|
metric.reporters | 使用emr的實作:org.apache.kafka.clients.reporter.EMRClientMetricsReporter |
emr.metrics.reporter.bootstrap.servers | metrics存儲Kafka叢集的bootstrap.servers |
emr.metrics.reporter.zookeeper.connect | metrics存儲Kafka叢集的Zookeeper位址 |
3.2 如何加載
有兩種方式:
- 将emr-kafka-client-metrics的jar包放在機器上,用戶端程式的Classpath可以加載到即可
- 直接将emr-kafka-client-metrics依賴打進用戶端程式jar包中
3.3 使用教程
本次測試将在E-MapReduce Kafka叢集上進行示範。
- 下載下傳最新版本emr-kafka-client-metrics包
wget http://central.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包放到Kafka的lib中
cp emr-kafka-client-metrics-1.4.3.jar /usr/lib/kafka-current/libs/
- 建立一個測試Topic
kafka-topics.sh --zookeeper emr-header-1:2181/kafka-1.0.1--partitions 10
--replication-factor 2 --topic test-metrics --create
- 向測試topic寫入資料,這裡我們将producer的配置項配置到本地檔案client.conf中。
## client.conf:
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
## 指令:
kafka-producer-perf-test.sh --topic test-metrics --throughput 1000 --num-records 100000
--record-size 1024 --producer.config client.conf
- 檢視這次用戶端的metrics,注意預設的metrics topic是_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.xxx.xxx, [email protected],
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采集的時間錯 |
tag.xxx | metric其他tag資訊 |
4. 一些限制
- 隻支援Java類用戶端程式
- 隻支援0.10之後版本Kafka用戶端