一个有目标,为自己的未来努力奋斗的人
分类: HADOOP
2015-02-03 15:45:27
Partition & Shuffle:当第一个map任务完成后,节点可能还要继续执行更多的map任务,但这时候
也开始把map任务的中间输出交换到需要它们的reducer那里去,这个移动map输出到reducer的过程叫做shuffle。每一个reduce
节点会分派到中间输出的键集合中的一个不同的子集合,这些子集合(被称为“partitions”)是reduce任务的输入数据。每一个map任务生成
的键值对可能会隶属于任意的partition,有着相同键的数值总是在一起被reduce,不管它是来自那个mapper的。因此,所有的map节点必
须就把不同的中间数据发往何处达成一致。Partitioner类就是用来决定给定键值对的去向,默认的分类器(partitioner)会计算键的哈希
值并基于这个结果来把键赋到相应的partition上,自定义的分类器在第五部分有详细描述。
排序:每一个reduce任务负责归约(reduceing)关联到相同键上的所有数值,每一个节点收到的中间键集合在被送到具体的reducer那里前就已经自动被Hadoop排序过了。
归约(Reduce):每
个reduce任务都会创建一个Reducer实例,这是一个用户自定义代码的实例,负责执行特定作业的第二个重要的阶段。对于每一个已赋予到
reducer的partition内的键来说,reducer的reduce()方法只会调用一次,它会接收一个键和关联到键的所有值的一个迭代器,迭
代器会以一个未定义的顺序返回关联到同一个键的值。reducer也要接收一个OutputCollector和Report对象,它们像在map()方
法中那样被使用。
输出格式:提供给OutputCollector的键值对会被写到输出文件中,写入的方式由输出格式控制。
OutputFormat的功能跟前面描述的InputFormat类很像,Hadoop提供的OutputFormat的实例会把文件写在本地磁盘或
HDFS上,它们都是继承自公共的FileInputFormat类。每一个reducer会把结果输出写在公共文件夹中一个单独的文件内,这些文件的命
名一般是part-nnnnn,nnnnn是关联到某个reduce任务的partition的id,输出文件夹通过
FileOutputFormat.setOutputPath()
来设置。你可以通过具体MapReduce作业的JobConf对象的setOutputFormat()方法来设置具体用到的输出格式。下表给出了已提
供的输出格式:
输出格式 |
描述 |
TextOutputFormat |
默认的输出格式, 以 "key \t value" 的方式输出行 |
SequenceFileOutputFormat |
输出二进制文件,适合于读取为子MapReduce作业的输入 |
NullOutputFormat |
忽略收到的数据,即不做输出 |
表4.2: Hadoop提供的输出格式
Hadoop提供了一些OutputFormat实例用于写入文件,基本的(默认的)实例是
TextOutputFormat,它会以一行一个键值对的方式把数据写入一个文本文件里。这样后面的MapReduce任务就可以通过
KeyValueInputFormat类简单的重新读取所需的输入数据了,而且也适合于人的阅读。还有一个更适合于在MapReduce作业间使用的中
间格式,那就是SequenceFileOutputFormat,它可以快速的序列化任意的数据类型到文件中,而对应
SequenceFileInputFormat则会把文件反序列化为相同的类型并提交为下一个Mapper的输入数据,方式和前一个Reducer的生
成方式一样。NullOutputFormat不会生成输出文件并丢弃任何通过OutputCollector传递给它的键值对,如果你在要
reduce()方法中显式的写你自己的输出文件并且不想Hadoop框架输出额外的空输出文件,那这个类是很有用的。
RecordWriter:这个跟InputFormat中通过RecordReader读取单个记录的实现很相似,OutputFormat类是RecordWriter对象的工厂方法,用来把单个的记录写到文件中,就像是OuputFormat直接写入的一样。
Reducer输出的文件会留在HDFS上供你的其它应用使用,比如另外一个MapReduce作业,或一个给人工检查的单独程序。