但是这些细微的counter,没有统计map和reduce排序时文件读写的情况,所以要衡量job任务的io读写情况,我觉得最合适的还是使用FileSystemCounters的counter。
io读写流量大致可以通过上述FileSystemCounters四个参数求和而得,存在不足就是:
"FileSystemCounters:HDFS_BYTES_WRITTEN",它只是一个副本的hdfs的写入大小,而hdfs的块副本是可以调整的,所以io读写流量,还需要"FileSystemCounters:HDFS_BYTES_WRITTEN" * 副本数。
map和reduce都是用户自定义的,存在可能是用户代码绕过hadoop框架,不使用org.apache.hadoop.fs.FileSystem.open文件,这部分io读写流量,是无法被统计的。
网络流量hadoop任务产生网络流量的阶段:map输入从hdfs拉取数据,reduce shuffle时从map端拉取数据,reduce完成往hdfs写入结果(如果没有reduce,就是map完成往hdfs写入结果)。
job和hdfs交互产生的流量,可以通过io读写分析的两个counter获取:"FileSystemCounters:HDFS_BYTES_READ"和"FileSystemCounters:HDFS_BYTES_WRITTEN"
而reduce shuffle时从map端拉取数据产生的流量,对应的counter是:
"Map-Reduce Framework:Reduce shuffle bytes" 它是reduce往map拉取中间结果的累计数据大小,如果map产生的中间结果是压缩文件,它的值是压缩文件解压前的大小(附:代码位于 org.apache.hadoop.mapred.ReduceTask.reduceShuffleBytes)。
网络流量大致可以通过上述三个参数求和而得,存在不足就是:
"FileSystemCounters:HDFS_BYTES_READ"和"FileSystemCounters:HDFS_BYTES_WRITTEN",它没有考虑hadoop对hdfs的本地化优化,hdfs读写块时,如果发现客户端和目标块在同一个节点,会直接通过本地读写,有些块如果在本地,hadoop会直接通过本地文件系统读写,不通过网络读写。
"FileSystemCounters:HDFS_BYTES_WRITTEN",它只是一个副本的hdfs的写入大小,而hdfs的块副本是可以调整的,所以网络流量,还需要"FileSystemCounters:HDFS_BYTES_WRITTEN" * 副本数。
map和reduce都是用户自定义的,存在可能是用户代码绕过hadoop框架,自行产生网络通信,这部分流量是无法被统计。
--------------------------------------分割线 --------------------------------------
Ubuntu 13.04上搭建Hadoop环境
Ubuntu 12.10 +Hadoop 1.2.1版本集群配置
--------------------------------------分割线 --------------------------------------