MapReduce的使用者通常会指定Reduce任务和Reduce任务输出文件的数量(R)。我们在中间key上使用分区函数来对数据进行分区,之后再输入到后续任务执行进程。一个缺省的分区函数是使用hash方法(比如,hash(key) mod R)进行分区。hash方法能产生非常平衡的分区。然而,有的时候,其它的一些分区函数对key值进行的分区将非常有用。比如,输出的key值是URLs,我们希望每个主机的所有条目保持在同一个输出文件中。为了支持类似的情况,MapReduce库的用户需要提供专门的分区函数。例如,使用“hash(Hostname(urlkey))
mod R”作为分区函数就可以把所有来自同一个主机的URLs保存在同一个输出文件中。
/**
* to keep sort as global
*
* @author hadoop
*
*/
public static class Partition extends Partitioner<IntWritable, IntWritable> {
@Override
public int getPartition(IntWritable key, IntWritable value,
int numPartitions) {
int MaxNumber = 65223;
int bound = MaxNumber / numPartitions + 1;
int keynumber = key.get();
for (int i = 0; i < numPartitions; i++) {
if (keynumber < bound * i && keynumber >= bound * (i - 1))
return i - 1;
}
return 0;//return -1; (error)
}
}
上面的这段代码是自己实现的简单分区,最大值未输入的一个最大数字。我用1.2.1版本,无论如何,分区返回不能为-1,所以改成0
hadoop的map/reduce中支持对key进行分区,从而让map出来的数据均匀分布在reduce上,当然,有时候由于机器间配置问题,可能不需要数据均匀,这时候也能派上用场。
框架自带了一个默认的分区类,HashPartitioner,先看看这个类,就知道怎么自定义key分区了。
public class HashPartitioner<K, V> extends Partitioner<K, V> {
/** Use {@link Object#hashCode()} to partition. */
public int getPartition(K key, V value,
int numReduceTasks) {
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
很简单,继承Partitioner即可。
先解释一下这个HashPartitioner做的事情
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
将key均匀分布在ReduceTasks上,举例如果Key为Text的话,Text的hashcode方法跟String的基本一致,都是采用的Horner公式计算,得到一个int,string太大的话这个int值可能会溢出变成负数,所以与上Integer.MAX_VALUE(即0111111111111111),然后再对reduce个数取余,这样就可以让key均匀分布在reduce上。
这个简单算法得到的结果可能不均匀,因为key毕竟不会那么线性连续,这时候可以自己写个测试类,计算出最优的hash算法。
PS:hadoop框架本身包含了一些跟hash算法相关的数学之美,比如布隆过滤器(BloomFilter),写好hash函数是关键。
Partitioner
首先需要继承自Partitioner类(在0.19中为Partitioner接口),并重载它的getPartition方法:
- publicstaticclassCatPartitionerextendsPartitioner<Text,Text>{
-
@Override
-
publicintgetPartition(Textkey,Textvalue,intnumPartitions){
-
String[]parts=key.toString().split("-");
-
if(parts.length==2){
-
returnMath.abs(parts[0].hashCode())%numPartitions;
- }
-
returnMath.abs(key.toString().hashCode())%numPartitions;
- }
- }
然后在job配置中设置Partitioner Class:
分享到:
相关推荐
Hadoop 自定义 Partitioner 实现
Hadoop 自定义 Partitioner 实现
Hadoop 自定义 Partitioner 源代码
NULL 博文链接:https://roserouge.iteye.com/blog/746391
3.1 HDFS 文件操作 3.1.1 基本文件命令 3.1.2 编程读写HDFS 3.2 剖析MapReduce 程序 3.2.1 Hadoop数据类型 3.2.2 Mapper 3.2.3 Reducer 3.2.4 Partitioner:重定向Mapper输出 3.2.5 Combiner:本地reduce ...
Partitioner.zip;Partitioner.zip;Partitioner.zip;
基于Hadoop2.2.0的词频统计的例子。包含一个大概十万以上单词的测试数据文件。重写了Partitioner和Combiner,供学习之用。 访问博文 http://blog.csdn.net/zythy/article/details/17852579 以查看详细讲解。
30第3章 Hadoop组件 313.1 HDFS文件操作 313.1.1 基本文件命令 323.1.2 编程读写HDFS 353.2 剖析MapReduce程序 373.2.1 Hadoop数据类型 393.2.2 Mapper 403.2.3 Reducer 413.2.4 Partitioner:...
MapReduce编程模型3.1 MapReduce编程模型概述3.1.1 MapReduce编程接口...Partitioner接口的设计与实现3.4 非Java API解析3.4.1 Hadoop Streaming的实现原理3.4.2 Hadoop Pipes的实现原理3.5 Hadoop工作流3.5.1 ...
数据算法--HadoopSpark⼤数据处理技巧 data algorithms部分主题⾃写scala程序实现 SecondarySort (chapter 1) data 2015,1,1,10 2015,1,2,11 2015,1,3,12 2015,1,4,13 2015,2,1,22 2015,2,2,23 2015,2,3,24 2015,2,4...
这篇教程从用户的角度出发,全面地介绍了Hadoop Map/Reduce框架的各个方面。
Hadoop组件3.1 HDFS 文件操作3.1.1 基本文件命令3.1.2 编程读写HDFS3.2 剖析MapReduce 程序3.2.1 Hadoop数据类型3.2.2 Mapper3.2.3 Reducer3.2.4 Partitioner:重定向Mapper输出3.2.5 Combiner:本地reduce3.2.6 ...
313.1 HDFS文件操作 313.1.1 基本文件命令 323.1.2 编程读写HDFS 353.2 剖析MapReduce程序 373.2.1 Hadoop数据类型 393.2.2 Mapper 403.2.3 Reducer 413.2.4 Partitioner:重定向Mapper输出 413.2.5 Combiner:本地...
Partitioner的作用是对Mapper产生的中间结果进行分片,以便将同一分组的数据交给同一个Reducer处理,它直接影响Reduce阶段的负载均衡。旧版API中Partitioner的类图如图所示。它继承了JobConfigurable,可通过...
使用Hadoop Streaming技术将Last比对软件快速部署到云计算环境中,解决当前单机版Last比对软件处理大数据能力差的问题。通过自定义的基于NFS 文件系统的数据集切分方法和基于Partitioner的任务分配方式能够实现均衡...
Hadoop 培训课程(4)MapReduce_2 标准和自定义计数器* Combiner和Partitioner编程** 自定义排序和分组编程** 常见的MapReduce算法** ---------------------------加深拓展---------------------- 常见大数据处理方法*
人工智能-hadoop
word源码java hadoop-test hadoop、mapreduce的一些练习 包org.dan.service Hadoop ...包org.dan.mr.max_order_price MapReduce编写自定义的Partitioner和GroupingComparator实现高效求最大值 包org.dan.mr.smallfile M
Hadoop、Spark、Kafka、Hbase..... 等,更新中... 综合实践项目 项目名 说明 使用 Spark SQL imooc 访问日志,数据清洗,统计,可视化 入门学习示例 项目名 所属组件 介绍 MapReduce MapReduce 实验 - 计算气温 最大...