您好,欢迎访问一九零五行业门户网

深入解析MapReduce架构设计与实现原理–读书笔记(4)MR及Partitio

mr解析 mapper/reducer封装了应用程序的数据处理逻辑。 所有存储在底层分布式文件系统上的数据均要解释成key/value的形式。并交给mr中的map/reduce函数处理,产生另外一些key/value。 mapper 1)初始化 mapper继承了jobconfigurable接口。该config方法允许通
mr解析mapper/reducer封装了应用程序的数据处理逻辑。
所有存储在底层分布式文件系统上的数据均要解释成key/value的形式。并交给mr中的map/reduce函数处理,产生另外一些key/value。
mapper1)初始化mapper继承了jobconfigurable接口。该config方法允许通过jobconf参数对mapper进行初始化。
2)map操作mapreduce会通过inputformat中recordreader从inputsplit获取一个key/value对,并交给map()函数处理:
void map(k1 key,v2 value,outputcollector output,reporter reporter) throws ioexception;
3)清理mapper通过继承colseable获得close方法,用户可通过实现该方法对mapper进行清理。
mapper类型chainmapper 链式作业;identitymapper对于输入不进行任何处理,直接输出;invertmapper 交换key/value位置;
regexmapper 正则表达式字符串分割;tokenmapper 将字符串分割成若干个token,可用作wordcount的mapper;
longsumreducer:以key为组,对long类型的value求累加和。
新的mapper由接口变为抽象类;不再继承jobconfigurable和closeable,而是直接在类中添加了setup和cleanup两个方法进行初始化和清理工作。
将参数封装到context对象中,接口具有良好扩展性。
去掉maprunnable接口,在mapper中添加run方法,以方便用户定制map()函数的调用方法。
新api中,reducer遍历value的迭代器类型变为iterable
void reduce(keyin key,iteratable values,context context) throws ioexception,interrupteexception{for(valuein value:values){ context.write((keyout) key,(valueout) value);}}
partitioner接口的设计与实现partitioner的作用是对mapper产生的中间结果进行分片,以便将同一分组的数据交给同一个reducer处理,它直接影响reduce阶段的负载均衡。
只包含一个待实现的方法getpartition。该方法包含3个参数,均由框架自传入,前面2个参数是key/value,第三个参数numpartitions表示每个mapper的分片数,
也就是reducer的个数。
hashpartitioner和totalorderpartitioner。其中hashpartitioner是默认实现:public int getpartition(k2 key,v2 value,int numreducetasks){return (key.hashcode() & integer.max_value) % numreducetasks ;}
totalorderpartitioner提供了一种基于区间的分片方法,通常用在数据全排序中,归并排序。
在map阶段,每个maptask进行局部排序;在reduce阶段,启动一个reducetask进行全局排序。由于作业只能有一个reducetask,因此会产生瓶颈。
totalorderpartitioner按照大小将数据分成若干个区间,并保证后一个区间的所有数据均大于前一个区间数据。步骤1:数据采样。在client端通过采样获取分片的分割点。
采样数据:b,abc,abd,bcd,abcd,efg,hii,afd,rrr,mnk
排序后:abc,abcd,abd,afd,b,bcd,efg,hii,mnk,rrr
如果有4个reduce task,则采样数据的四等分点为abd,bcd,mnk
步骤2:map阶段。mapper可采用identitymapper直接将输入数据输出,totalorderpartitioner将步骤1中获取的分割点保存到trie树中以便快速定位任意一个记录所在的区间,这样每个
map task产生r个区间,且区间中间有序。
步骤3:reduce阶段。每个reducer对分配到的区间数据进行局部排序,最终得到全排序数据。
totalorderpartitioner有2个典型应用实例;terasort和hbase。
hbase内部数据有序,region之间也有序。
原文地址:深入解析mapreduce架构设计与实现原理–读书笔记(4)mr及partitioner, 感谢原作者分享。
其它类似信息

推荐信息