在使用或者管理维护hadoop集群的时候,监控工具是必不可少的,hadoop集群相关的监控工具有ganglia,chukwa,功能强大,可以监控整个集群的资源使用状况。但是面对一些问题,比如具体到单个job,mapper,ruducer粒度的测试,profiling,性能调优等,ganglia,chukwa等集群监控工具的监控粒度似乎有些大,好像没有提供针对单个job->task->task-attempt级别的性能数据采集与监控(对它们了解比较少,可能有这个功能我没找到?)
正好最近在尝试优化mapreduce的单机计算部分,需要一个粒度到task_attempt级别的监控工具来收集CPU,内存等性能相关的信息。需求如下:
1. 收集集群中每个mapreduce task相关的进程的动态运行信息(CPU, RSS, VM等, 可扩充), 按照job-> task_attempt->process的层次组织;
2. 使用streaming/bistreaming的job每个task_attempt由多个进程组成,这种多进程task也需要识别;
3. 用户可以以web方式浏览每个提交的任务的细粒度运行信息,这些信息通过文本和图表方式展示。
简单分析下需求后,发现可以拿python很快的实现一个:
1. 每个task tracker node部署一个monitor负责收集信息,并将信息通过http POST方式实时发送给server
2. Server负责将收集到的信心组织成job->task_attempt->process->value_seq的层次形式,并提供web接口供用户浏览
所以这个工具就两个模块,monitor和server,使用python丰富的工具库后代码很少,每个模块一个数百行的py文件即可:
1. Monitor的监控数据采集使用psutil(http://code.google.com/p/psutil ),与server的通信使用httplib,数据以json方式编码;
2. Server的web server使用webpy(http://webpy.org/),将数据转化成图表使用matplotlib(http://matplotlib.sourceforge.net, 在前两篇文章中也有介绍)
由于代码不多,下面会详细介绍实现,网络,多线程,web,图形,系统编程都有些涉及,对学习python或者了解上述几个工具类库的使用来说算是一个不错入门例子吧。
先来介绍monitor模块,分成数据收集和数据发送两块,各实现为一个线程。
数据收集线程 -> buffer -> 数据发送线程, 典型的生产-消费模型
1. 收集线程:
识别新的attempt进程将之放入usefull_processes中
遍历usefull_processes,收集进程信息并封装成json string,append到buffer中
2. 发送线程:
定时检查buffer是否有内容,并批量发送给server
相关代码: