前言
hadoop已经出来这么长时间了,分区的文章早已经多如牛毛,为何你还要写呢?
其实呢,这篇文章主要是想要介绍一下使用MR自定义分区需要注意的一些点。
前言
hadoop已经出来这么长时间了,分区的文章早已经多如牛毛,为何你还要写呢?
其实呢,这篇文章主要是想要介绍一下使用MR自定义分区需要注意的一些点。
可能早有前辈已经指出该问题了。但还是容我自己做一个小小的记录,哈哈哈~~~
我们知道map数据会写入到分区,默认的分区只有一个,但是我想要10个又或者是100个,可以吗?
当然是可以的是。
你只需要创建一个类继承org.apache.hadoop.mapreduce.Partitioner
类就可以完全定义自己想要的分区方式。
然后在job中设置自定义的Partitioner类即可。
但是,这样写真的就结束了吗?
一个例子
PartitionMapper.java
AgePartitioner.java
ParitionReducer.java
驱动类,具体的模板代码我就不再写入,只将Partitioner设置展示
以上这个例子,是我在其它文章中截取下来的,具体地址,会在链接中给出。
现在,你可以运行该例子,你会发现Reduce输出的只有一个文件,然后你还会发现其实使用的并非是自定义
的Partitioner类。
一开始的时候,我有点懵逼了。what?我的设置没有生效吗?
你的设置是没有问题的,但是你却忘记了一项重要的事情。究竟是什么事情呀,快点说说呀(臭鱼)。
在说出这个秘密之前,我们看看map的context.write()这个方法是怎么做的吧。
MapTask.java
其中partitioner是在哪里定义的呢?
在NewOutputCollector类中,该类作为MapTask内部类。
我们来看看构造函数之中,如果partitions大于1就从配置中读取我们自己的Partitioner对象并实例化给引用,否则自己就创建一个实例。
那partitions是从jobContext.getNumReduceTasks();读取出来的,这个要怎么配置呢?
job.setNumReduceTasks(number);
配置该值之后,那么就可以使用我们自己定义的分区函数了。
好了,文章到这里也就结束了,欢迎大家拍砖!!!