`

hadoop中的Partitioner分区

阅读更多
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函数是关键。
分享到:
评论

相关推荐

    Hadoop 自定义 Partitioner 源代码

    其中,Partitioner 是 Hadoop MapReduce 框架中的关键组件,它负责决定 map 函数产生的中间键值对(key-value pairs)应被哪些 reduce task 处理。自定义 Partitioner 允许用户根据业务需求定制键的分发策略,从而...

    Hadoop平台技术 分区操作案例.docx

    1. 默认的Partitioner分区规则: 默认的HashPartitioner是基于key的hashCode值来决定数据流向哪个Reducer。计算公式为`(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks`。这里的numReduceTasks是设定的...

    Partitioner.zip

    而"Partitioner"在Hadoop MapReduce框架中扮演着至关重要的角色。这个名为"Partitioner.zip"的压缩包很可能包含了关于Hadoop MapReduce Partitioner的相关资料或实现代码。 Partitioner在Hadoop MapReduce的工作...

    Partitioner, SortComparator and GroupingComparator in Hadoop

    在Hadoop MapReduce框架中,Partitioner、SortComparator和GroupingComparator是三个至关重要的组件,它们共同决定了数据如何被分发、排序以及分组,从而影响到整个MapReduce作业的性能和结果的正确性。接下来,我们...

    hadoop分区二次排序示例.zip

    在这个“hadoop分区二次排序示例.zip”压缩包中,我们重点探讨的是如何在Hadoop MapReduce中实现特定的排序逻辑,即二次排序和分区策略。 首先,我们需要理解什么是二次排序。在标准的MapReduce流程中,数据经过map...

    007_hadoop中MapReduce应用案例_1_数据去重

    有时,我们需要自定义分区器(Partitioner)来确保相同的键被发送到同一个reducer,这样可以确保在同一台机器上处理所有重复项。 此外,`源码`标签提示我们关注代码实现的细节,这可能包括对Hadoop API的使用,如`...

    Hadoop的分割程序的例子。程序显示我们如何在Hadoop的MapReduce程序使用一个分区.zip

    在描述中提到的“如何在Hadoop的MapReduce程序使用一个分区”意味着我们要了解如何在Java代码中实现自定义的Partitioner类。下面是一个基本的步骤: 1. **创建自定义Partitioner**: 首先,你需要创建一个新的Java...

    006_hadoop中MapReduce详解_3

    在Hadoop生态系统中,MapReduce是一种分布式计算框架,主要用于处理和生成大数据集。"006_hadoop中MapReduce详解_3"可能是指一个系列教程的第三部分,着重讲解MapReduce的核心概念、工作原理以及实际应用。在这个...

    Hadoop实现大矩阵乘法

    3. 分布式计算中的数据分区和排序,这对于reduce阶段的正确执行至关重要。 4. 并行计算中的负载均衡,如何合理地划分任务以优化性能。 总的来说,这个Hadoop实现大矩阵乘法的案例是理解分布式计算和Hadoop ...

    hadoop_join.jar.zip_hadoop_hadoop query_reduce

    例如,Sort-Merge Join要求输入数据已经按照Join键排序,这可以通过Hadoop的Partitioner和Comparator组件来实现。此外,为了减少网络传输和提高效率,可以采用数据本地化策略,确保参与Join的文件在同一台机器上处理...

    Hadoop-0.20.1+API

    6. **Hadoop数据流**:学习数据是如何从输入源经过map任务,shuffle过程,再到达reduce任务的,以及中间键值对的分区和排序机制。 7. **Hadoop容错机制**:理解Hadoop如何处理硬件故障,包括数据块的复制策略,节点...

    Hadoop Streaming 编程

    - `-partitioner` 和 `-combiner`:自定义分区器和组合器,用于优化数据处理。 - `-D`:设置作业属性,如 map 和 reduce 任务的数量,以及字段分隔符等。 **Hadoop Streaming 编程** 编程时,开发者需要考虑如何...

    实战hadoop源代码

    7. **实战案例**:书中的实战部分可能涉及实际业务场景,如网页点击流分析、日志处理、推荐系统等,这些案例将帮助你了解Hadoop在真实项目中的应用。 通过深入学习和实践这些源代码,你不仅可以掌握Hadoop的基本...

    hadoop的java_api

    默认情况下,键的哈希值决定分区,但可以通过自定义Partitioner来改变这一行为。 7. **Combiner**:Combiner是可选的,它可以作为Reducer的本地副本,用于在Map阶段对数据进行局部聚合,减少网络传输的数据量。 8....

    Hadoop命令使用手册中文版

    - 通过继承`org.apache.hadoop.mapreduce.Partitioner`类来自定义分区策略。 #### 四、安全性和权限控制 - **ACL访问控制**: - `hadoop fs -setacl &lt;aclspec&gt; &lt;path&gt;`:设置ACL权限。 - `hadoop fs -getfacl ...

    Hadoop - Hadoop Streaming

    $ hadoop jar hadoop-streaming.jar -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner -mapper mymapper -reducer myreducer -input input -output output ``` 这里 `org.apache.hadoop.mapred...

    005_hadoop中MapReduce详解_2

    - Partitioner: 控制数据如何被分配到不同的Reducer,默认是HashPartitioner,可以根据键的哈希值进行分区。 - Combiner: 可选地,可以在本地节点上对Map的输出进行局部聚合,减少网络传输的数据量,提高效率。 ...

    远程调用执行Hadoop Map/Reduce

    处理后的中间结果通过分区器(Partitioner)进行分区,并由Reducer消费。 5. **Reduce任务**:Reduce函数从多个Map任务的输出中收集相同分区的键值对,对其进行规约操作,最终生成最终结果。 6. **源码解析**:...

    hadoop01Demo

    "分区"是Hadoop中进一步优化数据分布的过程,通常是为了负载均衡或者特定的计算需求。通过自定义Partitioner,我们可以决定哪些键值对应于哪个Reducer,进而控制数据的处理流程。 最后,"获得最高温度"通常是在...

Global site tag (gtag.js) - Google Analytics