Java的MapReduce之计数器使用
学完了MapReduce的基础概念和如何用java实现Mapper和Reducer之后,让我们来看一些高级内容。本期,先给大家介绍一下计数器——Counter的使用。
计数器的定义
MapReduce计数器是什么
计数器Counter是MapReduce用来记录Job执行过程中某些感兴趣的变量情况的,包括Job执行进度和状态,以及一些自定义变量。
计数器也可以理解为MapReduce提供的一种基于全局统计的日志,可以在程序的某个位置插入计数器,记录数据或者进度的变化情况。
MapReduce计数器的格式
MapReduce中的每个计数器都有两个相关的参数:计数器组名称(groupName)和计数器名称(counterName),当我们定义一个计数器,或者查找一个计数器的时候,必须提供两个名称。
MapReduce计数器能做什么
从MapReduce是什么我们可以看出,计数器的功能主要分为两个方面:
1 性能调试
2 全局统计
在性能调试方面,MapReduce 计数器为我们提供一个窗口,用于观察MapReduce Job运行期的各种细节数据。这些细节对MapReduce性能调优很有帮助,MapReduce性能优化的评估大部分都是基于这些 Counter 的数值表现出来的。
在全局统计方面,我们可以自定义计数器,从而自动实现关键变量的全局统计,而不需要我们进行额外的操作(比如代码完成之后进行再次读写统计、或者新起一个mr用于统计等)。
MapReduce计数器的分类
从上面的描述中,我们也看到了,MapReduce中的计数器主要分为两部分:
1 原生计数器/内置计数器
2 自定义计数器
所以,我们今天讲解的内容也主要围绕着这两部分:
1 原生计数器都有哪些,在什么情况下需要使用?
2 自定义计数器怎么定义,在什么情况下使用?
Hadoop原生的计数器
Hadoop提供原生的计数器主要用于性能调试,鉴于原生计数器数量过多,此处仅分析部分计数器,其余的可以参考文末的链接来详细学习。
Hadoop提供的原生计数器自定义计数器
原生计数器主要用于性能调优,而我们日常工作中想进行全局统计或者调试,则需要使用自定义计数器。
如何使用自定义计数器
1 定义和使用计数器,常使用于Map与Reduce
counter的定义和使用2 获取计数器的值,一般来说常使用于等待Job完成之后的Main中
获取counter的值自定义计数器的主要使用场景
1 全局计数
2 调试错误信息
如果大家从上面认真看下来,就会发现,每次遇到全局统计我都会加粗,是的,这也是我们使用计数器的主要目的,计数器提供了一种自动的适用于分布式的全局统计规范。
只要我们按照初始化-符合条件增加-执行完成后取数,最后得到的就是一个全局的统计值,而我们则不需要关注这其中的实现细节。
这里简单举两个场景:1 大数据下使用计数器来完成计数 2 使用计数器统计调试信息
大数据下使用计数器来完成计数
目标需求:计算某个超大型网站,如淘宝的uv、pv。
情况分析:淘宝部分网页(如主页)单日的访问量非常巨大,无法通过设置reduce_key=page_id来进行去重统计,因为这样单个reduce所要处理的数据量会非常的巨大。这时候,我们就可以设置reduce_key=user_id,然后在reduce里使用计数器来实现。
具体实现思路
map:对原始的输入数据 page_id:user_id的表进行处理,如只选取业务所需字段,只选择目标时间段等。map输出user_id:page_id|1。
combine:对map产生的数据进行本地求和,即对于同一个user_id下page_id进行求和。combine输出user_id:page_id|n。
reduce:使用两个计数器组,uv组和pv组分别对combine输出的文件用计数器计数。
伪码实现
计算淘宝首页uv、pv的伪码结果展示
使用计数器计算淘宝uv、pv结果展示当然,其他的处理方法还有分成多个mr任务,或者针对user_id也取一部分作为key等,此处按下不表。
使用计数器统计调试信息
对一些关键的调试信息点,我们也可以使用计数器来获得一个全局的调试信息。比如,我们需要统计一个发送信息的模块发送成功和失败的具体个数。
使用计数器统计调试信息总结:凡是需要用到计数,尤其是需要全局统计计数的时候,绝大多数业务场景,都可以使用并且推荐使用计数器。
自定义计数器高级使用
1 获取所有counters
2 设置counter数组
3 counter数量限制
文集链接
文章链接
参考文献: