执行一个MapReduce时,应该监控些什么

    执行一个MapReduce时,应该监控些什么

前言

       本文讨论的是,在以Yarn做资源管理的集群上如何监控一个MapReduce程序。

一、概述

    当我们执行一个MapReduceJob,或是执行一个Hive SQL(MapReduce为引擎),又或是Sqoop后,程序被提交给了集群。对于开发、测试集群运行程序的开发人员来说,刚刚接触MapReduce的初学者往往是在命令行前等着程序执行完成,遇到运行缓慢、出现报错很难做出有效的响应。本文希望通过对Yarn原生UI等监控手段的介绍,能使读者对MapReduce进行有效监控。

二、在哪监控

1.  Cloudera Manager的Yarn->应用程序

    如果使用CDH集群,我们可以在登陆ClouderaManager(以下简称CM)后,在Yarn的应用程序中看到近一段时间执行的程序的摘要,其中包括了起止时间、持续时间、状态等信息,右侧额下拉框可以非常方便的停止一个正在运行的程序。但这里只有一些概述,缺少明细,如每个map执行的情况等,我们可以点击蓝色的applicationID,页面就会跳转到Yarn的原生界面中。

执行一个MapReduce时,应该监控些什么

2.  Yarn UI

    我们推荐在Yarn的原生的Web UI中监控程序。

    入口除了上例中提到的通过应用程序的applicationID跳转外,也可以在Yarn->Web UI进入,其中ResourceManager(以下简称RM) WebUI中包括了近期全部程序的执行情况,HistoryServer(以下简称HS) WebUI中仅包含执行完成的(不包含被Kill掉的),并且在RM中查看已经完成的程序明细时也需跳转到HS中。关于能查看多长时间的程序明细,与Yarn的RM、NodeManager(以下简称NM)等日志留存情况有关。

执行一个MapReduce时,应该监控些什么

    当然最方便的是记下RM的IP和端口号8088,或者放在浏览器收藏夹里。

执行一个MapReduce时,应该监控些什么

       由于原生UI各页面地址通常都是hostname+端口,所以为了流畅的访问,请在本地修改hosts增加集群各个节点的地址,或者去改DNS服务器。如果无法修改就得在访问时去浏览器上改地址了。

3.  Oozie和Hue

    如果是用Oozie调起的程序,可以在Oozie 的WebUI或者Hue上看到任务的起止时间等概述信息,此处不详述。

三、          监控什么

    通常监控的内容包括程序的运行开始结束时间、状态、资源占用情况、日志、报错信息等,另外对于一些程序中的其他组件,如程序读写Hbase的情况下,也要监控其他组件的情况。

    因为Yarn WebUI上的监控信息非常全面,CM上任务的摘要信息也是来源于此,因此我们建议在需要监控程序执行时一直跟着这个页面。如下内容以Yarn 的WebUI为例,说说监控通常有哪些内容。

 

1.  Yarn WebUI整体

1.1  RM

执行一个MapReduce时,应该监控些什么

l  左侧导航栏

-Cluster

——About:RM状态版本等信息

——Nodes:NM列表及状态和属性

——Applications:任务列表及状态和属性(常用,迷路了就点这个吧! )

————NEW、NEW_SAVING……:筛选不同状态任务

——Scheduler:资源队列列表和状态

-Tools

——Configuration:yarn配置

——Local logs:本地日志

——Server stacks:堆栈

——Server metrics:指标

l  上方指标区

集群指标、集群节点指标、用户指标

执行一个MapReduce时,应该监控些什么

l  任务列表

Ø  右上角搜索框(常用,任务找不到在这儿搜索! )

Ø  起止时间、状态、进度、任务名、资源使用等等,

Ø  Tracking UI是进一步监控的入口(常用)

    正在执行的任务显示ApplicationMaster,已经完成的显示History

执行一个MapReduce时,应该监控些什么

1.2  HS

    这里只有执行完的,Kill掉的都可能不会有,界面类似RS就不详述了,补充一点:

    最下方的这些搜索框可以做筛选用

执行一个MapReduce时,应该监控些什么

2.  MapReduce Job界面

    点了ApplicationMaster之后进入一个job的界面,mapreduce、spark会进入不同的界面,本文只讨论MapReduce。

执行一个MapReduce时,应该监控些什么

        再点击具体的Job ID,就来到了下图这个界面。(常用,简而言之就盯着这里吧! )

执行一个MapReduce时,应该监控些什么

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界面

执行一个MapReduce时,应该监控些什么

    点击这些带下划线的数字会进入到对应状态的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日志),

执行一个MapReduce时,应该监控些什么

Ø  报错信息stderr

 执行一个MapReduce时,应该监控些什么

    上一步的Note中的报错不够具体,请一定点到这里来看具体信息!点击有下划线的here可以展开。

Ø  stdout

    这里有Map和Reduce中System.out.print的结果,但是可以少量打印调试程序,但是请注意上线的程序不要留下System.out.print!这样会拖慢程序,还可能会占用大量存储和IO资源!

Ø  syslog

执行一个MapReduce时,应该监控些什么

    这里有更加详细的信息供排查问题,比如对于读取Hbase表的程序来说,会有表名、region的name,startRow和EndRow等。

5.  统计信息

执行一个MapReduce时,应该监控些什么

    点击左侧导航栏中Job下的Counters,这里有很多统计信息,比较常用的是map和reduce的记录数和大小。

6.  总结

    一句话总结,从Yarn WebUI或CM中查找到你的Job,在Job的详情页中监控你的Job,如果有Failed进去看日志,如果执行慢进去看日志。

执行一个MapReduce时,应该监控些什么