`

hadoop 计数器 Counter

 
阅读更多

 

 

 

0 计数器相当于开车中的仪表盘,用于提醒功能, 计数可以再map阶段,也可以在reduce阶段

 

1 写法代码:

 

package counter;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Counter;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

/**
 * 实现单词计数功能
 * 增加自定义计数器功能
 * 测试文件 hello内容为:
 * hello	you
 * hello	me	me	me
 * @author zm
 *
 * 计数器相当于开车中的仪表盘,用于提醒功能
 */
public class MyWordCounter {

	static String FILE_ROOT = "hdfs://master:9000/";
	static String FILE_INPUT = "hdfs://master:9000/hello";
	static String FILE_OUTPUT = "hdfs://master:9000/out";
	public static void main(String[] args) throws IOException, URISyntaxException, InterruptedException, ClassNotFoundException {
		
		Configuration conf = new Configuration();
		FileSystem fileSystem = FileSystem.get(new URI(FILE_ROOT),conf);
		Path outpath = new Path(FILE_OUTPUT);
		if(fileSystem.exists(outpath)){
			fileSystem.delete(outpath, true);
		}
		
		// 0 定义干活的人
		Job job = new Job(conf);
		// 1.1 告诉干活的人 输入流位置     读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数
		FileInputFormat.setInputPaths(job, FILE_INPUT);
		// 指定如何对输入文件进行格式化,把输入文件每一行解析成键值对
		job.setInputFormatClass(TextInputFormat.class);
		
		//1.2 指定自定义的map类
		job.setMapperClass(MyMapper.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(LongWritable.class);
		
		//1.3 分区
		job.setNumReduceTasks(1);
		
		//1.4 TODO 排序、分组    目前按照默认方式执行
		//1.5 TODO 规约
		
		//2.2 指定自定义reduce类
		job.setReducerClass(MyReducer.class);
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(LongWritable.class);
		
		//2.3 指定写出到哪里
		FileOutputFormat.setOutputPath(job, outpath);
		job.setOutputFormatClass(TextOutputFormat.class);
		
		// 让干活的人干活
		job.waitForCompletion(true);
		
	}
	
}

/**
 * 继承mapper 覆盖map方法,hadoop有自己的参数类型
 * 读取hdfs中的文件。每一行解析成一个<k,v>。每一个键值对调用一次map函数,
 * 这样,对于文件hello而言,调用MyMapper方法map后得到结果:
 * <hello,1>,<you,1>,<hello,1>,<me,1>
 * 方法后,得到结果为: 
 * KEYIN,      行偏移量
 * VALUEIN,    行文本内容(当前行)
 * KEYOUT,     行中出现的单词
 * VALUEOUT    行中出现单词次数,这里固定写为1
 *
 */
class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{

	@Override
	protected void map(LongWritable k1, Text v1, Context context)
			throws IOException, InterruptedException {
	//定义计数器  
		Counter helloCounter = context.getCounter("Sensitive Words", "hello");
		String line = v1.toString();
		if(line.contains("hello")){
			helloCounter.increment(1);
		}
		String[] v1s = v1.toString().split("\t");
		for(String word : v1s){
			context.write(new Text(word), new LongWritable(1));
		}
	}
}

/**
 * <hello,{1,1}>,<me,{1}>,<you,{1}>, 每个分组调用一次 reduce方法
 * 
 * KEYIN,     行中出现单词
 * VALUEIN,   行中出现单词个数
 * KEYOUT,    文件中出现不同单词
 * VALUEOUT   文件中出现不同单词总个数
 */
class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{

	protected void reduce(Text k2, Iterable<LongWritable> v2s, Context ctx)
			throws IOException, InterruptedException {
		long times = 0L;
		for(LongWritable l : v2s){
			times += l.get();
		}
		ctx.write(k2, new LongWritable(times));
	}
	
}


 

 

 

2 运行后计数结果不会写入到hdfs中,仅仅用于一个展示效果,如下:

 

............
14/12/08 19:05:20 INFO mapred.JobClient: Counters: 20
14/12/08 19:05:20 INFO mapred.JobClient:   Sensitive Words
14/12/08 19:05:20 INFO mapred.JobClient:     hello=2
......

 

分享到:
评论

相关推荐

    javamap源码-HADOOP-COUNTER-SOURCE-CODE:在HadoopMapReduce编码中使用自定义计数器的Java程序

    在Hadoop MapReduce框架中,计数器(Counter)是一个重要的功能,用于在分布式计算过程中跟踪和统计各种指标。在“javamap源码-HADOOP-COUNTER-SOURCE-CODE”项目中,我们可以深入理解如何在Java程序中利用Hadoop的...

    18、MapReduce的计数器与通过MapReduce读取-写入数据库示例

    在MapReduce中,计数器(Counter)是一个非常重要的工具,它允许开发者在MapReduce作业执行过程中收集和跟踪各种统计信息,帮助理解和优化程序的性能。计数器分为两类:Hadoop内置的计数器和自定义计数器。 内置...

    Hadoop命令手册

    - `-counter &lt;job-id&gt; &lt;group-name&gt; &lt;counter-name&gt;`: 查询计数器信息。 - `-kill &lt;job-id&gt;`: 终止作业。 - `-events &lt;job-id&gt; &lt;from-event-#&gt; &lt;#-of-events&gt;`: 获取事件日志。 - `-history [all]`: 查看作业...

    Hadoop源代码分析(类TaskStatus)

    - **Counters.Counter**:表示一个单独的计数器,其中包含了计数器的名称、显示名称和值。 - **Counters.Group**:将相关的`Counters.Counter`聚合在一起,并为这些计数器分组提供一个统一的名称和显示名称。 #### ...

    jsp实现网页计数器(防刷新计数和防刷新单用户计数)

    此外,还可以引入分布式计数器,比如Google的Bigtable或Hadoop的HBase,以支持大规模网站的访问统计。 通过上述方法,我们可以创建一个更健壮、更符合实际需求的网页计数器。在实际项目中,根据业务场景选择合适的...

    JVM与Hadoop介绍

    - **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。 - **虚拟机栈(Java Virtual Machine Stack)**:每个线程私有的,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - ...

    介绍基于Hadoop的C++扩展和新的任务计划

    - **高级接口**:允许用户自定义更多的功能,如JobConf用于获取作业配置、Counter允许用户定义计数器等。 #### 七、HCE实例——Word Count 以Word Count为例,展示了如何使用HCE进行MapReduce任务的编写和执行。...

    hadoop命令大全

    - `counter`: 显示作业计数器。 - `status`: 查询作业的状态。 - `kill`: 终止一个正在运行的作业。 - `submit`: 提交一个新的作业。 #### 3. 管理命令 这部分命令主要用于Hadoop集群的管理维护工作。 ##### 3.1 ...

    人工智能-项目实践-聚类-基于MapReduce爬虫,可抽取各大新闻网站的新闻正文并进行分类和聚类.zip

    人工智能-项目实践-聚类-...这个POJO包含了正文,标题,URL,该页面的ID号(ID号是通过种子地址在种子文件中的偏移量也就是我们所谓的当前Slaves机器的ID号+一个叠加的计数器,即ID=CrawlerID+counter)。 然后将这个

    MapReduce Tutorial 思考总结

    9. **Counter**:计数器用于在MapReduce程序中跟踪和报告统计信息,如处理的记录数或错误发生的次数。 10. **Job Configuration**:Job配置包含了作业的所有设置,如输入输出路径、Mapper和Reducer类、内存管理参数...

    pig udf 函数(urldecode row_number tomap)

    这个 UDF 会为每一条记录增加计数器,返回当前的计数值。 3. **Tomap UDF**: `tomap` 函数用于将一组键值对转换为 Pig 的 Map 类型。在 Pig Latin 中,Map 是一个关联数组,允许我们通过键来查找值。自定义的 `...

    HCE 教程指导

    `setup` 方法初始化了一个计数器,用于统计输入的单词总数。`map` 方法实现了单词计数的核心逻辑,将输入文本中的每个单词作为键,值为 1,然后通过 `context.write` 方法输出。 ##### 2. Makefile 为了构建项目,...

    java面试必备题,架构师的必经之路

    主要分为堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。堆内存用于存储对象实例,方法区存放类信息,虚拟机栈保存...

    wiki_map_reduce

    hadoop jar {jar} wiki.Runner {input} {output [ignored]} 文档计数器 - 一切都很愚蠢,计算文档数量:{docid, text} -M-&gt; {1, 1} -R-&gt; {documents_count} skiplist_builder - 建立一个被忽略的单词列表: {docid,...

    域名排名、收录、查询系统

    "counter.inc"可能是一个计数器脚本,用于更新和读取域名的访问或查询次数。"index.php"是网站的主页源代码,处理用户请求并与服务器交互。"说明.txt"包含系统使用说明或开发者注释,而"chinaz.com.txt"可能是一个...

    JavaVM运作原理

    5. **地址数据和指令(Address Data & Instruction)**:包括程序计数器(Program Counter)和其他隐式寄存器。 6. **本地方法接口(Native Method Interface)**:允许调用外部语言编写的代码。 7. **本地方法库(Native ...

    java虚拟机简介 jvm介绍

    1. **程序计数器寄存器**(Program Counter Register, pc):记录当前线程所执行的字节码指令地址。 2. **操作数栈顶寄存器**(Operand Stack Top Register, optop):指示操作数栈顶的位置。 3. **帧指针寄存器**...

Global site tag (gtag.js) - Google Analytics