设为首页 收藏本站
查看: 764|回复: 0

[经验分享] Hadoop深入学习:Partitioner组件的设计与实现

[复制链接]

尚未签到

发表于 2016-12-12 08:12:33 | 显示全部楼层 |阅读模式
本节我们来学习MapReduce编程框架中的Partitioner接口和其他相关的信息。
        Partitioner的作用就是对Mapper产生的中间数据进行分片,以便将同一分片的数据交给同一个Reducer处理,该过程是MapReduce的shuffle过程,特别是Map端的shuffle的一部分。
        Partitioner它直接影响Reduce阶段的负责均衡。在老版中,Partitioner是一个接口,继承了JobConfigurable接口,代码如下:
/**
* Partitions the key space.
*
* <p><code>Partitioner</code> controls the partitioning of the keys of the
* intermediate map-outputs. The key (or a subset of the key) is used to derive
* the partition, typically by a hash function. The total number of partitions
* is the same as the number of reduce tasks for the job. Hence this controls
* which of the <code>m</code> reduce tasks the intermediate key (and hence the
* record) is sent for reduction.</p>
*
* @see Reducer
*/
public interface Partitioner<K2, V2> extends JobConfigurable {
/**
* Get the paritition number for a given key (hence record) given the total
* number of partitions i.e. number of reduce-tasks for the job.
*   
* <p>Typically a hash function on a all or a subset of the key.</p>
*
* @param key 基于该key对数据分组儿.
* @param value the entry value.
* @param numPartitions 每个Mapper的分片数.
* @return the partition number for the <code>key</code>.
*/
int getPartition(K2 key, V2 value, int numPartitions);
}
   
         MapReduce提供了两个Partitioner实现类:HasdPartitioner和TotalOrderPartitioner。
         默认情况下,MapReduce分布式计算模型使用的是HasdPartitioner,它实现了一种基于Hash值的分片算法:
/** Partition keys by their {@link Object#hashCode()}.
*/
public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {
public void configure(JobConf job) {}
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K2 key, V2 value,int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}


         TotalOrderPartitioner主要用于Hadoop中的对数据进行全排序,它提供了一种基于区间的分片算法,能按照大小将数据分成若干个区间即分片,并保证后一个区间的所有数据都大于前一个区间的数据,这大大提高了全局排序的性能和扩展性。
         使用TotalOrderPartitioner对数据进行全排序,要涉及到数据采样,需要和Hadoop采样器(如内置的IntercalSampler、RandomSampler和SplitSampler等,当然也可以实现直接的采样器)配合,具体步骤如下:
         第一步,数据采样。在Client端使用采样器(Sampler)获得分片的分割点;
         第二步,Map阶段。=在该阶段中涉及MapReduce编程模型的两个组件Mapper和Partitioner,Mapper可以采用IdentityMapper,直接输出数据,但Partitioner必须选用TotalOrderPartitioner,他将步骤1中获取的分割点保存到一颗trie树中,以便快速定位一个数据所在的区间。这样Mapper中产生的中间数据的N个区间就都是有序的;
         最后一步,Reduce阶段。在对每一个Reducer分配到的数据进行局部排序,最终得到经过全排序的数据。
         使用TotalOrderPartitioner的全排序的效率根key的分布规律和采样器的算法有直接关系。key值分布月均匀且采样越具有代表性,则Reduce Task负载月均衡,从而全排序的效率也就越高。
         有兴趣的朋友可以看一看TotalOrderPartitioner的使用示例TeraSort,这个示例可以在examples\org\apache\hadoop\examples\terasort包中招的到。
         在MapReduce编程框架中的其他两个组件Reduce和OutputFormat学习完后,鄙人会专门学习一下Hadoop的采样器Sampler和TotalOrderPartitioner,这里不再赘述。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312919-1-1.html 上篇帖子: Hadoop World 大会上的文章选摘(一) 下篇帖子: Hadoop环境准备(1)安装Ubuntu12.04 LTS 虚拟机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表