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权威指南学习(二)——HDFS & Hadoop IO
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输出多个文件