Java的MapReduce之计数器使用

2018-09-19  本文已影响122人  追寻者的小憩书铺

学完了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数量限制


文集链接

30分钟学会java编写mapreduce

文章链接

5分钟掌握大数据:MapReduce

Java的MapReduce实现:Mapper详解

Java的MapReduce实现:Reduce详解

Java的MapReduce实现:Combine详解

Java的MapReduce之计数器使用

参考文献:

MapReduce计数器

MapReduce计数器的使用

上一篇下一篇

猜你喜欢

热点阅读