Hadoop—MapReducer统计文件的单词出现的个数

 

1. MapReduce 统计文件的单词出现的个数

Mapper: 处理具体文本,发送结果
Reducer: 合并各个Mapper发送过来的结果
Job: 制定相关配置,框架

Mapper

package cn.itcast.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.util.StringUtils;// 4个泛型中,前两个是指定mapper输入数据的类型
// map和 reducer的输入和输出都是key-value对的形式
// 默认情况下。框架输入的我们mapper的输入数据中,key是要处理的文本中的一行的起始偏移量, 内容就是value
public class WCMapper extends Mapper <LongWritable, Text, Text, LongWritable> {// 每读一次数据,就调一次这个方法
    @Overrideprotected void map(LongWritable key, Text value,  Context context)throws IOException, InterruptedException{//具体业务逻辑就像和在这里, 传入数据就是  key, value//将这一行的内容转化成string类型String line = value.toString();// 对这一行的文本按特定分隔符切分String[] words = StringUtils.split(line, ' ');// 便利这个单词数组, 输出为kv形式   k:单词  v:1for (String word : words) {context.write(new Text(word), new LongWritable(1));}}
}

Reducer

package cn.itcast.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class WCReducer extends Reducer<Text, LongWritable, Text, LongWritable> {@Overrideprotected void reduce(Text Key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {long count = 0;for (LongWritable value:values) {count += value.get();}context.write(Key, new LongWritable(count));}
}

Job

package cn.itcast.hadoop.mr.wordcount;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import org.apache.hadoop.io.Text;
//import com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text;public class WCRunner {public static void main(String[] args) throws Exception{Configuration conf = new Configuration();Job wcJob = Job.getInstance(conf);wcJob.setJarByClass(WCRunner.class);//本job使用的mapper和reducer类wcJob.setMapperClass(WCMapper.class);wcJob.setReducerClass(WCReducer.class);// 指定reduce的输出数据kv类型wcJob.setOutputKeyClass(Text.class);wcJob.setOutputValueClass(LongWritable.class);// 指定mapper的输出数据kv类型wcJob.setMapOutputKeyClass(Text.class);wcJob.setMapOutputValueClass(LongWritable.class);//指定要处理的输入数据存放路径FileInputFormat.setInputPaths(wcJob, new Path("/wc/srcdata/"));//指定处理结果的输出数据存放路径FileOutputFormat.setOutputPath(wcJob, new Path("/wc/output"));//将job提交给集群运行wcJob.waitForCompletion(true);}
}

2. Yarn资源调度框架

Resource Manager:
Node Manager:

 
1. wcJob.waitforCompleition启动一个RunJar进程,这个进程向RM申请执行一个Job
2. RM 返回一个Job相关资源的路径staging-dir,和为Job产生的jobID
3. RunJar提交资源到 HDFS的 staging-dir上
4. RunJar提交资源完毕之后,上报RM 提交资源完毕
5. RM下个Job加入RM中的任务队列中
6. 各个Node Manager通过通信,从RM的任务队列中领取任务
7. 各个Node Manager初始化  运行资源的容器,从staging-dir上面拉取资源
8. RM选择一个Node Manager 启动MRAppMaster 来运行map reducer
9. MRAppMaster向RM注册
10. MSAppMaster启动Mapper任务
11. MSAppMaster启动Reducer任务
12. 任务完成后, 向RM注销自己

3.几种运行模式
本地模型运行

在windows的eclipse里面直接运行main方法,就会将job提交给本地执行器locaJobRunner执行
– 输入输出数据可以放在本地路径下(c:/wc/src/data/)
– 输入输出数据也可以放在hdfs中(hdfs://hadoop1:9000/wc/srcdata)

在linux的ecllipse里面直接运行main 方法,则不需要添加yarn相关的配置,也会提交给localJobRunner执行
– 输入输出数据可以放在本地路径下(/home/hadoop/wc/srcdata)
– 输入输出数据也可以放在hdfs中(hdfs://hadoop1:9000/wc/srcdata)

集群模式运行

将工程打包成jar包, 上传到服务器,然后用hadoop命令提交 hadoop jar wc.jar cn.itcast.hadoop.mr.wordcount.WCRunner
在linux的eclipse中直接运行main方法,也可以提交到集群中去运行,但是,必须采取一下措施:
– 在工程src目录下加入mapred-site.xml 和yarn-site.xml
– 将工程打成jar包(wc.jar), 同时在main方法中添加一个conf的配置参数 conf.set(“mapreduce.job.jar”, “wc.jar”);

在windows的eclipse中直接运行main方法,也可以提交集群中运行,但是因为平台不兼容,需要做很多的设置修改
– 要在windows中存放一份hadoop的安装包(解压好的)
– 要将其中的lib和bin目录替换成根据你的windows版本重新编译出的文件
– 再要配置系统环境变量 HDOOP_HOME 和 PATH
– 修改YarnRunner这个类的源码

转载于:https://www.cnblogs.com/zemul/p/10820750.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从框架到平台

当我将近十年前作为Java开发人员开始我的职业生涯时&#xff0c;该行业正在经历革命性的变化。 Spring框架&#xff08;于2003年发布&#xff09;Swift发展起来&#xff0c;并成为庞大的J2EE平台的严重挑战者。 经过过渡时间后&#xff0c;我很快发现自己赞成使用Spring框架而不…

关于setTimeout和setInterval的函数参数问题

今天在写验证码倒计时小demo时&#xff0c;用了如下代码&#xff1a; window.setTimeout(count(num),1000);这样直接使用将使count函数立即执行&#xff0c;并将返回值传递给setTimeout函数作为参数&#xff0c;其结果并不是真正需要的&#xff0c;所以会出现问题。 方法一 …

课堂作业2

1、动手动脑 阅读示例: EnumTest.java&#xff0c;运行它&#xff0c;分析运行结果&#xff1f;你能得到什么结论&#xff1f;你掌握了枚举类型的基本用法了吗&#xff1f; public class EnumTest {public static void main(String[] args) {Size sSize.SMALL;Size tSize.LARGE…

(转)详解Vs2008下打包安装程序的一些技巧(含win7下提权限、卸载以及安装时定向到网页)...

1、怎么使得程序窗口左上角和任务栏有图标&#xff0c;如下图所示&#xff1a; 其实这个问题不应该放到程序打包这部分讲&#xff0c;只不过对于一些初学者而言&#xff0c;在这提下也许会有很大的帮助&#xff08;想到自己刚学.net那会了&#xff0c;呵呵&#xff09;。方法之…

复合双重错误

总览 在上一篇文章中&#xff0c;我概述了为什么BigDecimal大部分时间都不是答案。 虽然可以构造double会产生错误的情况&#xff0c;但在BigDecimal遇到错误的情况下构造情况也一样容易。 BigDecimal更容易正确&#xff0c;但更容易出错。 轶事证据表明&#xff0c;初级开发人…

vue入门学习示例

鄙人一直是用angular框架的&#xff0c;所以顺便比较了一下。 1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>vue实践</title>6 <script src"http://cdn.bootcss.…

项目实战报异常Exception及决绝方案

1、报LifecycleException&#xff0c;再配置一下jdk即可&#xff0c;然后再手动添加maven 解决方法&#xff1a; 然后,手动添加jar包 2、maven 项目,右键maven build启动项目的时候&#xff0c;报下面错误&#xff0c;没有在pom配置tomcat7插件 3、报找不到beans插件:更新一下项…

世界主要遥感卫星

世界主要遥感卫星QuickbirdSpot-4Spot-4法国“太阳神”1A神舟飞船神舟飞船“哈勃”望远镜RADASAT神舟飞船国际空间站国际空间站 SPOT2Shutsacn IKONOS CBERS-1JersSpot-4 “哈勃”望远镜 CBERS-1 Landsat 5美国“KH-11”侦察卫星 Spot-5 ERS Landsat 7OrbView-3 美国间谍卫星…

VMware配置linux网络步骤

1.我们要用桥接网络模式 2.设置桥接网络&#xff0c;VMnet1或者VMnet0就是桥接网络&#xff0c;我们用的就是桥接 VMnet8是NAT 在上面的图配置好ip和dns&#xff0c;要与windowss是同一个网段&#xff0c;网关一般不设置 3.设置linux网络里面设置这4项&#xff0c;记住dns可以不…

使用IntelliJ书签

这是有关IntelliJ的精美书签功能的快速帖子。 IntelliJ使您可以为单行代码添加书签。 将某行添加为书签后&#xff0c;您可以使用多种方法直接跳回到该行。 因此&#xff0c;最好在您经常使用的代码位置添加书签。 要创建一个新书签&#xff0c;只需在代码编辑器中按F11键。 …

用js写水仙花数

...js//输入一个三位数&#xff0c;水仙花数就是个位的三次方 十为的三次方 百位的三次方之和等于本身console.log(请输入一个三位数&#xff1a;);let a readline.question();if (a > 100 && a < 999) {if (parseInt(a / 100) ** 3 parseInt(a % 100 / 10) ** …

keras 打印模型图

keras中可以使用 from keras.utils import plot_model plot_model(model,to_filemodel_auth.png,show_shapesTrue) #show_shapesTrue可以把输入输出的shape一起打印 注意&#xff0c;最好是给每个层命名&#xff0c;命名好之后打印出来的才会带名字。程序运行的时候也有一定的指…

C# -- 多线程向同一文件写入

1. 多线程向同一文件写入Log. public delegate void AsyncLog(string str1, string str2);private void Test() {Console.WriteLine("Test Start...");for (int i 0; i < 100; i){AsyncLog asyLog1 new AsyncLog(WriteLog);asyLog1.BeginInvoke("EventActi…

Java中的命名参数

创建具有许多参数的方法是一个主要的缺点。 每当需要创建这样的方法时&#xff0c;就在空气中闻一闻&#xff1a;这是代码的味道。 强化单元测试&#xff0c;然后进行重构。 没有借口&#xff0c;没有屁股。 重构&#xff01; 使用构建器模式&#xff0c;甚至更好地使用Fluent …

CSS学习笔记3:选择器及优先级

CSS选择器的类型&#xff1a;标签选择器类选择器ID选择器全局选择器群组选择器后代选择器 1.标签选择器&#xff1a;以HTML的标签作为选择器&#xff0c;凡是选择了一个标签&#xff0c;那么所有这个标签的内容都是用了css样式用法很简单&#xff0c;直接在style中 标签{}即可声…

Eclipse开发,编译,打包常见问题总结------持续更新

在使用Eclipse开发&#xff0c;编译&#xff0c;打包常见问题如下&#xff1a; 1、 保证本地开发的客户端与服务端使用的jdk版本一致 2、 保证本地开发的客户端与服务端使用的依赖jar包版本一致&#xff08;比如本地thrift 客户端使用的libthrift版本和服务端使用的libthrift…

ECMA-335 (CLI) 标准 读书笔记——总结CLI类型系统(上)

看到类型系统的概述时&#xff0c;就忍不住按图索骥&#xff0c;想搞清楚CLI如何定义的整个类型系统。于是翻遍了整个标准&#xff0c;将类型系统中最核心的、与运行平台密切相关的类型定义与说明整理了出来&#xff0c;以供理清思路。 标准的第四部指出&#xff0c;CLI的核心是…

流口水可执行模型

可执行模型是对引擎处理的Drools最低级别模型的重新设计。 在当前的系列&#xff08;最多6.x&#xff09;中&#xff0c;可执行模型在过去的8年中有机地增长了&#xff0c;从未真正成为最终用户的目标。 建议那些希望以编程方式编写规则的人通过代码生成和目标drl来完成&#x…

centos7安装openjdk8

首先&#xff0c;打开openjdk安装官网 http://openjdk.java.net/install/ 输入安装命令&#xff1a; su -c "yum install java-1.8.0-openjdk" 装完之后会有提示版本跟安装的路径&#xff1b;在/usr/lib/jvm下可以查看到对应的名字&#xff0c;ls-l 配置环境变量&…

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…