Hadoop集群上运行有多道MapReduce Job,到底每个Job消费集群计算资源(CPU,内存)的情况如何,通常我们是不知道的。这节来探讨下如果想获得这些信息,应该怎样做。
每个Job在运行时是散布在TaskTracker上,由不同的JVM来执行。所以这个问题归根结底就是想获取每个运行task的JVM对资源的消费情况。对于这种获取分布式环境数据的例子,就可以采用MapReduce框架自带的Counter机制,由它来采集各JVM运行期的实时数据,然后在Job结束后,做最终分析。
这项任务的意义在哪里?
正常情况下,Job会因为数据范围、服务的应用、数据量的大小及MapReduce逻辑的复杂程度等因素而被定义为不同的类别。当类别的概念形成后,我们就想知道每个类别Job对集群资源的使用情况是否符合预期,如果可以获得这些数据,就可以根据资源使用情况对Job的执行时间做相应的调整,以避免对其它Job的影响。
数据采集什么时候开始与结束?
我们的目标是分析每个子JVM的资源消耗情况,就应该在子JVM开始运行时介入收集。站在MapReduce框架外,只有一个地方可以作为介入点:Mapper和Reducer的setup方法。它的参数是task运行期Context,可以很方便地调用Counter。那我们的入口就可以像这样
public class ResourceCollectMapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT> {
ChildJVMResourceCollector collector = null;
public void setup(Context context) {
collector = new ChildJVMResourceCollector(context);
collector.start();
}
}
资源收集器是一个独立线程,在setup方法中启动,在cleanup方法调用时结束。本来整个task的执行过程就包含在setup与cleanup之间,所以我们完全有机会收集这个过程中的资源利用情况。
如何获取运行task的JVM pid?
运行task的子JVM是由TaskTracker创建的,对用户完全透明。但幸运的是,TaskTrack在创建这个子JVM时,把它的pid作为参数传给了子JVM。获取的方式如下
private String getChildJVMPid() {
String pid = "";
if (!Shell.WINDOWS) {
pid = System.getenv().get("JVM_PID");
}
return pid;
}
怎样根据pid获取系统级的资源使用率?
得到当前子JVM的进程号后,就能用这个进程号查询Linux系统当前进程的资源使用情况。查询的方式网上很多资料都有说明
上图是通过ps命令查询某个进程的CPU与内存使用情况的截图。其它相似的查询方式大家可以自行实验
如果采用上述的linux命令,就需要分开组装,并调用Hadoop提供的Shell组件。
String[] queryCommand = new String[]{"ps", "-o", "%cpu,%mem", pid};
String result = Shell.execCommand(queryCommand);
返回的查询结果是一个字符串,解析字符串,拿到想要的结果,以特定的key把结果存入Counter中(当然获取次数也需要收集,在Counter中由独立key标识),这样我们的一次数据获取过程就结束了。
最终怎样分析?
在Job结束后,根据特定的key获取相应的数据,然后除以获取次数,就是平均的CPU与内存使用率。
要注意的情况是?
在这个过程中需要注意有两个地方:
1. 尽量让获取资源的线程不要占用太多的执行时间,每隔一段时间启用一次,减少对正常task执行的影响;
2. 如果遇到某个Job的多个task共用一个子JVM的情况(MapReduce优化的一点,减少频繁创建/销毁JVM的代价),就需要确保在当前task的cleanup方法中一定让获取资源的线程终结掉。这个线程包含着task运行期的Context,如果是Map task的话,那个默认100MB的内存缓冲区也在其中,可能会有OOM问题而影响下一个task的创建过程。
- 大小: 6.4 KB
分享到:
相关推荐
这是谷歌三大论文之一的 MapReduce: Simplified Data Processing on Large Clusters 英文原文。我的翻译可以见https://blog.csdn.net/m0_37809890/article/details/87830686
MapReduce: Simplified Data Processing on Large Clusters from google.
来自于GOOGLE的mapreduce的开山之作,此文是原英文的中文版本,希望能互相参照,加深理解
23、hadoop集群中yarn运行mapreduce的内存、CPU分配调度计算与优化 网址:https://blog.csdn.net/chenwewi520feng/article/details/130457270 本文介绍在hadoop集群中,不适用默认的参数情况下,yarn的cpu和内容配置...
Google并行计算,分布式处理模型MapReduce: Simplified Data Processing on Large Clusters
Google的MapReduce并行计算原始论文详解。
MapReduce: Simplified Data Processing on Large Clusters翻译
计算利用一个输入key/value对集,来产生一个输出key/value对集.MapReduce库的用户用两个函数表达这个计算:map和reduce. 用户自定义的map函数,接受一个输入对,然后产生一个中间key/value对集.MapReduce库把所有具有...
mapreduce创建代码项目mvn原型:generate -DarchetypeGroupId = org.apache.maven.archetypes -DgroupId = org.conan.mymahout -DartifactId = myPro -DpackageName = org.conan.mymahout -Dversion = 1.0-SNAPSHOT ...
MapReduce:Nkeys,Nfiles终极解决方案.docx
NULL 博文链接:https://langyu.iteye.com/blog/962529
MapReduce的翻译,我只是个搬运工qwq
Google那篇著名的论文的ppt,MapReduce开山之作,介绍了Google对MapReduce的实现。
MapReduce求取行平均值 MapReduce小实例 数据有经过处理已经添加行号的 也有未添加的 行平均值的四种求法
MapReduce MapReduce 计算 学习mapreduce工作原理的例子
(2):运行MapReduce (5):查看运行结果 (6)网页上查看MapReduce任务 2.矩阵相乘实验(matrix) (1)写matrix代码并把代码生成jar包 (2)运行命令 (1):把linus下的文件放到hdfs上 (2):运行MapReduce (3...
MapReduce原始论文
利用MapReduce实现了求学生成绩的最大值,最小值,及成绩分布。结合我的博客“MapReduce之学生平均成绩”看,效果更好。
一篇文章是Google的Jeffrey Dean、Sanjay Ghemawat发表的标题为《MapReduce:一个灵活的数据库处理工具》,另一篇文章是Michael Stonebraker、Daniel Abadi、David J. DeWitt、Sam Madden、Erik Paulson、Andrew ...
07:MapReduce分布式计算框架