@

一、准备数据

注意:准备的数据的格式必须是文本,每个单词之间使用制表符分割。编码必须是utf-8无bom

二、MR的编程规范

MR的编程只需要将自定义的组件和系统默认组件进行组合,组合之后运行即可!

三、编程步骤

①Map阶段的核心处理逻辑需要编写在Mapper

②Reduce阶段的核心处理逻辑需要编写在Reducer

③将编写的Mapper和Reducer进行组合,组合成一个Job

④对Job进行设置,设置后运行

四、编写程序

WCMapper.java

public class WCMapper extends Mapper<LongWritable, Text, Text, IntWritable>{

	private Text out_key=new Text();
private IntWritable out_value=new IntWritable(1);//每个单词出现一次记为1 // 针对输入的每个 keyin-valuein调用一次 (0,hello hi hello hi)
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws Exception { System.out.println("keyin:"+key+"----keyout:"+value); String[] words = value.toString().split("\t"); for (String word : words) {
out_key.set(word);
//写出数据(单词,1)
context.write(out_key, out_value);
} }
}

Mapper程序解读

  1. 导包时,需注意导入 org.apache.hadoop.mapreduce包下的类(hadoop2.0的新api)

  2. 自定义的类必须符合MR的Mapper的规范

  3. 在MR中,只能处理key-value格式的数据

    KEYIN, VALUEIN: mapper输入的k-v类型,由当前Job的InputFormat的RecordReader决定!封装输入的key-value由RecordReader自动进行,不可自定义。

    KEYOUT, VALUEOUT: mapper输出的k-v类型,可自定义

  4. InputFormat的作用:

    ①验证输入目录中的文件格式,是否符合当前Job的要求

    ②生成切片,每个切片都会交给一个MapTask处理

    ③提供RecordReader,由RR从切片中读取记录,交给Mapper进行处理

方法: List<InputSplit> getSplits: 切片

RecordReader<K,V> createRecordReader: 创建RecordReader

默认hadoop使用的是TextInputFormat,TextInputFormat使用LineRecordReader

  1. 在Hadoop中,如果有Reduce阶段。通常key-value都需要实现序列化协议!

    MapTask处理后的key-value,只是一个阶段性的结果!

    这些key-value需要传输到ReduceTask所在的机器!

    将一个对象通过序列化技术,序列化到一个文件中,经过网络传输到另外一台机器,

    再使用反序列化技术,从文件中读取数据,还原为对象是最快捷的方式!

java的序列化协议: Serializable

特点:不仅保存对象的属性值,类型,还会保存大量的包的结构,子父类和接口的继承信息,很笨重。

hadoop开发了一款轻量级的序列化协议: Writable机制!

WCReducer.java

/*
*KEYIN, VALUEIN: Mapper输出的keyout-valueout
*KEYOUT, VALUEOUT: 自定义
*/
public class WCReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ private IntWritable out_value=new IntWritable(); // reduce一次处理一组数据,key相同的视为一组
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws Exception { int sum=0; for (IntWritable intWritable : values) {
sum += intWritable.get();
} out_value.set(sum); //将累加的值写出
context.write(key, out_value); }
}

WCDriver.java

/*
* 1.启动这个线程,运行Job
*
* 2.本地模式主要用于测试程序是否正确!
*/
public class WCDriver { public static void main(String[] args) throws Exception { //默认使用本地的文件系统
Path inputPath=new Path("e:/mrinput/wordcount");
Path outputPath=new Path("e:/mroutput/wordcount"); /*Path inputPath=new Path("/wordcount");
Path outputPath=new Path("/mroutput/wordcount");*/ //作为整个Job的配置
Configuration conf = new Configuration(); //使用HDFS
/*conf.set("fs.defaultFS", "hdfs://hadoop101:9000"); // 在YARN上运行
conf.set("mapreduce.framework.name", "yarn");
// RM所在的机器
conf.set("yarn.resourcemanager.hostname", "hadoop102");*/ //一定要保证输出目录不存在
FileSystem fs=FileSystem.get(conf); if (fs.exists(outputPath)) {
fs.delete(outputPath, true);
} // ①创建Job
Job job = Job.getInstance(conf); // 告诉NM运行时,MR中Job所在的Jar包在哪里
//job.setJar("MapReduce-0.0.1-SNAPSHOT.jar");
// 将某个类所在地jar包作为job的jar包
job.setJarByClass(WCDriver.class); // 为Job创建一个名字
job.setJobName("wordcount"); // ②设置Job
// 设置Job运行的Mapper,Reducer类型,Mapper,Reducer输出的key-value类型
job.setMapperClass(WCMapper.class);
job.setReducerClass(WCReducer.class); // Job需要根据Mapper和Reducer输出的Key-value类型准备序列化器,通过序列化器对输出的key-value进行序列化和反序列化
// 如果Mapper和Reducer输出的Key-value类型一致,直接设置Job最终的输出类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); // 设置输入目录和输出目录
FileInputFormat.setInputPaths(job, inputPath);
FileOutputFormat.setOutputPath(job, outputPath); // ③运行Job
job.waitForCompletion(true); }
}

使用MapReduce运行WordCount案例的更多相关文章

  1. python在mapreduce运行Wordcount程序

    首先脚本文件: mapper.py: #!/usr/bin/env python import sys for line in sys.stdin: line = line.strip() words ...

  2. MapReduce简单执行过程及Wordcount案例

    MapReducer运行过程 以单词统计为案例. 假如现在文件中存在如下内容: aa bb aa cc dd aa 当然,这是小文件,如果文件大小较大时会将文件进行 "切片" ,此 ...

  3. hadoop笔记之MapReduce的应用案例(WordCount单词计数)

    MapReduce的应用案例(WordCount单词计数) MapReduce的应用案例(WordCount单词计数) 1. WordCount单词计数 作用: 计算文件中出现每个单词的频数 输入结果 ...

  4. hadoop学习笔记:运行wordcount对文件字符串进行统计案例

    文/朱季谦 我最近使用四台Centos虚拟机搭建了一套分布式hadoop环境,简单模拟了线上上的hadoop真实分布式集群,主要用于业余学习大数据相关体系. 其中,一台服务器作为NameNode,一台 ...

  5. 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)

    0.前言 0.1  分布式运算框架的核心思想(此处以MR运行在yarn上为例)  提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...

  6. hadoop2.7.x运行wordcount程序卡住在INFO mapreduce.Job: Running job:job _1469603958907_0002

    一.抛出问题 Hadoop集群(全分布式)配置好后,运行wordcount程序测试,发现每次运行都会卡住在Running job处,然后程序就呈现出卡死的状态. wordcount运行命令:[hado ...

  7. eclipse运行mapreduce的wordcount

    1,eclipse安装hadoop插件 插件下载地址:链接: https://pan.baidu.com/s/1U4_6kLFNiKeLsGfO7ahXew 提取码: as9e 下载hadoop-ec ...

  8. MapReduce 单词统计案例编程

    MapReduce 单词统计案例编程 一.在Linux环境安装Eclipse软件 1.   解压tar包 下载安装包eclipse-jee-kepler-SR1-linux-gtk-x86_64.ta ...

  9. 021_在Eclipse Indigo中安装插件hadoop-eclipse-plugin-1.2.1.jar,直接运行wordcount程序

    1.工具介绍 Eclipse Idigo.JDK1.7-32bit.hadoop1.2.1.hadoop-eclipse-plugin-1.2.1.jar(自己网上下载) 2.插件安装步骤 1)将ha ...

随机推荐

  1. Idea 添加注释:类注释、方法注释(可获取参数)

    原文链接:https://blog.csdn.net/liqing0013/article/details/84104419 Idea 添加注释:类注释.方法注释 类注释 File–Setting–E ...

  2. LR脚本信息函数-lr_start_timer和lr_end_timer

    为了计算时间更加精确,可以用这个函数去掉LR自身的检查点所浪费的时间.如text check and image time Action() { double time_elapsed, durati ...

  3. Android笔记布局资源文件

    在项目的res--layout目录下的文件叫布局资源文件,用于控制页面的布局显示 在Java代码中引用布局资源我们已经很熟悉了. setContentView(R.layout.activity_ma ...

  4. 让apk可调试

    一定是这个  <application android:debuggable="true"   不是这个玩意, debugaable, 也不是debugable这个玩意  

  5. MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新

    MFC编辑框接收数据动态更新与刷新方法代码示例-如何让编辑框内容实时更新 关键代码: //发送数据通知 //from txwtech@163.com LRESULT CCommSampleDlg::O ...

  6. Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法

    最近在工作中遇到了遇到了一个需求需要将TIPTOP中的数据导出成XML并上传到FTP主机中,但是4GL这方面的文档比较少最终决定使用Oracle调用Java的方法,在使用的过程中发现有很多的坑,大部分 ...

  7. APP移动端测试

    重点: app测试的内容 add 命令  monkey命令 次重点:模拟器的安装 雷电 夜神 android 自带的模拟器 真机测试 简单了解云测Testing  腾讯云() 了解:市场有点移动端的操 ...

  8. NET 数据结构-单链表

    概念介绍: 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元 ...

  9. Selenium+java - Edge浏览器启动

    写在前面 随着win10系统的普及,使得Edge浏览器得到广泛使用.从自动化角度看,自然微软也一直不断提供着支持服务,系统版本更新,对应的Edge浏览器版本也在更新,当然对应的驱动版本也会发生变化. ...

  10. 关于JavaScript函数

    object.defineProperty()函数 再学习这个函数之前,我们先创建一个object对象 var person = {} person.name = "junlebao&quo ...