全方位揭秘!大数据从0到1的完美落地之MapReduce实战案例(1)

news/2024/10/30 11:31:24/

案例一: MR实战之小文件合并(自定义inputFormat)

项目准备

  1. 需求

无论hdfs还是MapReduce,对于小文件都有损效率,实践中,又难免面临处理大量小文件的场景,此时,就需要有相应解决方案

  1. 测试数据

  2. 分析

小文件的优化无非以下几种方式:

  • a) 在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS
  • b) 在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并
  • c) 在MapReduce处理时,可采用combineInputFormat提高效率

项目实现

注意:本节实现的是上述第二种方式

  1. 程序的核心机制:

自定义一个InputFormat

改写RecordReader,实现一次读取一个完整文件封装为KV

在输出时使用SequenceFileOutPutFormat输出合并文件

  1. 代码如下

a) 自定义InputFromat

/*** @Author 千锋大数据教学团队* @Company 千锋好程序员大数据* @Description */
public class WholeFileInputFormat extendsFileInputFormat<NullWritable, BytesWritable> {//设置每个小文件不可分片,保证一个小文件生成一个key-value键值对@Overrideprotected boolean isSplitable(JobContext context, Path file) {return false;}@Overridepublic RecordReader<NullWritable, BytesWritable> createRecordReader(InputSplit split, TaskAttemptContext context) throws IOException,InterruptedException {WholeFileRecordReader reader = new WholeFileRecordReader();reader.initialize(split, context);return reader;}
}
复制代码

b) 自定义RecordReader

/*** @Author 千锋大数据教学团队* @Company 千锋好程序员大数据* @Description 自定义RecordReader*/
public class WholeFileRecordReader extends RecordReader<NullWritable, BytesWritable> {private FileSplit fileSplit;private Configuration conf;private BytesWritable value = new BytesWritable();private boolean processed = false;@Overridepublic void initialize(InputSplit split, TaskAttemptContext context)throws IOException, InterruptedException {this.fileSplit = (FileSplit) split;this.conf = context.getConfiguration();}@Overridepublic boolean nextKeyValue() throws IOException, InterruptedException {if (!processed) {byte[] contents = new byte[(int) fileSplit.getLength()];Path file = fileSplit.getPath();FileSystem fs = file.getFileSystem(conf);FSDataInputStream in = null;try {in = fs.open(file);IOUtils.readFully(in, contents, 0, contents.length);value.set(contents, 0, contents.length);} finally {IOUtils.closeStream(in);}processed = true;return true;}return false;}@Overridepublic NullWritable getCurrentKey() throws IOException,InterruptedException {return NullWritable.get();}@Overridepublic BytesWritable getCurrentValue() throws IOException,InterruptedException {return value;}@Overridepublic float getProgress() throws IOException {return processed ? 1.0f : 0.0f;}@Overridepublic void close() throws IOException {// do nothing}
}
复制代码

c) 定义MapReduce处理流程

/*** @Author 千锋大数据教学团队* @Company 千锋好程序员大数据* @Description 定义MapReduce处理流程*/
public class SmallFilesToSequenceFileConverter extends Configured implementsTool {static class SequenceFileMapper extendsMapper<NullWritable, BytesWritable, Text, BytesWritable> {private Text filenameKey;@Overrideprotected void setup(Context context) throws IOException,InterruptedException {InputSplit split = context.getInputSplit();Path path = ((FileSplit) split).getPath();filenameKey = new Text(path.toString());}@Overrideprotected void map(NullWritable key, BytesWritable value,Context context) throws IOException, InterruptedException 		  {context.write(filenameKey, value);}}@Overridepublic int run(String[] args) throws Exception {Configuration conf = new Configuration();System.setProperty("HADOOP_USER_NAME", "root");String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length != 2) {System.err.println("Usage: combinefiles <in> <out>");System.exit(2);}Job job = Job.getInstance(conf,"combine small files to sequencefile");//		job.setInputFormatClass(WholeFileInputFormat.class);job.setOutputFormatClass(SequenceFileOutputFormat.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(BytesWritable.class);job.setMapperClass(SequenceFileMapper.class);return job.waitForCompletion(true) ? 0 : 1;}public static void main(String[] args) throws Exception {int exitCode = ToolRunner.run(new SmallFilesToSequenceFileConverter(),args);System.exit(exitCode);}
}

http://www.ppmy.cn/news/65857.html

相关文章

1AE4混合电路耳放

设计目标&#xff1a; 1&#xff09;20W以内的总功耗&#xff08;包括灯丝部分&#xff09;&#xff1b; 2&#xff09;最大输入1.2Vrms信号&#xff1b; 3&#xff09;输出至少50毫瓦的功率&#xff1b; 4&#xff09;至少5倍以上的阻尼系数。 1AE4是较后期的直热管&#xff0…

在facebook上最容易开展的营销活动是什么?如何开展?

在Facebook上最容易开展的营销活动包括社交媒体广告、社群互动、社交内容分享以及活动与促销。这些活动可以帮助企业吸引目标受众、增加品牌曝光度、提高用户参与度和促进销售。下面让我们详细了解一下如何开展这些活动&#xff0c;并给出相应的案例。 1.社交媒体广告&#xff…

ChatGPT入门到高级【第四章】

第一章&#xff1a;Chatgpt的起源和发展 1.1 人工智能和Chatbot的概念 1.2 Chatbot的历史发展 1.3 机器学习技术在Chatbot中的应用 1.4 Chatgpt的诞生和发展 第二章&#xff1a;Chatgpt的技术原理 2.1 自然语言处理技术 2.2 深度学习技术 2.3 Transformer模型 2.4 GPT模型 第…

ES6知识点

目录 1、let、cons、var的区别 2、const对象的属性可以修改吗 3、如果new一个箭头函数会怎么样 4、箭头函数和普通函数的区别&#xff1a; 5、扩展运算符的作用及使用场景 1、let、cons、var的区别 1️⃣&#xff1a;块级作用域&#xff1a;块作用域由{}包括&#xff0c;le…

idb使用教程(一)

概述 iOS开发桥&#xff08;idb&#xff09;是一个多功能的工具&#xff0c;用于自动化iOS模拟器和设备。它在一个一致的、对人友好的界面中暴露了很多分布在苹果工具中的功能。 安装 idb由两个部分组成&#xff0c;每个部分都需要单独安装。 idb伴侣 每个目标&#xff08…

央国企专场培训:太极信创研习院第33期ITAIP信创精华班培训在常州成功举办

4月25-27日&#xff0c;由太极计算机股份有限公司&#xff08;太极信创研习院&#xff09;联合中国中车集团有限公司&#xff08;科技质量与信息化部&#xff09;、中车信息技术有限公司&#xff08;中车学习培训发展中心&#xff09;共同举办的“信息技术应用创新专业人员&…

使用马哈鱼SQLFLow 1 分钟获取复杂 SQL 语句的血缘关系

数据血缘关系在企业的数据治理中是非常重要的一个环节&#xff0c;关于数据血缘在企业数据治理中的重要作用&#xff0c;可以参考这篇文章。SQL 语言在数据处理中被广泛使用&#xff0c;SQL 语句中包含了丰富的数据血缘关系&#xff0c;关于什么是 SQL 中的数据血缘&#xff0c…

仿抖音开发需要注意的问题

一、版权问题 仿抖音开发需要注意版权问题&#xff0c;包括内容的版权和软件的版权。在开发的过程中&#xff0c;不要直接抄袭他人的作品&#xff0c;应该注重保护知识产权。 二、安全性问题 仿抖音开发需要重视应用的安全性问题&#xff0c;避免应用在使用过程中发生安全漏…