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处理
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输出多个文件
本文深入探讨了MapReduce的工作机制,包括类型、输入输出方式、处理流程及优化策略,特别关注了不同输入输出格式的选择与应用,以及如何根据不同场景灵活配置MapReduce任务以提升效率。
——MapReduce的类型和格式&spm=1001.2101.3001.5002&articleId=6949686&d=1&t=3&u=f7619e3cfa1d46448f87eb86906f5449)
829

被折叠的 条评论
为什么被折叠?



