十一、MapReduce--自定义Input输入
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,在"MapReduce--input之输入原理"中说到实现定义输入的方法,其实就是继承InputFormat以及 RecordReader实现其中的方法。下面例子讲解操作。1、需求将多个文件合并成一个
千家信息网最后更新 2026年11月03日十一、MapReduce--自定义Input输入
在"MapReduce--input之输入原理"中说到实现定义输入的方法,其实就是继承InputFormat以及 RecordReader实现其中的方法。下面例子讲解操作。
1、需求
将多个文件合并成一个大文件(有点类似于combineInputFormat),并输出。大文件中包括小文件所在的路径,以及小文件的内容。
2、源码
inputFormat
public class SFileInputFormat extends FileInputFormat { /** * 是否切片 * @param context * @param filename * @return */ @Override protected boolean isSplitable(JobContext context, Path filename) { return false; } /** * 返回读取文件内容的读取器 * @param inputSplit * @param taskAttemptContext * @return * @throws IOException * @throws InterruptedException */ @Override public RecordReader createRecordReader(InputSplit inputSplit, TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException { SRecordReader sRecordReader = new SRecordReader(); sRecordReader.initialize(inputSplit, taskAttemptContext); return sRecordReader; }} RecordReader:
public class SRecordReader extends RecordReader { private Configuration conf; private FileSplit split; //当前分片是否已读取的标志位 private boolean process = false; private BytesWritable value = new BytesWritable(); /** * 初始化 * @param inputSplit * @param taskAttemptContext * @throws IOException * @throws InterruptedException */ @Override public void initialize(InputSplit inputSplit, TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException { split = (FileSplit)inputSplit; conf = taskAttemptContext.getConfiguration(); } /** * 从分片中读取下一个KV * @return * @throws IOException * @throws InterruptedException */ @Override public boolean nextKeyValue() throws IOException, InterruptedException { if (!process) { byte[] buffer = new byte[(int) split.getLength()]; //获取文件系统 Path path = split.getPath(); FileSystem fs = path.getFileSystem(conf); //创建输入流 FSDataInputStream fis = fs.open(path); //流对接,将数据读取缓冲区 IOUtils.readFully(fis, buffer, 0, buffer.length); //将数据装载入value value.set(buffer, 0, buffer.length); //关闭流 IOUtils.closeStream(fis); //读完就标志位设置为true,表示已读 process = true; return true; } return false; } @Override public NullWritable getCurrentKey() throws IOException, InterruptedException { return NullWritable.get(); } @Override public BytesWritable getCurrentValue() throws IOException, InterruptedException { return this.value; } @Override public float getProgress() throws IOException, InterruptedException { return process? 1 : 0; } @Override public void close() throws IOException { }} mapper:
public class SFileMapper extends Mapper { Text k = new Text(); @Override protected void setup(Context context) throws IOException, InterruptedException { FileSplit inputSplit = (FileSplit)context.getInputSplit(); String name = inputSplit.getPath().toString(); k.set(name); } @Override protected void map(NullWritable key, BytesWritable value, Context context) throws IOException, InterruptedException { context.write(k, value); } } reducer:
public class SFileReducer extends Reducer { @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { context.write(key, values.iterator().next()); }} driver:
public class SFileDriver { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { args = new String[]{"G:\\test\\date\\A\\order\\", "G:\\test\\date\\A\\order2\\"}; Configuration conf = new Configuration(); Job job = Job.getInstance(conf); job.setJarByClass(SFileDriver.class); job.setMapperClass(SFileMapper.class); job.setReducerClass(SFileReducer.class); //设置输入和输出类,默认是 TextInputFormat job.setInputFormatClass(SFileInputFormat.class); job.setOutputFormatClass(SequenceFileOutputFormat.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(BytesWritable.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(BytesWritable.class); FileInputFormat.setInputPaths(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); }}自定义的inputformat需要在job中通过 job.setInputFormatClass() 来指定
文件
输入
内容
数据
方法
标志
输出
例子
原理
多个
就是
所在
源码
系统
缓冲区
路径
需求
中包
中通
并成
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技公司简介
美国互联网保险保险科技
科技和互联网公司
互联网电商科技
互联网科技公司税收优惠
互联网医疗科技
南京欣网互联网科技
西安互联网科技公司
奔汉互联网科技
互联网科技论坛
科技伦理 互联网公司
海南购全球互联网科技
互联网金融科技公司干啥的
爱医互联网络科技
元气玛特互联网科技公司是外包吗
互联网金融科技元年
山东星卡互联网科技有限公司官网
城市宝互联网科技有限公司
互联网时代高科技布局
互联网科技大会大佬
互联网金融科技
为想互联网科技
现代科技和互联网有关系吗
语蝶互联网科技有限公司
湖南一路畅行互联网科技
搜狐科技互联网
阿里互联网科技企业
风投北京互联网科技
福仕德教育科技互联网
广西泛欧互联网科技有限公司