Hadoop权威指南学习(五)

1. MapReduce的类型

map:(K1,V1)-->list(K2, V2);combine:(K2,list(V2))-->list(K2, V2);reduce:(K2,list(V2))-->list(K3, V3),如果combine和reduce函数是一样的,则K2=K3,V2=V3;partition:(K2, V2)--> integer,partition函数处理(K2,V2),返回一个分区索引。

默认的map和reduce函数是IdentityMapper和IdentityReducer,均是泛型类型,简单的将所有输入写到输出中。默认的partitioner是HashPartitioner,对每天记录的键进行哈希操作以决定改记录属于那个分区让reduce处理

相关阅读:

Hadoop权威指南学习(七)——其他

Hadoop权威指南学习(六)——MapReduce的特性

Hadoop权威指南学习(五)——MapReduce的类型和格式

Hadoop权威指南学习(四)——MapReduce工作机制

Hadoop权威指南学习(三)——MapReduce应用开发

Hadoop权威指南学习(二)——HDFS & Hadoop IO

Hadoop权威指南学习(一)——关于Mapreduce

2. 输入格式

输入分片与记录:一个输入分片(split)是由单个map处理的输入块,每个分片包含若干记录(key+value),map函数依次处理每条记录。输入分片表示为InputSplit接口,其包含一个以自己为单位的长度和一组存储位置,分片不包含数据本身,而是指向数据的引用。

分片由InputFormat::getSplits(jonconf, numsplits)函数产生,客户端将计算好分片发送给jobtracker,由jobtracker根据存储信息分配给tasktracker,tasktracker通过InputFormat::getRecordReader(split, jobconf, reporter)方法获得RecordReader,传递给map函数

FileInputFormat类:输入路径可由多个函数指定,还可以利用setInputPathFilter()设置过滤器,输入分片的大小可参见关于map task和reduce task的个数  

针对小文件,FileInputFormat会为每个文件产生一个split,而CombineFileInputFormat把多个文件打包到一个分片中以便每个mapper可以处理更多数据。若要存储大量小文件,应使用SequenceFile将其合并,否则很浪费namenode的内存。

将整个文件作为一条记录处理:需要定义两个方法:一是将isSplitable()方法重载成返回false值,制定输入文件不分片,二是实现getRecordReader()方法返回定制的RecordReader实现;

文本输入:TextInputFormat,每条记录一行输入,键是整个文件中的字节便宜量,值是行内容;KeyValueTextInputFormat针对文件中每一行就是键/值对,使用某个分解副分隔;NLineInputFormat让mapper处理固定函数的输入;StreamInputFormat利用StreamXmlRecordReader类处理xml。二进制输入:SequenceFileInputFormat。多种输入:MultipleInputs允许每天输入泸定制定InputFormat和Mapper,以处理多种文件。

3. 输出格式

基本与输入类型对应,其中MultipleOutputFormat和MultipleOutputs输出多个文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppfwd.html