`
langyu
  • 浏览: 884107 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MapReduce:默认Counter的含义

阅读更多

    MapReduce Counter为提供我们一个窗口:观察MapReduce job运行期的各种细节数据。今年三月份期间,我曾经专注于MapReduce性能调优工作,是否优化的绝大多评估都是基于这些Counter的数值表现。MapReduce自带了许多默认Counter,可能有些朋友对它们有些疑问,现在我分析下这些默认Counter的含义,方便大家观察job结果。

    我的分析是基于Hadoop0.21,我也看过Hadoop其它版本的Counter展现,细节大同小异,如果有差异的地方,以事实版本为主。

    Counter有"组group"的概念,用于表示逻辑上相同范围的所有数值。MapReduce job提供的默认Counter分为五个组,下面逐一介绍。这里也拿我的一份测试数据来做详细比对,它们会以表格的形式出现在各组描述中。

FileInputFormatCounters
    这个group表示map task读取文件内容(总输入数据)的统计
   
CounterMapReduceTotal
FileInputFormatCountersBYTES_READ1,109,990,59601,109,990,596

    BYTES_READ
         Map task的所有输入数据(字节),等于各个map task的map方法传入的所有value值字节之和。


FileSystemCounters
    MapReduce job执行所依赖的数据来自于不同的文件系统,这个group表示job与文件系统交互的读写统计
 
CounterMapReduceTotal
FileSystemCountersFILE_BYTES_READ01,544,520,8381,544,520,838
FILE_BYTES_WRITTEN1,544,537,3101,544,520,8383,089,058,148
HDFS_BYTES_READ1,110,269,50801,110,269,508
HDFS_BYTES_WRITTEN0827,982,518827,982,518
 
    FILE_BYTES_READ
        job读取本地文件系统的文件字节数。假定我们当前map的输入数据都来自于HDFS,那么在map阶段,这个数据应该是0。但reduce在执行前,它的输入数据是经过shuffle的merge后存储在reduce端本地磁盘中,所以这个数据就是所有reduce的总输入字节数。

    FILE_BYTES_WRITTEN
        map的中间结果都会spill到本地磁盘中,在map执行完后,形成最终的spill文件。所以map端这里的数据就表示map task往本地磁盘中总共写了多少字节。与map端相对应的是,reduce端在shuffle时,会不断地拉取map端的中间结果,然后做merge并不断spill到自己的本地磁盘中。最终形成一个单独文件,这个文件就是reduce的输入文件。

    HDFS_BYTES_READ
        整个job执行过程中,只有map端运行时,才从HDFS读取数据,这些数据不限于源文件内容,还包括所有map的split元数据。所以这个值应该比FileInputFormatCounters.BYTES_READ 要略大些。

    HDFS_BYTES_WRITTEN
        Reduce的最终结果都会写入HDFS,就是一个job执行结果的总量。


Shuffle Errors
    这组内描述Shuffle过程中的各种错误情况发生次数,基本定位于Shuffle阶段copy线程抓取map端中间数据时的各种错误。
CounterMapReduceTotal
Shuffle ErrorsBAD_ID000
CONNECTION000
IO_ERROR000
WRONG_LENGTH000
WRONG_MAP000
WRONG_REDUCE000

    BAD_ID
        每个map都有一个ID,如attempt_201109020150_0254_m_000000_0,如果reduce的copy线程抓取过来的元数据中这个ID不是标准格式,那么此Counter增加

    CONNECTION
        表示copy线程建立到map端的连接有误

    IO_ERROR
        Reduce的copy线程如果在抓取map端数据时出现IOException,那么这个值相应增加

    WRONG_LENGTH
        map端的那个中间结果是有压缩好的有格式数据,所有它有两个length信息:源数据大小与压缩后数据大小。如果这两个length信息传输的有误(负值),那么此Counter增加

    WRONG_MAP
        每个copy线程当然是有目的:为某个reduce抓取某些map的中间结果,如果当前抓取的map数据不是copy线程之前定义好的map,那么就表示把数据拉错了

    WRONG_REDUCE
        与上面描述一致,如果抓取的数据表示它不是为此reduce而准备的,那还是拉错数据了。


Job Counters
    这个group描述与job调度相关的统计
CounterMapReduceTotal
Job CountersData-local map tasks0067
FALLOW_SLOTS_MILLIS_MAPS000
FALLOW_SLOTS_MILLIS_REDUCES000
SLOTS_MILLIS_MAPS001,210,936
SLOTS_MILLIS_REDUCES001,628,224
Launched map tasks0067
Launched reduce tasks008


    Data-local map tasks
        Job在被调度时,如果启动了一个data-local(源文件的幅本在执行map task的taskTracker本地)

    FALLOW_SLOTS_MILLIS_MAPS
        当前job为某些map task的执行保留了slot,总共保留的时间是多少

    FALLOW_SLOTS_MILLIS_REDUCES
        与上面类似

    SLOTS_MILLIS_MAPS
        所有map task占用slot的总时间,包含执行时间和创建/销毁子JVM的时间

    SLOTS_MILLIS_REDUCES
        与上面类似

    Launched map tasks
        此job启动了多少个map task

    Launched reduce tasks
        此job启动了多少个reduce task


Map-Reduce Framework
    这个Counter group包含了相当多地job执行细节数据。这里需要有个概念认识是:一般情况下,record就表示一行数据,而相对地byte表示这行数据的大小是多少,这里的group表示经过reduce merge后像这样的输入形式{“aaa”, [5, 8, 2, …]}。
CounterMapReduceTotal
Map-Reduce FrameworkCombine input records200,000,0000200,000,000
Combine output records117,838,5460117,838,546
Failed Shuffles000
GC time elapsed (ms)23,47246,58870,060
Map input records10,000,000010,000,000
Map output bytes1,899,990,59601,899,990,596
Map output records200,000,0000200,000,000
Merged Map outputs0536536
Reduce input groups084,879,13784,879,137
Reduce input records0117,838,546117,838,546
Reduce output records084,879,13784,879,137
Reduce shuffle bytes01,544,523,9101,544,523,910
Shuffled Maps0536536
Spilled Records117,838,546117,838,546235,677,092
SPLIT_RAW_BYTES8,57608,576


    Combine input records
        Combiner是为了减少尽量减少需要拉取和移动的数据,所以combine输入条数与map的输出条数是一致的。

    Combine output records
        经过Combiner后,相同key的数据经过压缩,在map端自己解决了很多重复数据,表示最终在map端中间文件中的所有条目数

    Failed Shuffles
        copy线程在抓取map端中间数据时,如果因为网络连接异常或是IO异常,所引起的shuffle错误次数

    GC time elapsed(ms)
        通过JMX获取到执行map与reduce的子JVM总共的GC时间消耗

    Map input records
        所有map task从HDFS读取的文件总行数

    Map output records
        map task的直接输出record是多少,就是在map方法中调用context.write的次数,也就是未经过Combine时的原生输出条数

    Map output bytes
        Map的输出结果key/value都会被序列化到内存缓冲区中,所以这里的bytes指序列化后的最终字节之和

    Merged Map outputs
        记录着shuffle过程中总共经历了多少次merge动作

    Reduce input groups
        Reduce总共读取了多少个这样的groups

    Reduce input records
        如果有Combiner的话,那么这里的数值就等于map端Combiner运算后的最后条数,如果没有,那么就应该等于map的输出条数

    Reduce output records
        所有reduce执行后输出的总条目数

    Reduce shuffle bytes
        Reduce端的copy线程总共从map端抓取了多少的中间数据,表示各个map task最终的中间文件总和

    Shuffled Maps
         每个reduce几乎都得从所有map端拉取数据,每个copy线程拉取成功一个map的数据,那么增1,所以它的总数基本等于 reduce number * map number

    Spilled Records
        spill过程在map和reduce端都会发生,这里统计在总共从内存往磁盘中spill了多少条数据

    SPLIT_RAW_BYTES
        与map task 的split相关的数据都会保存于HDFS中,而在保存时元数据也相应地存储着数据是以怎样的压缩方式放入的,它的具体类型是什么,这些额外的数据是MapReduce框架加入的,与job无关,这里记录的大小就是表示额外信息的字节大小

5
1
分享到:
评论
10 楼 brandNewUser 2014-12-05  
你好,我请教一下关于Counter中的Data-local map tasks,含义上说的是本地数据的任务。但是如果任务的Split中包含了较多的文件(CombineFileSplit),或者文件比较大(含有很多块),数据不可能达到完全本地化,但这种情况下,这个Counter还是有值,那么此时代表什么含义?
谢谢
9 楼 crowgns 2014-05-30  
counter还是有大学问的阿
8 楼 coobery 2013-03-23  
多谢总结!
7 楼 langyu 2012-06-14  
xuxm2007 写道
其实我一开始找到你的博客
主要是想知道 Map output bytes和map端Local bytes written,以及reduce端的Local bytes read之间的关系?

现在搞明白了么?
6 楼 xuxm2007 2012-06-14  
其实我一开始找到你的博客
主要是想知道 Map output bytes和map端Local bytes written,以及reduce端的Local bytes read之间的关系?
5 楼 xuxm2007 2012-06-14  
楼主在杭州什么公司呢?
4 楼 xuxm2007 2012-06-14  
langyu 写道
xuxm2007 写道
不好意思 一不小心直接提交了
而且那三个显示的也没有你这个全面?是版本的问题,还是需要设置的问题

这是因为版本的问题。我所列出的这些都是0.21版本默认提供的项。


ok 非常感谢
以后多向你请教
3 楼 langyu 2012-06-13  
xuxm2007 写道
不好意思 一不小心直接提交了
而且那三个显示的也没有你这个全面?是版本的问题,还是需要设置的问题

这是因为版本的问题。我所列出的这些都是0.21版本默认提供的项。
2 楼 xuxm2007 2012-06-13  
不好意思 一不小心直接提交了
而且那三个显示的也没有你这个全面?是版本的问题,还是需要设置的问题
1 楼 xuxm2007 2012-06-13  
请问我用的是0.19.2
只能看到"File Systems" "Job Counters" "Map-Reduce Framework"

相关推荐

Global site tag (gtag.js) - Google Analytics