美文网首页
Java的MapReduce之计数器使用

Java的MapReduce之计数器使用

作者: 追寻者的小憩书铺 | 来源:发表于2018-09-19 16:56 被阅读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计数器的使用

    相关文章

      网友评论

          本文标题:Java的MapReduce之计数器使用

          本文链接:https://www.haomeiwen.com/subject/ctfcgftx.html