如何使用JMX_Expoter+Prometheus+Grafana监控Hadoop集群
- JMX_Expoter
- 監(jiān)控
因?yàn)槟壳癈DH以及HDP后續(xù)要合并閉源,公司打算花時(shí)間自研一個(gè)類(lèi)似的平臺(tái),我也對(duì)集群監(jiān)控這塊下了點(diǎn)功夫。
監(jiān)控
? 對(duì)于一個(gè)集群管理平臺(tái),首當(dāng)其沖的就是其中的監(jiān)控如何實(shí)現(xiàn),畢竟很多時(shí)候我們打開(kāi)它只是因?yàn)猷]箱里收到了報(bào)警:-),那么我們應(yīng)該如何獲取Hadoop等集群的信息呢?這時(shí)候需要簡(jiǎn)單了解一個(gè)知識(shí)點(diǎn)了:JMX。
? 我們簡(jiǎn)單介紹一下Java的JMX是什么,JMX全程叫做Java Management Extensions,翻譯過(guò)來(lái)就是Java內(nèi)存管理,最常用到的就是對(duì)于 JVM 的監(jiān)測(cè)和管理,比如 JVM 內(nèi)存、CPU 使用率、線程數(shù)、垃圾收集情況等等。另外,還可以用作日志級(jí)別的動(dòng)態(tài)修改,比如 log4j 就支持 JMX 方式動(dòng)態(tài)修改線上服務(wù)的日志級(jí)別。
總而言之,就是Java自己開(kāi)發(fā)的用于監(jiān)控JVM指標(biāo)的一個(gè)工具,可以提供給一些界面JConsole,VisualVM使用,詳細(xì)信息可以參考這里!
獲取集群的JMX信息
? Hadoop,Hbase集群都提供了便捷獲取集群JMX信息的途徑,具體通過(guò)在訪問(wèn)地址后面加上/jmx來(lái)實(shí)現(xiàn),比如我們?cè)L問(wèn)hdfs的NameNode頁(yè)面的時(shí)候地址是localhost:50070,那么在后面加上一個(gè)/jmx即為localhost:50070/jmx,訪問(wèn)即可得到類(lèi)似下面的信息。
? 上面圖中具體指標(biāo)信息可以在Hadoop官方文檔對(duì)應(yīng)的metrics章節(jié)中找到,其中包括了Namenode以及Datanode相關(guān)信息,同理如果我們?cè)?088端口后面加上/jmx即可獲得關(guān)于Yarn相關(guān)指標(biāo)信息。
? 現(xiàn)在我們監(jiān)控的信息有了,接下來(lái)如果我們想將數(shù)據(jù)在監(jiān)控折線圖中展現(xiàn)出來(lái)的話就需要一個(gè)時(shí)序數(shù)據(jù)庫(kù),因?yàn)楸O(jiān)控指標(biāo)數(shù)據(jù)必須存在對(duì)應(yīng)的時(shí)間才有意義,目前比較常見(jiàn)的時(shí)序數(shù)據(jù)庫(kù)+界面組合是普羅米修斯(時(shí)序數(shù)據(jù)庫(kù))+ Grafana(界面展示),那么目前的問(wèn)題就轉(zhuǎn)換成了如何將Hadoop集群中的JMX信息傳遞給普羅米修斯,簡(jiǎn)單調(diào)研就可以發(fā)現(xiàn),普羅米修斯自己開(kāi)發(fā)了一款插件支持將java程序?qū)?yīng)的jmx信息傳遞到自己的時(shí)序數(shù)據(jù)庫(kù)中,插件地址。
根據(jù)自己Java環(huán)境版本下載插件,將插件放置到自己選定的位置,現(xiàn)在插件有了,就差如何在集群中使用插件了,我們開(kāi)始著手修改集群中的配置。
Hadoop集群配置Jmx_expoter
在hadoop-env.sh中最后添加以下代碼,注意將其中的路徑修改成自己系統(tǒng)中的路徑,這段代碼的主要作用是添加我們下載的jar包,以及給jar包傳遞配置文件,以及指定該服務(wù)要占用的端口,這里的對(duì)應(yīng)位置的配置文件prometheus_config.yml測(cè)試的時(shí)候可以直接創(chuàng)建一個(gè)空文件即可。
if ! grep -q <<<"$HDFS_NAMENODE_OPTS" jmx_prometheus_javaagent; then HDFS_NAMENODE_OPTS="$HDFS_NAMENODE_OPTS -javaagent:/usr/local/Cellar/hadoop/3.3.1/jmx_prometheus_javaagent-0.16.1.jar=27001:/usr/local/Cellar/hadoop/3.3.1/libexec/etc/hadoop/prometheus_config.yml" fi if ! grep -q <<<"$HDFS_DATANODE_OPTS" jmx_prometheus_javaagent; then HDFS_DATANODE_OPTS="$HDFS_DATANODE_OPTS -javaagent:/usr/local/Cellar/hadoop/3.3.1/jmx_prometheus_javaagent-0.16.1.jar=27002:/usr/local/Cellar/hadoop/3.3.1/libexec/etc/hadoop/prometheus_config.yml" fi注意事項(xiàng) :
1.上面的代碼不能直接寫(xiě)成類(lèi)似以下模式,因?yàn)椴荒茉?HADOOP_OPTS中出現(xiàn)multiple -javaagent opts,就是不能直接出現(xiàn)多個(gè)-javaagent選項(xiàng),必須要換一種寫(xiě)法,將-javaagent寫(xiě)在if else代碼中可以避免這個(gè)問(wèn)題,詳細(xì)可以參考這個(gè)stackoverflow回答
#寫(xiě)成這種模式會(huì)報(bào)錯(cuò) export HADOOP_NAMENODE_OPTS="$HADOOP_NAMENODE_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml" export HADOOP_DATANODE_OPTS="$HADOOP_DATANODE_OPTS -javaagent:/home/ec2-user/jmx_exporter/jmx_prometheus_javaagent-0.10.jar=9102:/home/ec2-user/jmx_exporter/prometheus_config.yml"2.同一臺(tái)機(jī)器的每一個(gè)JMX服務(wù)端口必須區(qū)分開(kāi)
比如上面namenode的jmx服務(wù)所占用的端口為27001,datanode的jmx服務(wù)所占用的端口為27002,如果使用了相同的端口,那么在啟動(dòng)hdfs服務(wù)(./start-dfs.sh)的時(shí)候會(huì)報(bào)如下所示的錯(cuò)。
Starting namenodes on [localhost] Starting datanodes localhost: /usr/local/Cellar/hadoop/3.3.1/libexec/bin/../libexec/hadoop-functions.sh: line 1821: 11125 Abort trap: 6 hadoop_start_daemon "${daemonname}" "$class" "${pidfile}" "$@" >> "${outfile}" 2>&1 < /dev/null localhost: ERROR: Cannot set priority of datanode process 11125 localhost: ERROR: Cannot disconnect datanode process 11125這樣配置完成之后,Hadoop的jmx信息就被采集到指定的端口中了,接下來(lái)我們可以在網(wǎng)頁(yè)上測(cè)試一下我們的采集數(shù)據(jù),訪問(wèn)地址就是前面配置的端口 localhost:27001
同理我們的Yarn相關(guān)信息采集也要在yarn-env.sh中配置上面類(lèi)似的代碼,其中同樣要注意區(qū)分端口號(hào),并且不要同時(shí)出現(xiàn)兩個(gè)-javaagent,將兩個(gè)javaagent放到不同的if else中。
Hbase集群配置
因?yàn)槲沂菃?dòng)的單機(jī)版本的Hbase,所以我只配置HBASE_MASTER_OPTS和HBASE_JMX_BASE選項(xiàng),如果是集群模式可能還需要配置HBASE_REGIONSERVER_OPTS,將下面內(nèi)容替換成自己的文件路徑然后添加到hbase-env.sh的尾部。
export HBASE_JMX_BASE="-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=20101 -javaagent:$HBASE_HOME/lib/jmx_prometheus_javaagent-0.16.1.jar=27000:$HBASE_HOME/conf/hbase_jmx_config.yaml"這樣我們就可以通過(guò)指定端口訪問(wèn)各個(gè)集群的JMX信息了,下一步就是配置Prometheus將數(shù)據(jù)導(dǎo)入到時(shí)序數(shù)據(jù)庫(kù)中。
配置Prometheus
打開(kāi)Prometheus配置文件,并且在后面增加關(guān)于Hadoop集群的NameNode,DataNode以及Hbase的jmx數(shù)據(jù)配置,增加如下代碼,重啟普羅米修斯服務(wù)。
- job_name: "hbase"static_configs:- targets: ["localhost:27000"]labels:instance: localhost- job_name: "hadoop namenode"static_configs:- targets: ["localhost:27001"]labels:instance: localhost- job_name: "hadoop datanode"static_configs:- targets: ["localhost:27002"]labels:instance: localhost我們打開(kāi)Prometheus的頁(yè)面查看對(duì)應(yīng)的target,查看我們配置的任務(wù),如果出現(xiàn)下面幾個(gè)選項(xiàng)并且是綠色的說(shuō)明是正常的,打開(kāi)采集的結(jié)果網(wǎng)址會(huì)發(fā)現(xiàn)其中Prometheus采集的指標(biāo)名稱(chēng)相比于原先集群50070/jmx的指標(biāo)名稱(chēng)是經(jīng)過(guò)處理的,比如Prometheus中有一個(gè)指標(biāo)叫做hadoop_namenode_memnonheapmaxm他在50070/jmx中是名稱(chēng)是memnonheapmaxm,然后前面加上service name等,其中的匹配規(guī)則應(yīng)該在插件的配置文件prometheus_config.yml中設(shè)置的,詳細(xì)可以看插件地址。
最后選出來(lái)我們需要的指標(biāo)之和在Grafana中展示出來(lái)即可,具體方法這里不再展示,可以參考[這篇教程](
總結(jié)
以上是生活随笔為你收集整理的如何使用JMX_Expoter+Prometheus+Grafana监控Hadoop集群的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 诚之和:“何同学同款”缺货!曾现身罗永浩
- 下一篇: apk文件被安装到模拟器系统的/data