设为首页 收藏本站
查看: 1298|回复: 0

[经验分享] [hadoop源码阅读][5]-counter的使用和默认counter的含义

[复制链接]

尚未签到

发表于 2015-7-13 08:08:00 | 显示全部楼层 |阅读模式
  ps:
  在map和reduce的过程中,可以通过设置Context.setStatus()来随时设置状态,这个底层也是使用reporter来设置的
  1.在0.20.x版本中使用counter很简单,直接定义即可,如无此counter,hadoop会自动添加此counter.
  Counter ct = context.getCounter("INPUT_WORDS", "count");
  ct.increment(1);   
  2.在0.19.x版本中,需要定义enum

  enum MyCounter {INPUT_WORDS };
  reporter.incrCounter(MyCounter.INPUT_WORDS, 1);
  RunningJob job = JobClient.runJob(conf);
  Counters c = job.getCounters();
  long cnt = c.getCounter(MyCounter.INPUT_WORDS);
  
  3.默认counter的含义
  MapReduce Counter为提供我们一个窗口:观察MapReduce job运行期的各种细节数据。今年三月份期间,我曾经专注于MapReduce性能调优工作,是否优化的绝大多评估都是基于这些Counter的数值表 现。MapReduce自带了许多默认Counter,可能有些朋友对它们有些疑问,现在我分析下这些默认Counter的含义,方便大家观察job结 果。
    我的分析是基于Hadoop0.21,我也看过Hadoop其它版本的Counter展现,细节大同小异,如果有差异的地方,以事实版本为主。
    Counter有"组group"的概念,用于表示逻辑上相同范围的所有数值。MapReduce job提供的默认Counter分为五个组,下面逐一介绍。这里也拿我的一份测试数据来做详细比对,它们会以表格的形式出现在各组描述中。
FileInputFormatCounters
    这个group表示map task读取文件内容(总输入数据)的统计
   
  
  Counter
  Map
  Reduce
  Total
  FileInputFormatCounters
  BYTES_READ
  1,109,990,596
  0
  1,109,990,596
  
    BYTES_READ
         Map task的所有输入数据(字节),等于各个map task的map方法传入的所有value值字节之和。

FileSystemCounters
    MapReduce job执行所依赖的数据来自于不同的文件系统,这个group表示job与文件系统交互的读写统计

  
  Counter
  Map
  Reduce
  Total
  FileSystemCounters
  FILE_BYTES_READ
  0
  1,544,520,838
  1,544,520,838
  
  FILE_BYTES_WRITTEN
  1,544,537,310
  1,544,520,838
  3,089,058,148
  
  HDFS_BYTES_READ
  1,110,269,508
  0
  1,110,269,508
  
  HDFS_BYTES_WRITTEN
  0
  827,982,518
  827,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端中间数据时的各种错误。

  
  Counter
  Map
  Reduce
  Total
  Shuffle Errors
  BAD_ID
  0
  0
  0
  
  CONNECTION
  0
  0
  0
  
  IO_ERROR
  0
  0
  0
  
  WRONG_LENGTH
  0
  0
  0
  
  WRONG_MAP
  0
  0
  0
  
  WRONG_REDUCE
  0
  0
  0
  
    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调度相关的统计

  
  Counter
  Map
  Reduce
  Total
  Job Counters
  Data-local map tasks
  0
  0
  67
  
  FALLOW_SLOTS_MILLIS_MAPS
  0
  0
  0
  
  FALLOW_SLOTS_MILLIS_REDUCES
  0
  0
  0
  
  SLOTS_MILLIS_MAPS
  0
  0
  1,210,936
  
  SLOTS_MILLIS_REDUCES
  0
  0
  1,628,224
  
  Launched map tasks
  0
  0
  67
  
  Launched reduce tasks
  0
  0
  8
  
    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, …]}。

  
  Counter
  Map
  Reduce
  Total
  Map-Reduce Framework
  Combine input records
  200,000,000
  0
  200,000,000
  
  Combine output records
  117,838,546
  0
  117,838,546
  
  Failed Shuffles
  0
  0
  0
  
  GC time elapsed (ms)
  23,472
  46,588
  70,060
  
  Map input records
  10,000,000
  0
  10,000,000
  
  Map output bytes
  1,899,990,596
  0
  1,899,990,596
  
  Map output records
  200,000,000
  0
  200,000,000
  
  Merged Map outputs
  0
  536
  536
  
  Reduce input groups
  0
  84,879,137
  84,879,137
  
  Reduce input records
  0
  117,838,546
  117,838,546
  
  Reduce output records
  0
  84,879,137
  84,879,137
  
  Reduce shuffle bytes
  0
  1,544,523,910
  1,544,523,910
  
  Shuffled Maps
  0
  536
  536
  
  Spilled Records
  117,838,546
  117,838,546
  235,677,092
  
  SPLIT_RAW_BYTES
  8,576
  0
  8,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无关,这里记录的大小就是表示额外信息的字节大小
  

  4.分析counter和reporter的
  http://blog.sina.com.cn/s/blog_61ef49250100uxwh.html
  5.其他
  Hadoop: The Definitive Guide 第8章hadoop features
  http://blog.sina.com.cn/s/blog_61ef49250100uxwh.html
  http://lintool.github.com/Cloud9/docs/content/counters.html

  http://langyu.iteye.com/blog/1171091

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-85920-1-1.html 上篇帖子: [Hadoop数据分析平台:第一周]关于Google矩阵和PageRank的求解方法 下篇帖子: Hadoop日记Day17---计数器、map规约、分区学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表