标签:
一:背景
为了使得MapReduce计算后的结果显示更加人性化,Hadoop提供了分区的功能,可以使得MapReduce计算结果输出到不同的分区中,方便查看。Hadoop提供的Partitioner组件可以让Map对Key进行分区,从而可以根据不同key来分发到不同的reduce中去处理,我们可以自定义key的分发规则,如数据文件包含不同的省份,而输出的要求是每个省份对应一个文件。
二:技术实现
自定义分区很简单,我们只需要继承抽象类Partitioner,实现自定义的getPartitioner()方法即可,另外还要给任务设置分区:job.setPartitionerClass(),就可以了。
案例
阿里巴巴旗下三个子网站site1、site2、site3,每个网站对商品销售进行了统计,现在要汇总这三个网站的销售量,数据如下:
从上图可以看到有4种商品,很显然我们应该设置4个分区,代码如下:
打包运行程序:
程序运行结果:
如我们所愿,程序分了四个分区!
程序运行的日志:
有兴趣的可以去分析一下程序运行所消耗的资源:基于计算机资源分析MapReduce运行。
注:一个有意思的问题是,我直接使用Eclipse插件连接远程的Hadoop集群去跑这个程序就会报错,提示分区非法,在网上看到有人说,如果分区数大于1的时候,就必须打成jar包才能正常运行,天知道呢,就这样吧,反正也没有更好的解释了!
标签:
原文地址:http://www.cnblogs.com/thinkpad/p/5173735.html