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
每个c