NingG +

Ganglia监控Flume、Kafka、Storm

背景

通常利用Flume、Kafka、Storm来搭建实时的日志分析系统,那如何对这一系统运行状态进行监控呢?赶快调研一下,看看业内其他人怎么做的监控,当前能够查到的唯品会工程师Yaobaniu对外分享的实时日志分析平台材料,初步可以推断其使用Zabbix进行的监控,因为baniu在PPTV工作时,主要工作就是专注利用Zabbix进行集群监控,并且在baniu的其他分享资料中,见到过Zabbix监控界面的截图,so,初步推断是Zabbix。不过,本文将采用Ganglia来进行监控,原因很简单:

前期准备

在阅读本文之前,要求对Ganglia的安装配置有一个基本的了解,具体要了解几点:

上面的内容,可以参考自己之前的几篇博文:

(ganglia的整个系列)

软件版本

软件 版本
Flume apache-flume-1.5.0.1-bin.tar.gz
Kafka kafka_2.9.2-0.8.1.1.tgz
Storm apache-storm-0.9.2-incubating.tar.gz
Ganglia  

Ganglia with Flume

Flume的官网上Monitoring部分,显示通过简单配置,即可完成Ganglia对Flume的监控,关于具体细节,参考阅读Flume user-guide-monitoring

同时Flume的监控问题,在JIRA上也有较广泛的讨论,为开拓思路,也可以看看jira Flume

Ganglia with Kafka

本文将描述一下,围绕“利用Ganglia监控Kafka”这一问题,如何思考、如何分析、如何搜索解决方案。

分析

直接列一下,分析、查找途径:

上面是对整个Kafka官网的初步查询结果,从中可以看到,已经有利用Ganglia监控Kafka的监控方案了,具体有两个:

kafka-ganglia(criteo)

由于最新工程对当前版本兼容性可能更好,以及与Kafka利用Yammer Metrics机制保持一致,初步决定采用kafka-ganglia工程。拿到这一工程后,利用Maven对其进行构建,不过我本地测试需要调整一下artifactId=scalatest_2.9.2的版本:

<dependency>
  <groupId>org.scalatest</groupId>
  <artifactId>scalatest_2.9.2</artifactId>
  <version>1.7.2</version>
  <scope>test</scope>
</dependency>

不过其中涉及到一个情况:ganglia web上显示收集到的Kafka指标过多,近1k+,过于臃肿,需要进行定制和过滤;

经过自己简单分析,上面两个问题都有解决的办法:

Ganglia Integration(adambarthelson)

从上以部分发现,如果利用metrics-ganglia-2.2.0.jar来实现Ganglia对Kafka的监控,有几个方面需要定制,涉及到一些定制的工作量。而Ganglia Integration好像可以直接通过Json文件来指定收集特定的参数,涉及到的定制可能会较少。

初步计划,在配置完Ganglia对Storm的监控时,学习一下jmxtrans的基本知识,然后回过头来,再来尝试一下Ganglia Integration

使用和调试步骤

具体使用JMX+jmxtrans服务来监控Kafka运行状态,分为几步:

具体调试方法:

收集Kafka运行参数

编写kafka.json文件,并收集Kafka运行状态参数,具体办法:jconsole工具查看Kafka运行参数,并据此编写kafka.json文件。

Ganglia with Storm

如何找到Ganglia监控Storm的方法?找到方法后,具体如何进行操作?

分析

对于ASF(Apache Software Foundation,Apache软件基金会)下的opensource项目,我个人认为有几个信息源:

此次查询如何利用Ganglia来监控Storm,还按照这几个信息源来查询:

其中BOOK-Learning Storm详细介绍了Ganglia监控Storm的具体操作步骤,其基本原理是利用jmxtrans(从哪收集的运行数据?谁负责发送给Ganglia?)

Ganglia监控Storm

这一部分参考自BOOK-Learning Storm,细微的地方做出调整。

Storm doesn’t have built-in support to monitor the Storm cluster using Ganglia. However, with jmxtrans, you can enable Storm monitoring using Ganglia. The jmxtrans tool allows you to connect to any JVM and fetches its JVM metrics without writing a single line of code. The JVM metrics exposed via JMX can be displayed on Ganglia using jmxtrans. Hence, jmxtrans acts as a bridge between Storm and Ganglia.

需要在Storm运行的节点上安装jmxtrans:

(自己有一篇单独介绍jmxtrans的博客,给个链接)

开启jvm的jmx功能

supervisor.json

{
  "servers": [
    {
	  "port": "12346", 
	  "host": "IP_OF_SUPERVISOR_MACHINE", 
	  "queries": [
	  	{
	  	  "outputWriters": [
	  	  	{
	  	  	  "@class": "com.googlecode.jmxtrans.model.output.GangliaWriter", 
	  	  	  "settings": {
	  	  	  	"groupName": "supervisor", 
	  	  	  	"host": "IP_OF_GANGLIA_GMOND_SERVER", 
	  	  	  	"port": "8649"
	  	  	  }
	  	  	}
	  	  ], 
	  	  "obj": "java.lang:type=Memory", 
	  	  "resultAlias": "supervisor", 
	  	  "attr": [
	  	  	"ObjectPendingFinalizationCount"
	  	  ]
	  	}, 
	  	{
	  	  "outputWriters": [
	  	  	{
	  	  	  "@class": "com.googlecode.jmxtrans.model.output.GangliaWriter", 
	  	  	  "settings": {
	  	  	  	"groupName": " supervisor ", 
	  	  	  	"host": "IP_OF_GANGLIA_GMOND_SERVER", 
	  	  	  	"port": "8649"
	  	  	  }
	  	  	}
	  	  ], 
	  	  "obj": "java.lang:name=Copy,type=GarbageCollector", 
	  	  "resultAlias": " supervisor ", 
	  	  "attr": [
	  	  	"CollectionCount", 
	  	  	"CollectionTime"
	  	  ]
	  	}, 
	  	{
	  	  "outputWriters": [
	  	  	{
	  	  	  "@class": "com.googlecode.jmxtrans.model.output.GangliaWriter", 
	  	  	  "settings": {
	  	  	  	"groupName": "supervisor ", 
	  	  	  	"host": "IP_OF_GANGLIA_GMOND_SERVER", 
	  	  	  	"port": "8649"
	  	  	  }
	  	  	}
	  	  ], 
	  	  "obj": "java.lang:name=Code Cache,type=MemoryPool", 
	  	  "resultAlias": "supervisor ", 
	  	  "attr": [
	  	  	"CollectionUsageThreshold", 
	  	  	"CollectionUsageThresholdCount", 
	  	  	"UsageThreshold", 
	  	  	"UsageThresholdCount"
	  	  ]
	  	}, 
	  	{
	  	  "outputWriters": [
	  	  	{
	  	  	  "@class": "com.googlecode.jmxtrans.model.output.GangliaWriter", 
	  	  	  "settings": {
	  	  	  	"groupName": "supervisor ", 
	  	  	  	"host": "IP_OF_GANGLIA_GMOND_SERVER", 
	  	  	  	"port": "8649"
	  	  	  }
	  	  	}
	  	  ], 
	  	  "obj": "java.lang:type=Runtime", 
	  	  "resultAlias": "supervisor", 
	  	  "attr": [
	  	  	"StartTime", 
	  	  	"Uptime"
	  	  ]
	  	}
	  ], 
	  "numQueryThreads": 2
    }
  ]
}

杂谈

“见自己,见天地,见众生”,突然想到这句话,说是排rank大多是年轻人的想法,而实际上绝大部分有点成绩的人最后都殊途同归:见众生;做对众生有用、有益的事情。

Top