bigdata监控

环境信息

使用的 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 级别的指标(BytesInPerSecMessagesInPerSec 这些都在各自的 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 可达的那个 IP

排查手段:在 EFAK 所在机器上直接连一下,能列出 MBean 才算通。

1
2
3
4
# 端口通不通
telnet <broker-ip> 9999
# 真的能取到指标吗
jconsole <broker-ip>:9999 # 或用 jmxterm 之类的命令行工具

重启 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

验证

EFAK测试