执行一个MapReduce时,应该监控些什么
执行一个MapReduce时,应该监控些什么
前言
本文讨论的是,在以Yarn做资源管理的集群上如何监控一个MapReduce程序。
一、概述
当我们执行一个MapReduceJob,或是执行一个Hive SQL(MapReduce为引擎),又或是Sqoop后,程序被提交给了集群。对于开发、测试集群运行程序的开发人员来说,刚刚接触MapReduce的初学者往往是在命令行前等着程序执行完成,遇到运行缓慢、出现报错很难做出有效的响应。本文希望通过对Yarn原生UI等监控手段的介绍,能使读者对MapReduce进行有效监控。
二、在哪监控
1. Cloudera Manager的Yarn->应用程序
如果使用CDH集群,我们可以在登陆ClouderaManager(以下简称CM)后,在Yarn的应用程序中看到近一段时间执行的程序的摘要,其中包括了起止时间、持续时间、状态等信息,右侧额下拉框可以非常方便的停止一个正在运行的程序。但这里只有一些概述,缺少明细,如每个map执行的情况等,我们可以点击蓝色的applicationID,页面就会跳转到Yarn的原生界面中。
2. Yarn UI
我们推荐在Yarn的原生的Web UI中监控程序。
入口除了上例中提到的通过应用程序的applicationID跳转外,也可以在Yarn->Web UI进入,其中ResourceManager(以下简称RM) WebUI中包括了近期全部程序的执行情况,HistoryServer(以下简称HS) WebUI中仅包含执行完成的(不包含被Kill掉的),并且在RM中查看已经完成的程序明细时也需跳转到HS中。关于能查看多长时间的程序明细,与Yarn的RM、NodeManager(以下简称NM)等日志留存情况有关。
当然最方便的是记下RM的IP和端口号8088,或者放在浏览器收藏夹里。
由于原生UI各页面地址通常都是hostname+端口,所以为了流畅的访问,请在本地修改hosts增加集群各个节点的地址,或者去改DNS服务器。如果无法修改就得在访问时去浏览器上改地址了。
3. Oozie和Hue
如果是用Oozie调起的程序,可以在Oozie 的WebUI或者Hue上看到任务的起止时间等概述信息,此处不详述。
三、 监控什么
通常监控的内容包括程序的运行开始结束时间、状态、资源占用情况、日志、报错信息等,另外对于一些程序中的其他组件,如程序读写Hbase的情况下,也要监控其他组件的情况。
因为Yarn WebUI上的监控信息非常全面,CM上任务的摘要信息也是来源于此,因此我们建议在需要监控程序执行时一直跟着这个页面。如下内容以Yarn 的WebUI为例,说说监控通常有哪些内容。
1. Yarn WebUI整体
1.1 RM
l 左侧导航栏
-Cluster
——About:RM状态版本等信息
——Nodes:NM列表及状态和属性
——Applications:任务列表及状态和属性(常用,迷路了就点这个吧! )
————NEW、NEW_SAVING……:筛选不同状态任务
——Scheduler:资源队列列表和状态
-Tools
——Configuration:yarn配置
——Local logs:本地日志
——Server stacks:堆栈
——Server metrics:指标
l 上方指标区
集群指标、集群节点指标、用户指标
l 任务列表
Ø 右上角搜索框(常用,任务找不到在这儿搜索! )
Ø 起止时间、状态、进度、任务名、资源使用等等,
Ø Tracking UI是进一步监控的入口(常用)
正在执行的任务显示ApplicationMaster,已经完成的显示History
1.2 HS
这里只有执行完的,Kill掉的都可能不会有,界面类似RS就不详述了,补充一点:
最下方的这些搜索框可以做筛选用
2. MapReduce Job界面
点了ApplicationMaster之后进入一个job的界面,mapreduce、spark会进入不同的界面,本文只讨论MapReduce。
再点击具体的Job ID,就来到了下图这个界面。(常用,简而言之就盯着这里吧! )
l Job的时间和状态
有开始时间(Started)和持续时间(Elapsed),状态(State)。
l ApplicationMaster信息
l Map和Reduce不同状态下的个数统计
进度条(Progress)、合计(Total)、挂起(Pending)、运行中(Running)、完成(Complete)
Ø 如果map或reduce进程数太少,要考虑数据源的特性或程序设置,例如以Hbase为数据源时,Map的个数=源表region的个数。
Ø Pending的原因,对于Map来说通常都是因为资源不足,对于reduce来说还可能是在等Map结束。
l Map和Reduce不同状态下的个数统计2
新增(New)、运行中(Running)、失败(Failed)、杀死(Killed)、成功(Successful)
Ø reduce会等map全部结束才真正开始
Ø 如果有失败的,一定点进去看看!
Ø Kill可能是某个map或reduce失败超过重试次数后,其他的就会被kill掉
3. Task界面
点击这些带下划线的数字会进入到对应状态的map或reduce task中,例如点击Maps的Failed列的数字进入到报错的map列表中。
Ø Attempt的末位编号是重试的次数,重试第3次之后如果还是失败,这个MR就整体失败了,所以当你认为报错不会因重试就能解决的时候,直接去Kill掉你的程序,根据报错信息去排查问题吧,不要放在这里浪费计算和存储资源。
Ø Node是执行这个map或reduce的NM,有助于判断一些环境问题,例如报错都集中在一个节点上,或者执行缓慢的都在这一个节点上,可能说明了数据倾斜、该节点资源不足、该节点有硬件问题等。
Ø 起止时间和持续时间,常用来寻找执行时间最长的任务。
Ø Note中是报错概要信息
Ø 点击log去看更详细的日志
4. 日志和报错信息
正在运行的和已经完成的任务分别在RM和HS上,点击log后会稍有差别,但都会显示3种日志stderr(报错信息)、stdout(标准输出)、syslog(log4j日志),
Ø 报错信息stderr
上一步的Note中的报错不够具体,请一定点到这里来看具体信息!点击有下划线的here可以展开。
Ø stdout
这里有Map和Reduce中System.out.print的结果,但是可以少量打印调试程序,但是请注意上线的程序不要留下System.out.print!这样会拖慢程序,还可能会占用大量存储和IO资源!
Ø syslog
这里有更加详细的信息供排查问题,比如对于读取Hbase表的程序来说,会有表名、region的name,startRow和EndRow等。
5. 统计信息
点击左侧导航栏中Job下的Counters,这里有很多统计信息,比较常用的是map和reduce的记录数和大小。
6. 总结
一句话总结,从Yarn WebUI或CM中查找到你的Job,在Job的详情页中监控你的Job,如果有Failed进去看日志,如果执行慢进去看日志。