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 ...
随机推荐
- Windows10上基于Visual Studio Code安装Golang开发环境
GoLang简介 Go编程语言是一个开源项目,它使程序员更具生产力. Go语言具有很强的表达能力,它简洁.清晰而高效.得益于其并发机制,用它编写的程序能够非常有效地利用多核与联网的计算机,其新颖的类型 ...
- Docker构建mysql主从
一.为什么要搭建主从架构呢 1.数据安全,可以进行数据的备份. 2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器.从而缓解数据库访问的压力 3.故障 ...
- 在线CRM系统对企业的好处有哪些
随着信息技术的飞速发展,每个企业都希望通过互联网技术来让自身发展壮大.由于强大的管理能力和技术手段,在线CRM系统成为了企业用来管理自身获得发展的最佳选择.那么在线CRM系统对企业来说有哪些好处呢?本 ...
- Linux 动态库 undefined symbol 原因定位与解决方法
在使用动态库开发部署时,遇到最多的问题可能就是 undefined symbol 了,导致这个出现这个问题的原因有多种多样,快速找到原因,采用对应的方法解决是本文写作的目的. 可能的原因 依赖库未找到 ...
- 暑假自学java第九天
1,接口回调是指:可以将接口实现类的对象赋给该接口声明的接口变量,那么该接口变量就可以调用接口实现类对象中的方法.不同的类在使用同一接口时,可能具有不同的功能体现,即接口实现类的方法体不必相同,因此, ...
- spring cloud服务器启动之后立刻通过zuul访问其中的实例报zuul连接超时的问题
spring cloud服务启动之后,立刻进行调用 报错:com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: c ...
- python cv2获取视频第一帧,并转码
安装Python库 sudo pip install opencv-python 或者sudo pip install opencv-python -i https://pypi.douban.com ...
- WPF教程三:学习Data Binding把思想由事件驱动转变为数据驱动
之前大家写代码都喜欢用事件驱动,比如说鼠标输入的click事件.初始化的内容全部放在窗体加载完毕的load事件,等等,里面包含了大量的由事件触发后的业务处理代码.导致了UI和业务逻辑高度耦合在一个地方 ...
- Nacos配置中心功能
目录 Nacos的配置管理模型 命名空间(Namespace) 配置分组(Group) 配置集(Data ID) 配置项 一个最佳实践 命名空间管理 配置管理 参考 Nacos的配置管理模型 对于Na ...
- interpration
On interpreting the effects of repetition interpreting 释意1. If you interpret something in a particul ...