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

[经验分享] 基于计算机资源分析hadoop的默认counter

[复制链接]

尚未签到

发表于 2018-10-31 10:46:42 | 显示全部楼层 |阅读模式
前言
  由于项目中,需要统计每个业务组使用的计算机资源,如cpu,内存,io读写,网络流量。所以需要阅读源码查看hadoop的默认counter。
  MapReduce Counter可以观察MapReduce job运行期的一些细节数据,Counter有"组group"的概念,用于表示逻辑上相同范围的所有数值。
cpu
  如何衡量mapreduce的任务的计算量呢,如果按照任务的运行时间,有些任务的大部分时间可能卡在最后一个reduce,或者运行期间有资源抢占问题,造成运行时间较高。如果按照任务的map数和reduce数,也是不准确的,因为有些map和reduce处理的数据量很少,运行时间很短。
  hadoop任务的运行使用的cpu时间,才是衡量任务的计算量,hadoop提供的counter:"Map-Reduce Framework:CPU time spent (ms)",就是任务运行耗费的cpu时间,这个cpu时间是如何统计出来的,是hadoop在运行期间,每个task会从/proc//stat读取对应进程的用户cpu时间和内核cpu时间,他们的和就是cpu时间。
  附:task获取cpu时间的源码:org.apache.hadoop.mapred.Task.updateResourceCounters--> org.apache.hadoop.util.LinuxResourceCalculatorPlugin.getProcResourceValues(获取cpu和内存资源)--> org.apache.hadoop.util.ProcfsBasedProcessTree.getProcessTree.
内存
  hadoop默认counter,获取内存信息,有以下参数:
  "Map-Reduce Framework:Physical memory (bytes) snapshot" 每个task会从/proc//stat读取对应进程的内存快照,这个是进程的当前物理内存使用大小。
  "Map-Reduce Framework:Virtual memory (bytes) snapshot" 每个task会从/proc//stat读取对应进程的虚拟内存快照,这个是进程的当前虚拟内存使用大小。
  "Map-Reduce Framework:Total committed heap usage (bytes)" 每个task的jvm调用Runtime.getRuntime().totalMemory()获取jvm的当前堆大小。
  附:task获取内存的源码:org.apache.hadoop.mapred.Task.updateResourceCounters
io读写
  hadoop读写文件,都是使用org.apache.hadoop.fs.FileSystem.open一个文件,如果是hdfs文件,就有hdfs://开头的文件url,如果是本地文件,就是file://开头的文件url。所以每个task的文件读写情况,都可以从FileSystem.getAllStatistics()获取,而hadoop使用FileSystemCounters记录了FileSystem的一切io读写大小,FileSystemCounters分析如下:
  "FileSystemCounters:HDFS_BYTES_READ"  job执行过程中,只有map端运行时,才从HDFS读取数据,这些数据不限于源文件内容,还包括所有map的split元数据。所以这个值应该比FileInputFormatCounters.BYTES_READ 要略大些。
  "FileSystemCounters:HDFS_BYTES_WRITTEN" job执行过程中,累计写入HDFS的数据大小,reduce在执行完毕后,会写入到HDFS(存在只有map,没有reduce的情况,该情况是map执行完毕把结果写入到HDFS)。
  "FileSystemCounters:FILE_BYTES_READ" 累计读取本地磁盘的文件数据大小,map和reduce端有排序,排序时需要读写本地文件。
  "FileSystemCounters:FILE_BYTES_WRITTEN" 累计写入本地磁盘的文件数据大小,map和reduce端有排序,排序时需要读写本地文件,还有reduce做shuffle时,需要从map端拉取数据,也存在写入本地磁盘文件的情况。
  附:FileSystemCounters相关代码:org.apache.hadoop.mapred.Task.updateResourceCounters--> org.apache.hadoop.mapred.Task.FileSystemStatisticUpdater.updateCounters
  FileSystemCounters的counter对于io读写的数据,已经很齐全,但是hadoop还有一些细微的io读写的counter:
  "File Input Format Counters:Bytes Read" job执行过程中,Map端从HDFS读取的输入的split的源文件内容大小,但是不包括map的split元数据,所以这个值和"FileSystemCounters:HDFS_BYTES_READ"略小,但是很接近。如果map输入的源文件是压缩文件,它的值只是压缩文件解压前的大小(附:代码位于org.apache.hadoop.mapred.MapTask.TrackedRecordReader.fileInputByteCounter)。
  "Map-Reduce Framework:Map input bytes" job执行过程中,Map端从HDFS读取的输入的split的源文件内容大小,如果源文件是压缩文件,它的值是压缩文件解压后的大小(附:代码位于org.apache.hadoop.mapred.MapTask.TrackedRecordReader.inputByteCounter)。
  "File Output Format Counters:Bytes Written" job执行过程中,会分为map和reduce,但是也可能存在只有map的情况,但是job执行完毕后,一般都要把结果写入到hdfs,该值是结果文件的大小,如果是压缩文件,它的值只是压缩文件解压前的大小(附:代码位于org.apache.hadoop.mapred.MapTask.DirectMapOutputCollector.fileOutputByteCounter和org.apache.hadoop.mapred.ReduceTask.NewTrackingRecordWriter.fileOutputByteCounter)。
  但是这些细微的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框架,自行产生网络通信,这部分流量是无法被统计。
  参考资料 http://www.cnblogs.com/xuxm2007/archive/2012/06/15/2551030.html
  Ref:http://www.cnblogs.com/ggjucheng/archive/2013/05/08/3065220.html


运维网声明 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-628872-1-1.html 上篇帖子: 从hadoop框架与MapReduce模式中谈海量数据处理 下篇帖子: Hadoop + MapReduce 端口自定义配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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