输入格式--InputFormat和InputSplit

本文深入探讨了MapReduce框架中的InputFormat与InputSplit的概念,详细介绍了它们的作用、类图及其如何通过代码指定数据输入格式。重点阐述了InputFormat的三个直接子类、InputSplit的三个子类以及如何通过job.setInputFormatClass方法指定输入格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1)InputFormat的类图:

InputFormat 直接子类有三个:DBInputFormat、DelegatingInputFormat和FileInputFormat,分别表示输入文件的来源为从数据库、用于多个输入以及基于文件的输入。对于FileInputFormat,即从文件输入的输入方式,又有五个继承子类:CombineFileInputFormat,KeyValueTextInput,NLineInoutFormat,SequenceFileInputFormat,TextInputFormat。

2)InputSplit的类图

输入分片InputSplit 类有三个子类继承:FileSplit (文件输入分片),CombineFileSplit(多文件输入分片)以及DBInputSplit(数据块输入分片)。

3)InputFormat:

 InputFormat有三个作用:

a.验证作业数据的输入形式和格式(要与MR程序中使用的格式相同,比如是TextInputFormat还是DBInputFormat)

b.将输入的数据切分为多个逻辑上的InputSplit,其中每一个InputSplit作为一个MApper的输入。

c.提供一个RecordReader,用于将InputSplit的内容转换为可以作为map输入的<k,v>键值对。

使用代码来指定MR作业数据的输入格式:

job.setInputFormatClass(TextInputFormat.class)

其实,InputFormat是一个抽象类,只是提供了两个抽象方法:

abstract List<InputSplit>getSplits(JobContext context);

abstract RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context)

只提供两个抽象方法是有原因的,首先不同的格式的文件切片的方法不同(对应于getSplits),同一份文件可能希望读出不同形式的内容(对应createRecordReader)。

getSplits:

InputFormat的直接派生类需要实现此方法,例如FileInputFormat和DBInputFormat。另外,InputSplit的类型在选择了InputFormat的类型就已经确定了的,因为每个InputFormat的派生类都实现了getSplits,在此方法内部已经生成了对应的InputSplit。

createRecordReader:

FileInputFormat的派生类都实现了这个方法。

4)

InputSplit:

任何数据分块儿的实现都继承自抽象基类InputSplit,它位于org.apache.hadoop.mapreduce.InputSplit。此抽象类中有两个抽象方法:

abstract long getLength()
abstract String[] getLocation()

 getLength()返回该块儿的大小,单位是字节。getLocation()返回存储该数据块的数据节点的名称,例如:String[0]="Slave1",String[1]="Slave2".

这两个方法也是需要在InputSplit的派生类中实现的。

5)

InputSplit的大小:

一个数据分片的大小由以下三行代码确定:

goalSize=totalSize/(numSplits==0?1:numSplits)
//totalSize是输入数据文件的大小,numSplits是用户设置的map数量,就是按照用户自己
//的意愿,每个分片的大小应该是goalSize
minSize=Math.max(job.getLong("mapred.min.split.size",1),minSplitSize)
//hadoop1.2.1中mapred-default.xml文件中mapred.min.split.size=0,所以job.getLong("mapred.min.split.size",1)=0,而minSplitSize是InputSplit中的一个数据成员,在File//Split中值为1.所以minSize=1,其目的就是得到配置中的最小值。
splitSize=Math.max(minSize,Math.min(goalSize,blockSize))
//真正的分片大小就是取按照用户设置的map数量计算出的goalSize和块大小blockSize中最小值(这是为了是分片不会大于一个块大小,有利于本地化计算),并且又比minSize大的值。

  

  

转载于:https://www.cnblogs.com/lz3018/p/4913242.html

<think>好的,我现在需要帮助用户查找关于MapReduce编程开发的格式整理或最佳实践教程。首先,用户提到了之前的引用内容,但指出这些引用仅供参考,需要结合用户的实际需求。我需要确保回答结构清晰,分步骤解决问题,并保证真实可靠。 首先,我应该回顾MapReduce的基本概念,确保用户理解其核心原理。接着,整理格式规范,包括输入输出格式、MapperReducer的编写规范,以及代码结构。这部分需要结合具体的例子,比如使用InputFormatOutputFormat,以及如何设置键值对。然后,最佳实践部分应该涵盖性能优化,比如Combiner的使用、避免数据倾斜、资源调优等。这部分需要引用之前的引用内容,比如reduce端合并的问题,提到资源利用率不高数据倾斜,因此需要优化策略。接下来,生成相关问题,可能需要包括性能分析、优化方法、应用场景等,类似于之前的示例。同时,要确保使用正确的中文回答,并正确应用LaTeX格式,不过用户的问题中没有数学公式,所以可能不需要,但系统级指令中提到要检查这一点。需要注意用户提到的引用标识,例如[^1][^2],这些引用来自用户提供的资料,可能需要适当引用到回答中,比如在讨论reduce端合并时引用[^1],或者在环境配置时引用[^2]。最后,确保回答符合用户需求,即格式整理最佳实践的教程,提供具体的步骤示例代码,如可能的Java代码片段,并解释每个部分的作用。同时,要指出常见问题及解决方法,比如数据倾斜的处理,资源调优参数设置等。总结下来,回答的结构应该是:核心概念、格式规范、最佳实践、常见问题,然后相关问题。需要分点清晰,使用代码块示例,并正确引用用户提供的参考资料。</think>### MapReduce编程开发格式整理与最佳实践 #### 一、核心概念与格式规范 1. **输入/输出格式** - **输入格式**:需通过`InputFormat`类定义数据读取方式(如`TextInputFormat`、`KeyValueTextInputFormat`或自定义格式)。例如,处理CSV文件时可用`TextInputFormat`逐行读取,再在Mapper中拆分字段[^1]。 - **输出格式**:使用`OutputFormat`控制结果写入方式(如`TextOutputFormat`)。若需输出结构化数据(如JSON),需自定义`RecordWriter`。 2. **Mapper/Reducer编写规范** - **Mapper**: ```java public static class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> { @Override protected void map(LongWritable key, Text value, Context context) { // 解析输入数据并生成键值对,如 (word, 1) context.write(new Text(word), new IntWritable(1)); } } ``` - **Reducer**:需处理键的分组与聚合逻辑,避免在`reduce()`中执行复杂计算[^1]。 3. **代码结构标准化** - 主类应包含`main`方法,配置`Job`对象并设置输入/输出路径、Mapper/Reducer类等。 - 使用`ToolRunner`管理配置参数以提高可维护性。 #### 二、最佳实践 1. **性能优化** - **Combiner使用**:在Mapper后添加本地聚合,减少网络传输。例如,词频统计中可直接在Combiner中合并相同键的值。 - **避免数据倾斜**:通过预处理分散热点键(如添加随机前缀),或在Reducer中动态调整负载[^1]。 2. **资源调优** - 调整`mapreduce.task.timeout`防止任务超时失败。 - 设置`mapreduce.map.memory.mb``mapreduce.reduce.memory.mb`合理分配内存。 3. **数据治理** - **输入验证**:在Mapper中添加数据清洗逻辑(如过滤非法字段)。 - **输出压缩**:启用`mapreduce.output.fileoutputformat.compress`减少存储占用。 #### 三、常见问题与解决 - **Reduce端压力过大**:若合并操作集中在Reduce阶段,可改用Map端预聚合或优化分区策略[^1]。 - **环境配置错误**:确保Hadoop集群启动正常(通过`jps`验证服务状态),并在Eclipse中正确配置Hadoop插件[^2]。 ```java // 示例:自定义输入格式(读取XML片段) public class XMLInputFormat extends FileInputFormat<Text, Text> { @Override public RecordReader<Text, Text> createRecordReader(InputSplit split, TaskAttemptContext context) { return new XMLRecordReader(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值