环境信息 使用的 hadoop 完全分布式集群
1 2 3 192.168.2.241 hadoop01 192.168.2.242 hadoop02 192.168.2.243 hadoop03
kafka 监控 主要有 Kafka Manager、Kafka Eagle。 当前使用 Kafka Eagle
官网 https://www.kafka-eagle.org/
hadoopclient 安装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 wget https://github.com/smartloli/kafka-eagle-bin/archive/v2.1.0.tar.gz mkdir -p /opt/bigdata/kafka-eagle tar -zxf v2.1.0.tar.gz cd kafka-eagle-bin-2.1.0 tar zxf efak-web-2.1.0-bin.tar.gz -C /opt/bigdata/kafka-eagle cd /opt/bigdata/kafka-eagle ln -s efak-web-2.1.0 current chown -R kafka:kafka /opt/bigdata/kafka-eagle # 定界符一定要加引号写成 <<'eof'。不加的话 $PATH 和 $KE_HOME 会在**写文件的那一刻**就被展开, # 而 KE_HOME 此时还没定义,落进文件的就成了 export PATH=<写入时的PATH快照>:/bin —— # $KE_HOME/bin 从来没进过 PATH,ke.sh 自然找不到,PATH 还被硬编码成了快照。 cat >/etc/profile.d/kafka_env.sh<<'eof' export KE_HOME=/opt/bigdata/kafka-eagle/current/ export PATH=$PATH:$KE_HOME/bin export JAVA_HOME=/opt/bigdata/java/current eof source /etc/profile
配置数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 mysql> create database ke character set utf8mb4; Query OK, 1 row affected (0.00 sec) mysql> create user 'root'@'192.168.2.86' identified by 'kafkapass'; Query OK, 0 rows affected (0.00 sec) mysql> grant all privileges on ke.* to 'root'@'192.168.2.86'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) mysql>
修改配置文件 /opt/bigdata/kafka-eagle/current/conf/system-config.properties
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 efak.zk.cluster.alias=cluster1,cluster2 cluster1.zk.list=192.168.2.241:2181,192.168.2.242:2181,192.168.2.243:2181 cluster2.zk.list=192.168.2.171:2181,192.168.2.173:2181,192.168.2.174:2181 kafka.zk.limit.size=25 efak.webui.port=8048 cluster1.kafka.efak.offset.storage=kafka cluster2.kafka.efak.offset.storage=kafka efak.metrics.charts=true efak.metrics.retain=15 efak.sql.topic.records.max=5000 efak.sql.fix.error=true efak.topic.token=keadmin efak.driver=com.mysql.jdbc.Driver efak.url=jdbc:mysql://192.168.2.86:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull efak.username=root efak.password=kafkapass
修改 kafka 的启动脚本 /opt/bigdata/kafka/current/bin/kafka-server-start.sh
1 2 3 4 5 6 7 if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" fi # JMX_PORT 要放在 if...fi 外面。放在分支里的话,凡是预设过 KAFKA_HEAP_OPTS 的环境 # (生产上很常见)都进不了这个分支,JMX 静默不开,EFAK 的趋势图会一直是空的。 export JMX_PORT=${JMX_PORT:-9999} # 开启了监控趋势图 efak.metrics.charts=true 就需要它
这一步有两个容易漏的地方,都会表现成”趋势图一片空白”,而且 EFAK 界面上不给任何报错。
一、JMX 是集群级需求,每台 broker 都要开。 EFAK 采集的是 broker 级别的指标(BytesInPerSec、MessagesInPerSec 这些都在各自的 broker 上),只在一台机器上改 kafka-server-start.sh 的话,趋势图里就只有那一台的数据,聚合出来的数字长期偏低。三节点要逐台改、逐台滚动重启 (等前一台 ISR 追平再动下一台,别一起重启)。
二、多网卡或跨网段时还要指定 RMI 主机名。 JMX 基于 RMI,服务端在握手时会把”自己的地址”回给客户端,而这个地址默认取自主机名解析结果——如果解析到内网地址、127.0.0.1 或者 docker 网桥地址,EFAK 拿到之后就连不上了,表现为端口明明通、采集却失败:
1 2 3 4 5 export JMX_PORT=${JMX_PORT:-9999} export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname=192.168.2.86"
排查手段:在 EFAK 所在机器上直接连一下,能列出 MBean 才算通。
1 2 3 4 telnet <broker-ip> 9999 jconsole <broker-ip>:9999
重启 kafka
1 2 3 4 cd /opt/bigdata/kafka/current/bin/ bash kafka-server-stop.sh # 确认关闭后,执行启动 # 已经在 bin/ 里了,别再写 bin/... 和 config/...,那两个相对路径都不存在 nohup ./kafka-server-start.sh ../config/server.properties &
启动 Kafka Eagle
1 2 cd /opt/bigdata/kafka-eagle/current ./bin/ke.sh start
验证