Hadoop之计数器与自定义计数器及Combiner的使用
1,计数器:
显示的计数器中分为四个组,分别为:File Output Format Counters、FileSystemCounters、File Input Format Counters和Map-Reduce Framkework。
分组File Input Format Counters包括一个计数器Bytes Read,表示job执行结束后输出文件的内容包括的字节数(空格、换行都是字符)

关于以上这段计数器日志中详细的说明请见下面的注释:
1 Counters: 19 // Counter表示计数器,19表示有19个计数器(下面一共4计数器组)
2 File Output Format Counters // 文件输出格式化计数器组
3 Bytes Written=19 // reduce输出到hdfs的字节数,一共19个字节
4 FileSystemCounters// 文件系统计数器组
5 FILE_BYTES_READ=481
6 HDFS_BYTES_READ=38
7 FILE_BYTES_WRITTEN=81316
8 HDFS_BYTES_WRITTEN=19
9 File Input Format Counters // 文件输入格式化计数器组
10 Bytes Read=19 // map从hdfs读取的字节数
11 Map-Reduce Framework // MapReduce框架
12 Map output materialized bytes=49
13 Map input records=2 // map读入的记录行数,读取两行记录,”hello you”,”hello me”
14 Reduce shuffle bytes=0 // 规约分区的字节数
15 Spilled Records=8
16 Map output bytes=35
17 Total committed heap usage (bytes)=266469376
18 SPLIT_RAW_BYTES=105
19 Combine input records=0 // 合并输入的记录数
20 Reduce input records=4 // reduce从map端接收的记录行数
21 Reduce input groups=3 // reduce函数接收的key数量,即归并后的k2数量
22 Combine output records=0 // 合并输出的记录数
23 Reduce output records=3 // reduce输出的记录行数。<helllo,{1,1}>,<you,{1}>,<me,{1}>
24 Map output records=4 // map输出的记录行数,输出4行记录
2,自定义计数器:
由于不同的场景有不同的计数器应用需求,我们可以自定义不同的计数器:
一:敏感词准备:

将文件中的hello设为敏感词,自定义计数器的目的是将文件中出现的计数器的次数给记录出来
二:代码部分:
仅需要修改之前博客中WordClass中的map的代码部分:
public class WordClass {
public static class MyMapper extends org.apache.hadoop.mapreduce.Mapper<LongWritable, Text, Text, LongWritable> {
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context) throws IOException, InterruptedException {
//动态申明
Counter sensitiveCounter = context.getCounter("Sensitive Words", "hello");
String line = value.toString();
//假设hello是一个敏感词
if (line.contains("hello")){
sensitiveCounter.increment(1L);
}
String[] split = line.split("\t");
for (String word :
split) {
context.write(new Text(word), new LongWritable(1));
}
}
}
计数器声明
1.通过枚举声明 context.getCounter(Enum enum)
2.动态声明 context.getCounter(String groupName,String counterName)
计数器操作
counter.setValue(long value);//设置初始值
counter.increment(long incr);//增加计数
三:结果

在日志信息中可以看到文件中的敏感词信息
3,Combiner的使用
Combiner的作用就是在map端对数据进行合并,从而提高网络的通讯速率,减少map到reduce的网络带宽
我们可以本地把Map的输出做一个合并计算,把具有相同key的数据做一个计算,然后再把此输出作为reduce的输入,这样传给reduce的数据就少了很多。Combiner是用reducer来定义的,多数的情况下Combiner和reduce处理的是同一种逻辑,所以job.setCombinerClass()的参数可以直接使用定义的reduce,括号中可以直接传入类似于MyReducer.Class,当然也可以单独去定义一个有别于reduce的Combiner,继承Reducer,写法基本上定义reduce一样。
----那么,既然Combiner这么有用为什么不能将它作为默认设置呢?
----因为当有类似于求平均数的任务时,在map端执行Combiner会影响最终的结果,所以有些操作并不适合用Combiner,在工作使用中我们应该先选取小部分的数据进行测试,如果结果无误的话,则可以使用Combiner进行map端的数据合并
Hadoop之计数器与自定义计数器及Combiner的使用的更多相关文章
- Hadoop学习笔记—7.计数器与自定义计数器
一.Hadoop中的计数器 计数器:计数器是用来记录job的执行进度和状态的.它的作用可以理解为日志.我们通常可以在程序的某个位置插入计数器,用来记录数据或者进度的变化情况,它比日志更便利进行分析. ...
- 9.1hadoop 内置计数器、自定义枚举计数器、Streaming计数器
1.1 计数器 计数器的作用是用来统计数量的,用于记录特定事件的次数,分为内置计数器.自定义java枚举计数器.自定义Stream计数器三大类.用于质量分析,或应用级统计.分析计数器的值比分析一堆日 ...
- ionic3.x angular4.x ng4.x 自定义组件component双向绑定之自定义计数器
本文主要示例在ionic3.x环境下实现一个自定义计数器,实现后最终效果如图: 1.使用命令创建一个component ionic g component CounterInput 类似的命令还有: ...
- CSS计数器(自定义列表)
概念 CSS3计数器(CSS Counters)可以允许我们使用css对页面中的任意元素进行计数,实现类似于有序列表的功能(自定义有序列表) 与有序列表相比,它的突出特性在于可以对任意元素计数,同时实 ...
- CSS计数器(自定义列表)Demo
html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...
- Hadoop学习笔记—5.自定义类型处理手机上网日志
转载自http://www.cnblogs.com/edisonchou/p/4288737.html Hadoop学习笔记—5.自定义类型处理手机上网日志 一.测试数据:手机上网日志 1.1 关于这 ...
- Hadoop生态圈-hive编写自定义函数
Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions)
Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- Hadoop生态圈-Hive的自定义函数之UDAF(User-Defined Aggregation Function)
Hadoop生态圈-Hive的自定义函数之UDAF(User-Defined Aggregation Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
随机推荐
- [转]URL传中文参数导致乱码的解决方案之encodeURI
通过URL传中文参数时,在服务端后台获取到的值往往会出现乱码.解决方案有很多种.本文介绍如何通过encodeURI来解决中文乱码问题. 首先,在前端页面准备参数的时候,需要对中文参数进行encode处 ...
- 判断电脑CPU硬件支不支持64位
你可以在注册表中查看: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\PROCESSO ...
- 【多线程】 Task ,async ,await
[多线程]Task ,async ,await 一. WinForm 里经常会用到多线程, 多线程的好出就不多说了,来说说多线程比较麻烦的地方 1. UI 线程与其他线程的同步,主要是 Form 和 ...
- 程序员编程利器:20款最好的免费的IDEs和编辑器
程序员编程利器:20款最好的免费的IDEs和编辑器 还没转眼明年可就大年三十了,忙的可真是晕头转了个向,看着亲朋好友们那让人欣羡的小肚腩,不禁感慨,岁月是一把猪饲料,绿了芭蕉,肥了那杨柳小蛮腰,可怜我 ...
- SSH公钥认证(码云)
开发者向码云版本库写入最常用到的协议是 SSH 协议,因为 SSH 协议使用公钥认证,可以实现无口令访问,而若使用 HTTPS 协议每次身份认证时都需要提供口令.使用 SSH 公钥认证,就涉及到公钥的 ...
- 常用的gif加载动态图片
精心搜集的网页素材,包括:Loading GIF动画,"正在加载中"小图片,"请等待"小图标等,欢迎您的下载. 提示:点击鼠标右键,选择”图片另存为“即可轻松保 ...
- winform timer时间间隔小于执行时间
如果SetTimer的时间间隔为t,其响应事件OnTimer代码执行一遍的时间为T,且T>t.这样,一次未执行完毕,下一次定时到,这时候程序会如何执行? 可能的情况:1.丢弃还未执行的代码,开始 ...
- truffle开发一个简单的Dapp
1.安装Truffle:npm install -g truffle 2.建立项目目录并进入:mkdir pet-shop-tutorial cd pet-shop-tutorial 3.使用truf ...
- javascript实现自动切换焦点功能学习
当用户在表单中填写完当前字段后,能否自动将焦点跳转到下一个字段以方便用户输入? 为了增强易用性,加快数据输入的速度,可以在前一个文本框中的字符达到一定的设置的字符长度后(比如电话号码,身份证号等),用 ...
- 【Linux】——搭建nexus
1.安装 前提条件: JDK已经安装,运行java -version查看. 将本地下载好的nexus存放到linux上,存放路径为 /usr/local/software.可使用winscp直接拷贝. ...