老的API实现WordCount

使用Hadoop版本0.x实现单词统计

  1 package old;
  2
  3 import java.io.IOException;
  4 import java.net.URI;
  5 import java.util.Iterator;
  6
  7 import org.apache.hadoop.conf.Configuration;
  8 import org.apache.hadoop.fs.FileSystem;
  9 import org.apache.hadoop.fs.Path;
 10 import org.apache.hadoop.io.LongWritable;
 11 import org.apache.hadoop.io.Text;
 12 import org.apache.hadoop.mapred.FileInputFormat;
 13 import org.apache.hadoop.mapred.FileOutputFormat;
 14 import org.apache.hadoop.mapred.JobClient;
 15 import org.apache.hadoop.mapred.JobConf;
 16 import org.apache.hadoop.mapred.MapReduceBase;
 17 import org.apache.hadoop.mapred.Mapper;
 18 import org.apache.hadoop.mapred.OutputCollector;
 19 import org.apache.hadoop.mapred.Reducer;
 20 import org.apache.hadoop.mapred.Reporter;
 21
 22 /**
 23  * 老API实现单词统计
 24  *
 25  */
 26 /**
 27  * hadoop版本1.x的包一般是mapreduce
 28  *
 29  * hadoop版本0.x的包一般是mapred
 30  *
 31  */
 32
 33 public class OldApp {
 34
 35     static final String INPUT_PATH = "hdfs://chaoren:9000/hello";
 36     static final String OUT_PATH = "hdfs://chaoren:9000/out";
 37
 38     public static void main(String[] args) throws Exception {
 39         Configuration conf = new Configuration();
 40         FileSystem fileSystem = FileSystem.get(new URI(INPUT_PATH), conf);
 41         Path outPath = new Path(OUT_PATH);
 42         if (fileSystem.exists(outPath)) {
 43             fileSystem.delete(outPath, true);
 44         }
 45         /**
 46          * 改动1:不再使用Job,而是使用JobConf
 47          *
 48          * 改动2:类的包名不再使用mapreduce,而是使用mapred
 49          *
 50          * 改动3:不再使用job.waitForCompletion(true)提交作业,而是使用JobClient.runJob(job);
 51          */
 52         JobConf job = new JobConf(conf, OldApp.class);
 53
 54         // 1.1指定读取的文件位于哪里
 55         FileInputFormat.setInputPaths(job, INPUT_PATH);
 56         // 指定如何对输入的文件进行格式化,把输入文件每一行解析成键值对
 57         // job.setInputFormatClass(TextInputFormat.class);
 58
 59         // 1.2指定自定义的map类
 60         job.setMapperClass(MyMapper.class);
 61         // map输出的<k,v>类型。如果<k3,v3>的类型与<k2,v2>类型一致,则可以省略
 62         // job.setOutputKeyClass(Text.class);
 63         // job.setOutputValueClass(LongWritable.class);
 64
 65         // 1.3分区
 66         // job.setPartitionerClass(org.apache.hadoop.mapreduce.lib.partition.HashPartitioner.class);
 67         // 有一个reduce任务运行
 68         // job.setNumReduceTasks(1);
 69
 70         // 1.4排序、分组
 71
 72         // 1.5归约
 73
 74         // 2.2指定自定义reduce类
 75         job.setReducerClass(MyReducer.class);
 76         // 指定reduce的输出类型
 77         job.setOutputKeyClass(Text.class);
 78         job.setOutputValueClass(LongWritable.class);
 79
 80         // 2.3指定写出到哪里
 81         FileOutputFormat.setOutputPath(job, outPath);
 82         // 指定输出文件的格式化类
 83         // job.setOutputFormatClass(TextOutputFormat.class);
 84
 85         // 把job提交给jobtracker运行
 86         JobClient.runJob(job);
 87     }
 88
 89     /**
 90      * 新API:extends Mapper
 91      *
 92      * 老API:extends MapReduceBase implements Mapper
 93      */
 94     static class MyMapper extends MapReduceBase implements
 95             Mapper<LongWritable, Text, Text, LongWritable> {
 96         public void map(LongWritable k1, Text v1,
 97                 OutputCollector<Text, LongWritable> collector, Reporter reporter)
 98                 throws IOException {
 99             String[] split = v1.toString().split("\t");
100             for (String word : split) {
101                 collector.collect(new Text(word), new LongWritable(1));
102             }
103         }
104     }
105
106     static class MyReducer extends MapReduceBase implements
107             Reducer<Text, LongWritable, Text, LongWritable> {
108         public void reduce(Text k2, Iterator<LongWritable> v2s,
109                 OutputCollector<Text, LongWritable> collector, Reporter reporter)
110                 throws IOException {
111             long times = 0L;
112             while (v2s.hasNext()) {
113                 long temp = v2s.next().get();
114                 times += temp;
115             }
116             collector.collect(k2, new LongWritable(times));
117         }
118     }
119
120 }

查看结果:

时间: 2024-08-28 08:41:57

老的API实现WordCount的相关文章

5.hadoop流原理、实例和新旧API下Wordcount详解

前四篇文章讲了Hadoop的配置和测试以及eclipse下的使用,有兴趣的可以先看下. 1.Hadoop流简介 用可执行文件作为Mapper和Reducer,接受的都是标准输入,输出的都是标准输出. 当一个可执行文件作为Mapper时,每一个Map任务会以一个独立的进程启动这个可执行文件,然后在Map任务运行时,会把输入切分成行提供给可 执行文件,并作为它的标准输入(stdin)内容.当可执行文件运行出结果时,Map从标准输出(stdout)中收集数据,并将其转化 为<key, value>对

使用老版本的java api提交hadoop作业

还是使用之前的单词计数的例子 自定义Mapper类 import java.io.IOException; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.MapReduceBase; import org.apache.hadoop.mapred.Mapper; import org.apache.hadoop.mapred.O

Android 新老两代 Camera API 大起底

https://blog.csdn.net/Byeweiyang/article/details/80515192 0.背景简介 最近有一部分相机相关的需求,专注于对拍摄的照片.视频的噪点.色温.明暗等方面进行优化.一般我们在生活中使用相机来拍照的话,在前期拍摄时,就可以通过调整相机的拍摄参数,如:曝光时间.光圈大小.ISO.曝光补偿等等,使得拍摄下来的照片本来的色彩.明暗就处于比较理想的状态,无需过度依赖后期处理.而手机端的拍摄则往往受限于硬件和机型,无法在前期如此"收放自如",我们

API的文档自动生成——基于CDIF的SOA基本能力

当前,作为大部分移动app和云服务后台之间的标准连接方式,REST API已经得到了绝大部分开发者的认可和广泛的应用.近年来,在新兴API经济模式逐渐兴起,许多厂商纷纷将自己的后台业务能力作为REST API开放出来,给更广泛的第三方开发者使用. 但是,管理REST API并非是一件容易的工作.由于缺乏有效的接口数据schema约束,加上设计REST API时resource endpoint的安排,以及发送http请求的方式又都五花八门,REST API开发完成后,大多数情况下API开发者仍然

知乎API

声明 以下所有 API 均由 知乎(Zhihu.Inc) 提供.获取与共享之行为或有侵犯知乎权益的嫌疑,若被告知需停止共享与使用. 请您了解相关情况,并遵守知乎协议. API 说明 知乎日报的消息以 JSON 格式输出 网址中 api 后数字代表 API 版本,过高或过低均会得到错误信息 较老的接口(启动界面图像获取,最新消息,过往消息)中将数字 2 替换为 1.2 获得效果相同,替换为 1.1 获得的是老版本 API 输出的 JSON 格式(替换为更低,如 1.0,或更高,如 1.3,将会获得

【白痴弟弟和你加强应用层】阅读 Develop API Guides 思考(一个)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 动态检測设备属性 关于targetSdkVersion的含义 关于onSaveInstanceState的高级知识 关于startActivity和Intent 动态检測设备属性 我们能够使用以下的代码动态检測当前设备是否具备某一个特性,如是否有方向传感器 PackageManager pm = getPackageManager(); if(!pm.hasSystemFeature(PackageMan

Atitit Atitit.软件兼容性原理----------API兼容 Qa7

1. 兼容性的重要性与反面教材1 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改,莫删除3 2.3. 计划赶不上变化,永远api修改也不可能整齐划一,反而带来不兼容的风险3 3. 把握API的生命周期andAPI分级3 4. 对兼容性保持友好的api设计方法3 4.1. 细粒度的方法3 4.2. Ioc容器动态配置3 4.3. 把你的method()视为全局global的,确保每一个方法都不重名尽可能..不要幻想有模块命名空间等,

RESTful API设计实践

1.通过请求类型区分CRUD 方法 操作 场景 GET 读 /cars /cars/711 POST 创建 /cars PUT 修改 /cars/711 /cars PATCH 部分修改 /cars/711 DELETE 删除 /cars/711 2.资源采用名词,且使用复数 GET /tickets - 获取 tickets 列表GET /tickets/12 - 获取一个单独的 ticketPOST /tickets - 创建一个新的 ticketPUT /tickets/12 - 更新 t

知乎日报 API 分析

声明 下面全部 API 均由 知乎(Zhihu.Inc) 提供,本人採取非正常手段获取. 获取与共享之行为或有侵犯知乎权益的嫌疑.若被告知需停止共享与使用.本人会及时删除此页面与整个项目. 请您暸解相关情况.并遵守知乎协议. API 说明 知乎日报的消息以 JSON 格式输出 网址中 api 后数字代表 API 版本号,过高或过低均会得到错误信息 较老的接口(启动界面图像获取.最新消息,过往消息)中将数字 2 替换为 1.2 获得效果同样.替换为 1.1 获得的是老版本号 API 输出的 JSO