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 ...
随机推荐
- 关于Ubuntu的超级管理员Root的切换及初始密码设置
背景介绍 总有一些操作,可能需要更高的超级管理员权限才能进行,甚至才可见有些文件,所以在Linux中我们需要切换到Root用户,也就是对应的Windows的Administrator账户. 从当前用户 ...
- jenkins 修改端口后无法启动的解决思路
一.问题 jenkins网站绑定域名后直接通过域名访问使用的是8080端口,为方便用户访问因此须监听80端口,而为了安全起见linux一般不用root身份运行,综上,需要以普通用户来运行监听80端口时 ...
- 4.QT:spinbox(spindoublebox)控件的信号响应
Qt的QSpinBox和QDoubleSpinBox两个控件在默认情况下是valueChanged信号,会响应每次输入栏的改变. 比如想要输入数值"123",我们会依次键入1 - ...
- 10.8、mysql日志
mysql生成或相关联的日志文件种类繁多,这里重点关注与mysql数据库服务相关 的几类日志文件: 1.错误日志: 记录mysql服务进程mysql的在启动/关闭/运行过程中遇到的错误信息: [mys ...
- 国内CRM客户管理系统哪个好用
在企业管理者对CRM系统进行选择的时候,面对搜索引擎上各种各样的结果和各种广告,肯定会有这样的疑问:CRM客户管理系统到底是哪一个好?除了网络上那些为了广告效果而"夸大其词"的优点 ...
- SpringBoot:WebSocket使用Service层的方法
方法一: 创建工具类 ApplicationContextRegister.java import org.springframework.beans.BeansException; import o ...
- git常用命令自己梳理总结
一.新建代码库 # git-init - 创建一个空的 Git 存储库或重新初始化一个现有的存储库 $ git init # 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一 ...
- 锁屏面试题百日百刷-java大厂八股文(day3)
为了有针对性的准备面试,锁屏面试题百日百刷开始每日从各处收集的面经中选择几道经典面试题分享并给出答案供参考,答案中会做与题目相关的扩展,并且可能会抛出一定问题供思考.这些题目我会标注具体的公司.招聘类 ...
- 每天五分钟Go - 闭包
闭包的示例代码 func getSequence() func() int{ i:=0 return func() int { i+=1 return i } } 首先,函数名getSequence, ...
- [NOIp2017]宝藏 题解
非常巧妙的 \(O(n^23^n)\) 做法. 题目的本质是要求一棵生成树,使得其每条边的长度与这条边的起点深度乘积的和最小. 我们使用状压 DP,考虑到当前状态与已经打通的点和深度有关,不妨设 \( ...