Java编写Mapreduce程序过程浅析
作者:让线程再跑一会 发布时间:2023-02-26 02:53:20
一个Maprduce程序主要包括三部分:Mapper类、Reducer类、执行类。
Maven项目下所需依赖
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
数据类型
Text: 一种可变长度的字节数组,用于表示文本数据。相当于Java中的String。
LongWritable、IntWritable、FloatWritable、DoubleWritable: 分别用于表示长整型、整型、浮点型和双精度浮点型数据。相当于Java中的long、int、float和double。
BooleanWritable: 用于表示布尔类型数据。相当于Java中的boolean。
NullWritable: 用于表示空值,通常用于表示Map任务的输出中间结果数据中的值为空。相当于Java中的null。
ArrayWritable: 用于表示数组类型数据。相当于Java中的数组。
MapWritable: 一种可序列化的Map数据结构,可以作为Map任务的输出(中间结果数据)或Reduce任务的输入。相当于Java中的Map<>。
WritableComparable: 一种可序列化的、可比较的数据类型接口,可以作为Map任务或Reduce任务的输入输出数据类型。
一、Mapper类
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.util.StringUtils;
import java.io.IOException;
public class WordCountMapper extends Mapper<LongWritable,Text,Text,LongWritable> {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//如果当前数据不为空
if (value!=null){
//获取每一行的数据
String line = value.toString();
//将一行数据根据空格分开
// String[] words = line.split(" ");
String[] words = StringUtils.split(line,' ');//hadoop的StringUtils.split方法对大数据来说比Java自带的拥有更好的性能
//输出键值对
for (String word : words) {
context.write(new Text(word),new LongWritable(1));
}
}
}
}
二、Reducer类
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class WordCountReducer extends Reducer<Text, LongWritable,Text,LongWritable> {
@Override
protected void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {
//累加单词的数量
long sum = 0;
//遍历单词计数数组,将值累加到sum中
for (LongWritable value : values) {
sum += value.get();
}
//输出每次最终的计数结果
context.write(key,new LongWritable(sum));
}
}
三、执行类
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
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.util.Tool;
import org.apache.hadoop.util.ToolRunner;
public class WordCountRunner extends Configured implements Tool {
public static void main(String[] args) throws Exception {
ToolRunner.run(new Configuration(),new WordCountRunner(),args);
}
@Override
public int run(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "word count");
job.setJarByClass(WordCountRunner.class);
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
//设置统计文件输入的路径,将命令行的第一个参数作为输入文件的路径
//读取maven项目下resources目录的文档
String path = getClass().getResource("/words.txt").getPath();
FileInputFormat.setInputPaths(job,path);
//设置结果数据存放路径,将命令行的第二个参数作为数据的输出路径
//输出目录必须不存在!!!
FileOutputFormat.setOutputPath(job,new Path("./output"));
return job.waitForCompletion(true) ? 0 : 1;
}
}
程序执行结果
.part-r-00000.crc: 是Reduce任务输出结果文件的校验文件,用于校验Reduce任务输出结果文件的完整性和正确性。该文件由Hadoop框架自动生成,不需要手动创建,其内容是Reduce任务输出结果文件的校验和信息。
._SUCCESS.crc: 是表示任务执行成功的标志文件的校验文件,用于校验标志文件的完整性和正确性。该文件由Hadoop框架自动生成,其内容是标志文件的校验和信息。
_SUCCESS: 表示任务执行成功的标志文件,文件内容为空。
part-r-00000: 表示Reduce任务的输出结果文件,其中“00000”表示该文件是第一个Reduce任务的输出结果文件,如果有多个Reduce任务,则会生成多个该类型的文件,文件内容为每个单词出现的次数。
来源:https://blog.csdn.net/m0_64261982/article/details/130610470


猜你喜欢
- 前言天空盒这个效果最早是在腾讯的实景地图里看到的,当时觉得很牛逼,但是没有想过自己去实现以下。最近这段时间对opengl很有兴趣,顺便就搞了
- 本文实例为大家分享了Java判断对象是否为空的具体代码,供大家参考,具体内容如下package com.gj5u.publics.util;
- 一、关于堆JDK1.8中的PriortyQueue(优先级队列)底层使用了堆的数据结构,而堆实际就是在完全二叉树的基础之上进行了一些元素的调
- 介绍Java中介者模式(Mediator Pattern)是一种行为设计模式,它可以降低多个对象之间的耦合性,通过一个中介者对象来协调这些对
- 一、WebSocket简介WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。在WebSocket应
- 一、Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的。在Java类库中,IO部分的内容是很
- @Valid:@Valid注解用于校验,所属包为:javax.validation.Valid。① 首先需要在实体类的相应字段上添加用于充当
- 现如今,验证码在Android的客户端还是非常普遍的.通过手机账号和验证码直接去注册应用账户的信息.很多应用都以这种方式来完成注
- 人机猜拳小游戏,只要用到的java面向对象的思维模式。本游戏中有游戏玩家和计算机两个参与者。玩家和计算机都有的属性是姓名和得分。共分为4个类
- 前段时间,有个同事说“30000000000000000000000000000000000000000000000000000000000
- 配置文件中使用${}注入值方式在springboot中使用System.setProperty设置参数user: user-na
- 本文实例为大家分享了java实现登录窗口的具体代码,供大家参考,具体内容如下登录窗口主类package ccnu.paint;import
- 方法调用在程序运行时,进行方法调用是最普遍,最频繁的操作方法调用不等于方法执行:方法调用阶段唯一的任务就是确定被调用的方法版本,即调用哪一个
- shiroapache shiro 是一个轻量级的身份验证与授权框架,与spring security 相比较,简单易用,灵活性高,spri
- 调用微信接口前需要准备的内容。1.微信公众平台的appid2.微信公众平台的secret3..获取tokenid4.获取ticket5.生成
- 每次滑动至底端,从数据库中获取10条数据,并加载于ListView中数据库package com.example.listviewbatch
- Rxjava功能个人感觉很好用,里面的一些操作符很方便,Rxjava有:被观察者,观察者,订阅者,被观察者通过订阅者订阅观察者,从而实现观察
- 在一些场合,我们往往需要使用印章来给每页文档加盖一个印章,以表示该文档经过某个部门的认证的,常规的做法就是打印文档后盖章,如果需要电子档再行
- GridView基础新建一个HelloGridView的工程修改main.xml代码如下:<?xml version="1.
- JSONObject 与 JSONArray区别JSONObject:{"area": "武汉",&