HDFS读和写

来源:互联网 发布:ubuntu教程 pdf 编辑:程序博客网 时间:2024/05/22 04:41

hadoop处理的输入数据通常很大,以GB或TB计。hadoop将大文件分割为多个块(分片、Input split),分别存在多个机器上。这样,当需要分析此大文件时,MapReduce程序在多台机器上并行处理。

分片不能太大,如果所有数据在一个分片内,那就无法并行处理;

分片不能太小,启动和停止每个分片也需要消耗时间。

HDFS使用FSDataInputStream读取文件,提供了随机读功能。


Mapper


Reducer


Partitioner

对于指定的Key和Value,选择对应的Reducer。

并不是整个MapReduce程序只有一个Reducer。

Combiner

在Mapper本地进行一次reduce操作


InputFormat

分割和读取文件的方式

HDFS提供的常用的:

TextInputFormat:

KeyValueTextInputFormat:

SequenceFileInputFormat:

NLineInputFormat:

也可以实现自己的InputFormat,只需实现两个方法:

getSplits:分割成多个输入分片,每个map任务分配一个分片。

getRecordReader:顺序读取指定分片中的所有记录,解析出Key和Value。

通常继承自FileInputFormat,已经实现了getSPlits,只需自己实现RecordReader即可。


OutputFormat

当MapReduce处理文件结束后,需要每个reducer把自己的输出写入到各自的文件里。

输出文件放在一个公用目录中,命名为part-nnnnn,nnnnn为reducer的分区ID。

相对应的,由RecordWriter对输出进行格式化。

HDFS提供的常用的:

TextOutputFormat:

SequenceFileOutputFormat:可以再由SequenceFileInputFormat再进行读取,这样可以串联起来,作为中间结果。

NullOutputFormat: