MapReduce框架原理-OutputFormat工作原理
OutputFormat概述

OutputFormat主要是用来指定MR程序的最终的输出数据格式 。
默认使用的是TextOutputFormat,默认是将数据一行写一条数据,并且把数据放到指定的输出目录下,以 part-r-xxxxx数字开头。并且默认情况下有几个ReduceTask就有几个结果文件产生
自定义OutputFormat

自定义OutputFormat的详细流程:
- 定义MyOutputFormat继承FileOutputFormat<T>,泛型传入的是Reducer的输出类型
- 重写里面的getRecordWriter()方法,这个方法需要返回一个RecordWriter对象。
这个方法里面定义了最终文件输出到什么地方
- 创建一个RecordWriter对象,继承RecordWriter<T>,重写里面的两个方法:write()、close()。其中write()方法中需要定义想要将文件输出到什么地方去,在这个方法中定义输出数据地址和输出数据格式
- 在Driver中通过job.setOutputFormatClass()指定我们使用的是哪个OutputFormat实现类
【注意】如果设置了分区,并且指定了ReduceTask的数量,那么根据以前所学的有多少个ReduceTask就会生成多少个结果文件,是因为默认使用的是TextOutputFormat实现类,这个实现类就是几个ReduceTask就有几个结果文件。但是如果我们自定义了OutputFormat,那么结果文件只有我们指明的地址,没有其他。
案例实操
案例一:存储数据到MySQL中
需求:将手机流量数据根据总流向升序输出到MySQL数据库中
代码:
- FlowOutputInformat.java
public class FlowOutputFormat extends FileOutputFormat<FlowBean, NullWritable> {
@Override
public RecordWriter<FlowBean, NullWritable> getRecordWriter(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
return new MyRecordWriter();
}
} - MyRecordWriter.java
public class MyRecordWriter extends RecordWriter<FlowBean, NullWritable> {
/**
* 需要在这个方法中定义输出格式、输出数据地址
* @param flowBean:Reduce阶段输出数据Key值
* @param nullWritable:Reduce阶段输出value值
*/
@SneakyThrows
@Override
public void write(FlowBean flowBean, NullWritable nullWritable) throws IOException, InterruptedException {
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sx_bigdata?serverTimezone=UTC", "root", "root");
PreparedStatement preparedStatement = connection.prepareStatement("insert into phone_flow values (?, ?, ?, ?)");
preparedStatement.setString(1, flowBean.getPhone());
preparedStatement.setInt(2, flowBean.getUpFlow());
preparedStatement.setInt(3, flowBean.getDownFlow());
preparedStatement.setInt(4, flowBean.getSumFlow());
int i = preparedStatement.executeUpdate();
if (i > 0) {
System.out.println("添加成功!");
} else {
System.out.println("添加失败!");
}
connection.close();
preparedStatement.close();
} @Override
public void close(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException { } - FlowDriver.java
job.setOutputFormatClass(FlowOutputFormat.class);
案例二:存储数据到HDFS本地指定文件夹中
需求:将单词计数案例结果输出到本地,其中首字母为大写字母存储在/upper.txt目录下,首字母为小写字母存储在/lower.txt目录下
代码:
- MyOutputFormat.java
public class MyOutputFormat extends FileOutputFormat<Text, LongWritable> {
@SneakyThrows
@Override
public RecordWriter getRecordWriter(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
return new MyRecordWriter(taskAttemptContext);
}
} - MyRecordWriter.java
public class MyRecordWriter extends RecordWriter<Text, LongWritable> {
FSDataOutputStream fsDataOutputStream1;
FSDataOutputStream fsDataOutputStream2;
public MyRecordWriter(TaskAttemptContext taskAttemptContext) throws Exception {
Configuration configuration = taskAttemptContext.getConfiguration();
FileSystem fs = FileSystem.get(new URI("hdfs://192.168.218.55:9000"), configuration, "root");
Path out1 = new Path("/test/school/upper.txt");
Path out2 = new Path("/test/school/lower.txt");
if (fs.exists(out1)) {
fs.delete(out1, true);
}
if (fs.exists(out2)) {
fs.delete(out2, true);
}
fsDataOutputStream1 = fs.create(out1);
fsDataOutputStream2 = fs.create(out2);
} @Override
public void write(Text text, LongWritable longWritable) throws IOException, InterruptedException {
char firstWord = text.toString().charAt(0);
String line = text + "\t" + longWritable.get() + "\r\n";
if (Character.isUpperCase(firstWord)) {
fsDataOutputStream1.write(line.getBytes());
} else {
fsDataOutputStream2.write(line.getBytes());
}
} @Override
public void close(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
if (fsDataOutputStream1 != null) {
fsDataOutputStream1.close();
}
if (fsDataOutputStream2 != null) {
fsDataOutputStream2.close();
}
}
} - FlowDriver.java
job.setOutputFormatClass(MyOutputFormat.class);
MapReduce框架原理-OutputFormat工作原理的更多相关文章
- MapReduce作业的工作原理
在Hadoop中,我们可以通过Job对象的submit()方法来运行MapReduce作业,也可以调用waitForCompletion()用于提交以前没有提交过的作业,并等待它的完成.其中,subm ...
- Hadoop(20)-MapReduce框架原理-OutputFormat
1.outputFormat接口实现类 2.自定义outputFormat 步骤: 1). 定义一个类继承FileOutputFormat 2). 定义一个类继承RecordWrite,重写write ...
- MapReduce框架原理-MapTask工作机制
MapReduce框架原理-MapTask工作机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速 ...
- MapReduce的工作原理
MapReduce简介 MapReduce是一种并行可扩展计算模型,并且有较好的容错性,主要解决海量离线数据的批处理.实现下面目标 ★ 易于编程 ★ 良好的扩展性 ★ 高容错性 MapReduce ...
- MapReduce 1工作原理图文详解
MapReduce工作原理图文详解 一 MapReduce程序执行流程 程序执行流程图如下: 流程分析:1.在客户端启动一个作业.2.向JobTracker请求一个Job ID.3.将运行作业所需要的 ...
- MapReduce工作原理详解
文章概览: 1.MapReduce简介 2.MapReduce有哪些角色?各自的作用是什么? 3.MapReduce程序执行流程 4.MapReduce工作原理 5.MapReduce中Shuffle ...
- MapReduce工作原理图文详解
目录:1.MapReduce作业运行流程2.Map.Reduce任务中Shuffle和排序的过程 1.MapReduce作业运行流程 流程示意图: 流程分析: 1.在客户端启动一个作业. 2.向Job ...
- MapReduce工作原理讲解
第一部分:MapReduce工作原理 MapReduce 角色•Client :作业提交发起者.•JobTracker: 初始化作业,分配作业,与TaskTracker通信,协调整个作业.•TaskT ...
- MapReduce工作原理
第一部分:MapReduce工作原理 MapReduce 角色•Client :作业提交发起者.•JobTracker: 初始化作业,分配作业,与TaskTracker通信,协调整个作业.•Tas ...
随机推荐
- Vue style与css的var()
vue绑定style直接给css的var变量传递一个值,然后结合css的var()函数使用这个值. 在data里面定义一个变量然后给定一个值,后期修改这个值之后,所有依赖这个变量的css样式都会被响应 ...
- AcWing 1250. 格子游戏
#include<bits/stdc++.h> using namespace std; int n,m; int fa[1000000]; int found(int x) { if(f ...
- PHP大文件分片上传的实现方法
一.前言 在网站开发中,经常会有上传文件的需求,有的文件size太大直接上传,经常会导致上传过程中耗时太久,大量占用带宽资源,因此有了分片上传. 分片上传主要是前端将一个较大的文件分成等分的几片,标识 ...
- 题解 SP3591 PATHEADS - Patting Heads
类似桶排 先看有多少头奶牛抽出这个数 再看这个数的奶牛能拍多少人的头(别忘了-1,自己不能拍自己) 最后根据输入输出 110ms #include<bits/stdc++.h> using ...
- 两人团队项目-石家庄地铁查询系统(web版)psp表
结对开发_石家庄地铁查询_博客地址:https://www.cnblogs.com/Aduorisk/p/10652917.html 队友:冯利伟 PSP: PSP0 Personal Softwar ...
- CSS 样式清单整理
1.文字超出部分显示省略号 单行文本的溢出显示省略号(一定要有宽度) p{ width:200rpx; overflow: hidden; text-overflow:ellipsis; white- ...
- pagehelper插件使用时查询不到数据
刚用mybatis 的分页插件时,老项目中分页封装的分页类起始为( pageno-1)* pagesize 于是直直接在pagehelper.start(start,pagesize)来进行分页.结 ...
- JavaScript学习笔记:你必须要懂的原生JS(一)
1.原始类型有哪几种?null是对象吗?原始数据类型和复杂数据类型存储有什么区别? 原始类型有6种,分别是undefined,null,bool,string,number,symbol(ES6新增) ...
- 超详细!Vuex手把手教程
目录 1,前言 2,Vuex 是什么 3,5大属性说明 4,state 4.1 直接访问 4.1 使用mapState映射 5,getters 5.1 先在vuex中定义getters 5.2 直接获 ...
- 足不出户,一探古今,打造线上3D数字博物馆!
随着3D技术的不断革新,为了让更多的用户领略历史之美,越来越多的博物馆开始举办线上展览.通过模拟不同的环境.灯光投影.360°无死角放大缩小展品,观众可以享受到身临其境的沉浸体验.不仅如此,给展品加上 ...