在hadoop作业中自定义分区和归约

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/43735703

当遇到有特殊的业务需求时,需要对hadoop的作业进行分区处理

那么我们可以通过自定义的分区类来实现

还是通过单词计数的例子,JMapper和JReducer的代码不变,只是在JSubmit中改变了设置默认分区的代码,见代码:

		//1.3分区
		//设置自定义分区类
		job.setPartitionerClass(JPartitioner.class);
		//设置分区个数--这里设置成2,代表输出分为2个区,由两个reducer输出
		job.setNumReduceTasks(2);

自定义的JPartitioner代码如下:

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;

//自定义的分区类必须继承Partitioner类,这里只要继承默认的HashPartitioner,并重写getPartition方法即可
public class JPartitioner extends HashPartitioner<Text, LongWritable> {
	@Override
	public int getPartition(Text key, LongWritable value, int numReduceTasks) {
		//由于之前在代码中设置了分区的个数为2,
		//getPartition方法的返回值就是分区的下标,如:第一个分区return 0,第二个return 1
		//如果key的长度小于4,那么将这些键值对分入第一个区
		//否则就分入第二个区,<span style="font-family: Arial, Helvetica, sans-serif;">numReduceTasks是设置的分区数量</span>
		return key.toString().length() < 4 ? 1 % numReduceTasks
<span style="white-space:pre">				</span>: 2 % numReduceTasks;
	}
}

自定义分区就完成了


如果在海量数据的情况下,可能要设置归约(combiner)来减轻网络和reducer的压力

那么可以再JSubmit中通过代码设置combiner的类来启动

代码很简单,就一句话

<span style="white-space:pre">		</span>//1.5归约
		job.setCombinerClass(JReducer.class);

其实combiner和reducer都是设置的JReducer

侧面反映了combiner的角色作就是本地的reducer


优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/667835

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。