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 ......
相关推荐
在Hadoop MapReduce框架中,计数器(Counter)是一个重要的功能,用于在分布式计算过程中跟踪和统计各种指标。在“javamap源码-HADOOP-COUNTER-SOURCE-CODE”项目中,我们可以深入理解如何在Java程序中利用Hadoop的...
在MapReduce中,计数器(Counter)是一个非常重要的工具,它允许开发者在MapReduce作业执行过程中收集和跟踪各种统计信息,帮助理解和优化程序的性能。计数器分为两类:Hadoop内置的计数器和自定义计数器。 内置...
- `-counter <job-id> <group-name> <counter-name>`: 查询计数器信息。 - `-kill <job-id>`: 终止作业。 - `-events <job-id> <from-event-#> <#-of-events>`: 获取事件日志。 - `-history [all]`: 查看作业...
- **Counters.Counter**:表示一个单独的计数器,其中包含了计数器的名称、显示名称和值。 - **Counters.Group**:将相关的`Counters.Counter`聚合在一起,并为这些计数器分组提供一个统一的名称和显示名称。 #### ...
此外,还可以引入分布式计数器,比如Google的Bigtable或Hadoop的HBase,以支持大规模网站的访问统计。 通过上述方法,我们可以创建一个更健壮、更符合实际需求的网页计数器。在实际项目中,根据业务场景选择合适的...
- **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。 - **虚拟机栈(Java Virtual Machine Stack)**:每个线程私有的,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。 - ...
- **高级接口**:允许用户自定义更多的功能,如JobConf用于获取作业配置、Counter允许用户定义计数器等。 #### 七、HCE实例——Word Count 以Word Count为例,展示了如何使用HCE进行MapReduce任务的编写和执行。...
- `counter`: 显示作业计数器。 - `status`: 查询作业的状态。 - `kill`: 终止一个正在运行的作业。 - `submit`: 提交一个新的作业。 #### 3. 管理命令 这部分命令主要用于Hadoop集群的管理维护工作。 ##### 3.1 ...
人工智能-项目实践-聚类-...这个POJO包含了正文,标题,URL,该页面的ID号(ID号是通过种子地址在种子文件中的偏移量也就是我们所谓的当前Slaves机器的ID号+一个叠加的计数器,即ID=CrawlerID+counter)。 然后将这个
9. **Counter**:计数器用于在MapReduce程序中跟踪和报告统计信息,如处理的记录数或错误发生的次数。 10. **Job Configuration**:Job配置包含了作业的所有设置,如输入输出路径、Mapper和Reducer类、内存管理参数...
这个 UDF 会为每一条记录增加计数器,返回当前的计数值。 3. **Tomap UDF**: `tomap` 函数用于将一组键值对转换为 Pig 的 Map 类型。在 Pig Latin 中,Map 是一个关联数组,允许我们通过键来查找值。自定义的 `...
`setup` 方法初始化了一个计数器,用于统计输入的单词总数。`map` 方法实现了单词计数的核心逻辑,将输入文本中的每个单词作为键,值为 1,然后通过 `context.write` 方法输出。 ##### 2. Makefile 为了构建项目,...
主要分为堆内存(Heap)、方法区(Method Area)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。堆内存用于存储对象实例,方法区存放类信息,虚拟机栈保存...
hadoop jar {jar} wiki.Runner {input} {output [ignored]} 文档计数器 - 一切都很愚蠢,计算文档数量:{docid, text} -M-> {1, 1} -R-> {documents_count} skiplist_builder - 建立一个被忽略的单词列表: {docid,...
"counter.inc"可能是一个计数器脚本,用于更新和读取域名的访问或查询次数。"index.php"是网站的主页源代码,处理用户请求并与服务器交互。"说明.txt"包含系统使用说明或开发者注释,而"chinaz.com.txt"可能是一个...
5. **地址数据和指令(Address Data & Instruction)**:包括程序计数器(Program Counter)和其他隐式寄存器。 6. **本地方法接口(Native Method Interface)**:允许调用外部语言编写的代码。 7. **本地方法库(Native ...
1. **程序计数器寄存器**(Program Counter Register, pc):记录当前线程所执行的字节码指令地址。 2. **操作数栈顶寄存器**(Operand Stack Top Register, optop):指示操作数栈顶的位置。 3. **帧指针寄存器**...