博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hadoop之旅6-windows本地MapReducer离线单词统计
阅读量:6232 次
发布时间:2019-06-22

本文共 3660 字,大约阅读时间需要 12 分钟。

通过上篇文章,相信大家都可以在idea上做hadoop访问hdfs文件系统的开发了。一个云盘其实就可以基于这样的系统做出来。有兴趣的大家可以试着自己去实战一下。

今天带大家在本地执行Mapreduce,进行单词个数的统计,一般用于调试。线上模式也很简单,只需要打好jar包,在线上服务通过 hadoop jar xxxx.jar 包名+类 命令执行即可,可自行探究

MapReduce

MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。他也属于hadoop的核心组件之一,hdfs是一个分布式文件系统,MapReduce就是一个分布式计算框架。专门为计算而生

最简单的流程图

  1. 读取文件
  2. map操作
  3. reduce操作
  4. 输出结果文件

详细过程图

在map,reduce中间还有一系列,合并,排序等等过程,系统会将复杂的数据进行整理筛选,最终到达我们需要用代码编写的业务端。我们一般情况做数据离线分析可以只考虑编写map端,reduce端即可。话不多说直接带大家上代码体会。

开始实现

1.首先

在准备好一个输入文件input.txt,放在项目任意一个目录下,我建的是SpringBoot项目放在resources下的map_input目录下

c	2c++	1java	2python	1复制代码

2.导入依赖

2.7.3
org.apache.hadoop
hadoop-common
${hadoop.version}
org.apache.hadoop
hadoop-client
${hadoop.version}
org.apache.hadoop
hadoop-hdfs
${hadoop.version}
复制代码

3.准备自己map端

实现map端其实很简单,只需要创建一个类继承Mapper类,然后实现它的map方法即可。

public class MyMapper extends Mapper
{ /** * * @param key 当前行的标识(键),一般文件输入可以不用管 * @param text 当前行的值 * @param context 上下文内容 * 文件内容: * java,c++ * c,java * python,c */ @Override protected void map(Object key, Text text, Context context) throws IOException, InterruptedException { //拿到当前输入的行内容 String line = text.toString(); //拆分当前行,如 java,c++ String[] lines = line.split(","); for (String word : lines) { /** * 也就是在map端,把输出置为: java 1,c 1,c++ 1等 */ context.write(new Text(word),new LongWritable(1)); } }}复制代码

4.实现Reduce端

同理,继承Reducer类,实现reduce方法即可

/** * 前两个参数:reducer输入参数,即map输出的键,值集合(相同key的会整合在一起) * 后两个参数:reducer 输出的键,值(即最终结果) * 在reduce里做累加即可统计出每个单词的个数 */public class MyReduce extends Reducer
{ @Override protected void reduce(Text key, Iterable
values, Context context) throws IOException, InterruptedException { /** * key,values * 以map里的输出的键值:如:map里输出的是: * c:[1,1]也可能是 c:[2] ,主要涉及MapReducer运行原理中的 分片合并 过程 * c++:[1] * java:[1,1]也可能是java:[2] * python:[1] */ long sum = 0; //该单词总共出现的次数 for (LongWritable value : values) { sum+=value.get(); } context.write(key,new LongWritable(sum)); //输出结果:如,c:2,java:1... }}复制代码

5. 实现客户端代码

调用代码很常规,基本上都是一样的模板

public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {        Configuration conf = new Configuration();        //线上运行在hadoop集群里需要配置        //conf.set("fs.defaultFS", "hdfs://master:9000/");//主master访问路径        //conf.set("mapreduce.framework.name", "yarn"); //运行框架yarn        //conf.set("yarn.resourcemanager.hostname", "master"); //设置主机        Job job = Job.getInstance(conf); //拿到一个作业job,来执行mapReduce        //设置运行的主类        job.setJarByClass(MapReduceClient.class);        job.setJobName("wordCount"); //设置应用名称        //设置输入文件的位置        FileInputFormat.addInputPaths(job,"J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_input");        //设置输出文件的位置        FileOutputFormat.setOutputPath(job,new Path("J:\\IDEA\\springboot-hadoop\\src\\main\\resources\\map_output"));        //设置mapper类和reducer类        job.setMapperClass(MyMapper.class);        job.setReducerClass(MyReduce.class);        //设置输入,输出类型,map和reduce是一样的话可以只写reducer的        job.setOutputKeyClass(Text.class);        job.setOutputValueClass(LongWritable.class);        //执行        job.waitForCompletion(true);    }复制代码

在本地运行有个要求,需要本地hadoop的bin目录下拥有windows下的执行文件。大家可以下好hadoop之后直接解压,然后把复制到bin目录即可

最终的运行结果如下

转载地址:http://xyena.baihongyu.com/

你可能感兴趣的文章
找出表的记录数
查看>>
实现WCF和Unity 的集成
查看>>
Java 和 C#在重写上的区别
查看>>
基础才是重中之重——对var的误会,对不起,我愿望(冤枉)你了
查看>>
集合类型的装配
查看>>
【Linux开发技术之工具使用】配置VIM下编程和代码阅读环境
查看>>
【读书笔记】测试驱动开发(中文版)
查看>>
ExtAspNet v3.0.1
查看>>
javascript 构造函数和方法
查看>>
使用VB.net Express 2010开发AutoCAD.net插件调试时出现很多错误的解决办法
查看>>
.net服务使用笔记(原创)
查看>>
使用Tomcat配置域名
查看>>
[转]Oracle/Altibase数据库中Sequence的用法
查看>>
URAL 1009 K-based Numbers
查看>>
android 知识点汇总
查看>>
android之Notification通知
查看>>
C# 生成等比缩略图的类
查看>>
安利 : プログラミングで彼女をつくる 全攻略~
查看>>
1022. Digital Library (30)
查看>>
Canvas入门(2):图形渐变和图像形变换
查看>>