常用输入格式
输入格式 |
特点 |
使用的RecordReader |
是否使用FileInputFormat的getSplits |
TextInputFormat |
以行偏移量为key,以换行符前的字符为Value |
LineRecordReader |
是 |
KeyValueTextInputFormat |
默认分割符为”\t”,根据分割符来切分行,前为key,后为value |
KeyValueLineRecordReader,内部使用LineRecordReader |
是 |
NLineInputFormat |
根据属性mapreduce.input.lineinputformat.linespermap所设置的行数为每片split的行数 |
LineRecordReader |
覆盖FileInputFormat的getSplits |
SequenceFileInputFormat |
使用Hadoop特有文件格式SequenceFile.Reader进行读写,读取二进制文件 |
SequenceFileRecordReader |
是 |
DBInputFormat |
通过与数据建立连接,将读取的数据根据map数进行分片 |
DBRecordReader |
继承InputFormat,实现分片和RecordReader |
常用输出格式
1. OutputFormat接口
OutputFormat为输出格式接口,主要用于描述输出数据的格式,它能将输出的键值对写入特定格式的文件中。输出格式的层次结构如下
2. 文本输出
Hadoop默认的输出格式为文本输出格式TextOutputFormat,其键和值可以使任意类型的,因为该输出方式会调用toString()方法将它们转化为字符串。每个键/值对由制表符进行分割,当然也可以设定 mapreduce.output.textoutputformat.separator 属性(旧版本 API 中为 mapred.textoutputformat.separator)改变默认的分隔符。
3. 二进制输出
二进制输出有三种方式:SequenceFileOutputFormat,SequenceFileAsBinaryOutputFormat和MapFileOutputFormat。重点掌握第一种。
对于SequenceFileOutputFormat,顾名思义,SequenceFileOutputFormat 将它的输出写为一个顺序文件。如果输出需要作为后续 MapReduce 任务的输入,这便是一种好的输出格式, 因为它的格式紧凑,并且很容易被压缩。而对于SequenceFileAsBinaryOutputFormat,它将键/值对作为二进制格式写到一个 SequenceFile 容器中。不同的是,MapFileOutputFormat 把 MapFile 作为输出。MapFile 中的键必须顺序添加,所以必须确保 reducer 输出的键已经排好序。
4. 多个输出
由于默认情况下只有一个 Reducer,输出只有一个文件。有时可能需要对输出的文件名进行控制或让每个 reducer 输出多个文件。
当只有一个reduce时,输出文件命名格式为:part-r-00000。当有两个reduce时,输出文件命名格式为:part-r-00000,part-r-00001。当有多个时以此类推。实现Reducer输出多个文件主要有以下两种方式:Partitioner和MultipleOutputs。
4.1 Partitioner
我们考虑这样一个需求:按学生的年龄段,将数据输出到不同的文件路径下。这里我们分为三个年龄段:小于等于20岁、大于20岁小于等于50岁和大于50岁。
我们采用的方法是每个年龄段对应一个 reducer。为此,我们需要通过以下两步实现。
第一步:把作业的 reducer 数设为年龄段数即为3。
job.setPartitionerClass(PCPartitioner.class);//设置Partitioner类 job.setNumReduceTasks(3);// reduce个数设置为3
第二步:写一个 Partitioner,把同一个年龄段的数据放到同一个分区。
public static class PCPartitioner extends Partitioner< Text, Text> { @Override public int getPartition(Text key, Text value, int numReduceTasks) { // TODO Auto-generated method stub String[] nameAgeScore = value.toString().split("\t"); String age = nameAgeScore[1];//学生年龄 int ageInt = Integer.parseInt(age);//按年龄段分区 // 默认指定分区 0 if (numReduceTasks == 0) return 0; //年龄小于等于20,指定分区0 if (ageInt <= 20) { return 0; } // 年龄大于20,小于等于50,指定分区1 if (ageInt > 20 && ageInt <= 50) { return 1 % numReduceTasks; } // 剩余年龄,指定分区2 else return 2 % numReduceTasks; } }
这种方法即实现了多文件输出,但也只能满足此种需求。很多情况下是无法实现的,因为这样做存在两个缺点:
1)需要在作业运行之前需要知道分区数和年龄段的个数,如果分区数很大或者未知,就无法操作。
2)一般来说,让应用程序来严格限定分区数并不好,因为这样可能导致分区数少或分区不均。
4.2 MultipleOutputs
MultipleOutputs 类可以将数据写到多个文件,这些文件的名称源于输出的键和值或者任意字符串。这允许每个 reducer(或者只有 map 作业的 mapper)创建多个文件。 采用name-m-nnnnn 形式的文件名用于 map 输出,name-r-nnnnn 形式的文件名用于 reduce 输出,其中 name 是由程序设定的任意名字, nnnnn 是一个指明块号的整数(从 00000 开始)。块号保证从不同块(mapper 或 reducer)写的输出在相同名字情况下不会冲突。
实例将在下一篇博文(MapReduce实战:邮箱统计及多输出格式实现)给出!
5. 数据库输出
DBOutputFormat 适用于将作业输出数据(中等规模的数据)转存到Mysql、Oracle等数据库。如果数据量较大请考虑其他方法将输出数据导入或转存到数据库中。
相关推荐
Combine的输入输出键值对类型与Reduce阶段相同,这有助于减少网络传输的数据量和提高性能。 2. Partition:负责将Map输出的键值对分配给对应的Reduce任务。Partitioner决定了Map输出的每个键值对应该传递给哪个...
这是 MapReduce 的多路径输入输出示例代码。有关大数据的相关文章可以阅读我的专栏:《大数据之Hadoop》 http://blog.csdn.net/column/details/bumblebee-hadoop.html
6. **MapReduce输入输出格式** - 输入数据通常被分割成多个split,每个split对应一个map任务。 - 输出数据默认按字典顺序排序,key+迭代器形式,便于reduce处理。 综上所述,HDFS和MapReduce是大数据处理的关键...
02.mapreduce数据输入输出类型的序列化问题--明确jobsubmitter.mp4
实验项目“MapReduce 编程”旨在让学生深入理解并熟练运用MapReduce编程模型,这是大数据处理领域中的核心技术之一。实验内容涵盖了从启动全分布模式的Hadoop集群到编写、运行和分析MapReduce应用程序的全过程。 ...
3. 实现TableOutputFormat:MapReduce的输出格式默认为文件,但要将结果直接写入HBase,需自定义TableOutputFormat类,使其能够将MapReduce的输出直接转化为HBase的Put操作。 4. 写入HBase:在Reduce阶段,每个...
在基于MapReduce实现决策树算法中,MapReduce框架可以对输入数据进行分区和处理,使得决策树算法的计算可以并行进行。 4. 决策树算法在MapReduce中的优化:在基于MapReduce实现决策树算法中,需要对决策树算法进行...
书中可能还会包含其他更高级的主题,如自定义输入/输出格式、MapReduce工作流以及如何优化MapReduce作业性能等。总的来说,《MapReduce设计模式》是一本实用的参考书,对于希望深入理解和利用MapReduce框架的IT专业...
通过Hadoop的`Job`类和相关输入输出格式类,可以设置这些参数并提交作业到Hadoop集群执行。 总结起来,这个实验不仅介绍了MapReduce的基本概念,还展示了如何用Java实现MapReduce任务,以解决实际问题。通过这种...
同时,还需要对Hadoop集群的操作和配置有一定了解,例如如何配置输入输出格式,以及如何调优MapReduce作业以提高性能。 在文档中还提到了如何使用LZO压缩格式。LZO是一种用于压缩文件的数据压缩库,可以提高存储...
- Reduce阶段的目标是减少输出数据量,通常输出的数据量远小于输入数据量。 #### 三、MapReduce的设计原则 为了确保MapReduce能够在大规模集群上高效运行,其设计遵循以下原则: - **数据不变性**:在MapReduce...
在实践中,开发者还需要考虑如何配置Job和输入输出路径、如何处理配置参数以及如何打包和运行MapReduce作业。对于初学者来说,理解和使用Hadoop MapReduce多输出功能可能具有一定难度,但通过熟悉...
3. **数据输入与输出**:探讨InputFormat和OutputFormat接口,理解如何自定义输入输出格式以适应不同类型的数据源。 4. **错误处理与容错机制**:讲解Hadoop的检查点、重试和故障恢复策略,以确保任务的可靠性。 5...
它首先将输入文本分割成单词,然后对每个单词进行计数,最后输出每个单词及其对应的数量。 3. **Map 阶段**: 在 Map 阶段,输入数据被分割成多个块(Block),每个块会分配到集群中的一个节点上进行处理。Mapper ...
在Hadoop MapReduce框架中,OutputFormat扮演着至关重要的角色,它是定义如何将Mapper和Reducer产生的中间结果转化为最终输出格式的规范。MapReduce之OutputFormat数据输出主要涉及到以下几个方面: 1. **...
5. **输入输出格式优化**:选择合适的输入输出格式,如SequenceFile或TextOutputFormat,可以提高读写效率。 6. **内存管理**:合理设置Java堆大小,避免因内存溢出导致的任务失败。 对于Hadoop的问题,常见的挑战...
3. Mapper和Reducer:Mapper和Reducer是MapReduce框架中的两个主要组件,Mapper负责将输入数据集映射成键值对,Reducer负责聚合Mapper输出的键值对。 4. 并行计算:该代码使用MapReduce框架来实现Apriori算法的并行...
此外,还有Partitioner用于控制数据分发,Combiner用于本地聚合,以及InputFormat和OutputFormat用于定义输入和输出格式。 3. **Java编程**:Java是MapReduce的原生语言,使用Hadoop的API可以直接创建MapReduce程序...