【Hadoop】5.MapReduce框架原理-自定义InputFormat

2023-11-09 13:32

本文主要是介绍【Hadoop】5.MapReduce框架原理-自定义InputFormat,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

说明

自定义InputFormat一般应用于hadoop自带的InputFormat类型不能满足某个应用场景中,需要我们自定义来解决

自定义步骤

自定义Inputformat步骤如下:

  1. 自定义一个类继承InputFormat
  2. 改写RecordReader,实现一次读取一个完成的文件封装为KV
  3. 在输出时使用SequenceFileOutPutFormat输出合并文件SequenceFile文件

(SequenceFile文件是hadoop用来存储二进制形式的key-value对的文件格式,SequenceFile里面存储着很多小文件,存储的形式为文件路径+名称为key,文件内容为value)。

示例操作

步骤:

  1. 自定义一个类继承FileInputFormat
    a. 重写isSpliable()方法,返回false 设置为文件不可分割
    b. 重写createRecordReader(),创建自定义的RecordReader对象,并初始化
  2. 改写RecordReader,实现一次读取一个完整的文件封装成为KV
    a. 采用IO流一次读取一个文件输出到value中,因为设置了不可分割所以整个文件都封装到了value中
    b. 获取文件路径信息+名称作为key
  3. 设置Driver
    a.

代码:
在这里插入图片描述

CustomerInputFormate自定义InputFormat
package com.xing.MapReduce.InputFormatSequenceFile;import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.JobContext;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;import java.io.IOException;/***  自定义InputFormat*/
public class CustomerInputFormate extends FileInputFormat<Text,BytesWritable> {/***  新建自定义的RecordReader* @param inputSplit* @param taskAttemptContext* @return* @throws IOException* @throws InterruptedException*/public RecordReader<Text, BytesWritable> createRecordReader(InputSplit inputSplit, TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {CustomerRecordReader reader = new CustomerRecordReader();reader.initialize(inputSplit,taskAttemptContext );return reader;}/***  设置为不可分割* @param context* @param filename* @return*/@Overrideprotected boolean isSplitable(JobContext context, Path filename) {return false;}
}
CustomerRecordReader 自定义RecordReader
package com.xing.MapReduce.InputFormatSequenceFile;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hadoop.mapreduce.RecordReader;
import org.apache.hadoop.mapreduce.TaskAttemptContext;
import org.apache.hadoop.mapreduce.lib.input.FileSplit;import java.io.IOException;/***  自定义RecordReader*/
public class CustomerRecordReader extends RecordReader<Text, BytesWritable> {// 分片信息FileSplit split;Configuration configuration;Text k = new Text();BytesWritable v = new BytesWritable();boolean isProgress = true;//初始化方法public void initialize(InputSplit inputSplit, TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {this.split = (FileSplit) inputSplit;this.configuration = taskAttemptContext.getConfiguration();}//核心业务处理(对key和value的封装)public boolean nextKeyValue() throws IOException, InterruptedException {if (isProgress){//1. 获取fsPath path = split.getPath();System.out.println("@@@@@@@@@@@@@@@@"+split.getLength());System.out.println("$$$$$$$$$$$$$$$$"+split);FileSystem fileSystem = path.getFileSystem(configuration);//2. 获取输入流FSDataInputStream fis = fileSystem.open(path);//3. 拷贝byte[] bytes = new byte[(int) split.getLength()];IOUtils.readFully(fis, bytes,0 ,bytes.length);//4. 填充k-vv.set(bytes,0 ,bytes.length);k.set(path.toString());//5. 收尾IOUtils.closeStream(fis);isProgress = false;return true;}return false;}// 获取kay值public Text getCurrentKey() throws IOException, InterruptedException {return k;}// 获取value值public BytesWritable getCurrentValue() throws IOException, InterruptedException {return v;}public float getProgress() throws IOException, InterruptedException {return 0;}public void close() throws IOException {}
}
SequenceFileMapper
package com.xing.MapReduce.InputFormatSequenceFile;import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class SequenceFileMapper extends Mapper<Text,BytesWritable,Text,BytesWritable> {@Overrideprotected void map(Text key, BytesWritable value, Context context) throws IOException, InterruptedException {// 直接输出 这里的key就是文件路径信息 value就是文本内容context.write(key,value );}}
SequenceFileReducer
package com.xing.MapReduce.InputFormatSequenceFile;import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;public class SequenceFileReducer extends Reducer<Text,BytesWritable,Text,BytesWritable> {@Overrideprotected void reduce(Text key, Iterable<BytesWritable> values, Context context) throws IOException, InterruptedException {// 就是简单的输出内容for (BytesWritable value : values) {context.write(key,value);}}
}
SequenceFileDriver
package com.xing.MapReduce.InputFormatSequenceFile;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.BytesWritable;
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.mapreduce.lib.output.SequenceFileOutputFormat;import java.io.IOException;public class SequenceFileDriver {public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 获取configuration和FileSystemConfiguration configuration = new Configuration();FileSystem fs = FileSystem.get(configuration);// 设置job的名字和jar包Job job = Job.getInstance(configuration);job.setJobName("SequenceFileDriver");job.setJarByClass(SequenceFileDriver.class);// 设置job的mapper和reduce的处理类名job.setMapperClass(SequenceFileMapper.class);job.setReducerClass(SequenceFileReducer.class);// 设置输入类型和输出类型job.setInputFormatClass(CustomerInputFormate.class);job.setOutputFormatClass(SequenceFileOutputFormat.class);// 设置输出的key和输出的value类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(BytesWritable.class);// 判断输出地址是否存在if (fs.exists(new Path("E:\\hdfs\\output1"))){fs.delete(new Path("E:\\hdfs\\output1"),true );}// 设置输入和输出的文件路径FileInputFormat.setInputPaths(job,new Path("E:\\hdfs\\input"));FileOutputFormat.setOutputPath(job,new Path("E:\\hdfs\\output1"));// 返回结果boolean b = job.waitForCompletion(true);System.exit(b ? 0 : -1);}
}
输入和输出

输入:
在这里插入图片描述
输出:

在这里插入图片描述

这篇关于【Hadoop】5.MapReduce框架原理-自定义InputFormat的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/376420

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数