partitioner负责shuffle过程的分组部分,目的是让map出来的数据均匀分布在reducer上,当然,如果我们不需要数据均匀,那么这个时候可以自己定制符合要求的partitioner. 下面内容涉及到的源代码请参考https://hadoop.apache.org/docs/current/api/org/apache/hadoop/mapreduce/Partitioner.html

Partitioner

1.Maperduce提供了四中的partitioner,如下图所示,它们都实现了Partitioner基类中的方法,源代码如下:

  public abstract class Partitioner<KEY, VALUE> {
/**
* Get the partition number for a given key (hence record) given the total
* number of partitions i.e. number of reduce-tasks for the job.
*
* <p>Typically a hash function on a all or a subset of the key.</p>
*
* @param key the key to be partioned.
* @param value the entry value.
* @param numPartitions the total number of partitions.
* @return the partition number for the <code>key</code>.
*/
public abstract int getPartition(KEY key, VALUE value, int numPartitions); }

2.默认的为 HashPartitioner,实现的分组方式如下:

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;
}
}

3.BinaryPatitioner是partitioner的偏特化自雷,该类提供leftOffset和rightOffset,在计算时对key的[leftOffset,rightOffset]这个区间取hash.

4.KeyFieldBasedPartioner也是基于hash的partitionwe,和BinaryPatitioner不同,它提供了多个区间计算hash,当区间数为0时,退化成HashParitioner.5.TotalOrderPartitioner这个类可以实现输出的全排序。不同于以上3个partitioner,这个类并不是基于hash的。在另外一篇文章:hadoop之全排列

定制自己的partitioner

实现自己的partitioner只需要将自己的类继承Partitioner即可,如下面自定义分组代码:

public class MyPartition extends Partitioner<Text, LongWritable> {

    public int getPartition(Text key, LongWritable value, int numReduceTasks) {
return key.toString().contains("luoliang") ? 0 : 1;
}
}

在main函数中添加,实现定制的patitioner:

job.setPartitionerClass(MyPartitioner.class);

在文章Hadoop 2.2.0词频统计,实现了定制partitioner和combiner的单词统计的完整例子,可以作为参考.

待续

hadoop之定制自己的Partitioner的更多相关文章

  1. hadoop之定制自己的sort过程

    Key排序 1. 继承WritableComparator 在hadoop之Shuffle和Sort中,可以看到mapper的输出文件spill文件需要在内存中排序,并且在输入reducer之前,不同 ...

  2. hadoop之Shuffle和Sort

    MapRduce保证reducer的输入是按照key进行排过序的,原因和归并排序有关,在reducer接收到不同的mapper输出的有序数据后,需要再次进行排序,然后是分组排序,如果mapper输出的 ...

  3. MapReduce教程(二)MapReduce框架Partitioner分区<转>

    1 Partitioner分区 1.1 Partitioner分区描述 在进行MapReduce计算时,有时候需要把最终的输出数据分到不同的文件中,按照手机号码段划分的话,需要把同一手机号码段的数据放 ...

  4. Hadoop的那些事儿(转)

    原文:http://www.searchtb.com/tag/mapreduce       在说Hadoop之前,作为一个铁杆粉丝先粉一下Google.Google的伟大之处不仅在于它建立了一个强悍 ...

  5. MapReduce笔记——技术点汇总

    目录 · 概况 · 原理 · MapReduce编程模型 · MapReduce过程 · 容错机制 · API · 概况 · WordCount示例 · Writable接口 · Mapper类 ·  ...

  6. 初识Kafka:构架、生产消费模型以及其他相关概念

    当前使用的事件总线采用的是Kafka分布式消息队列来完成的,近来项目需要接入到事件总线中,故开启了kafka的学习之旅(之前一直在听说kafka这玩意儿,但是学习计划中还没有将它安排进去,借着这个机会 ...

  7. Apache Ranger安装部署

    1.概述 Apache Ranger提供了一个集中式的安全管理框架,用户可以通过操作Ranger Admin页面来配置各种策略,从而实现对Hadoop生成组件,比如HDFS.YARN.Hive.HBa ...

  8. Hadoop学习笔记—9.Partitioner与自定义Partitioner

    一.初步探索Partitioner 1.1 再次回顾Map阶段五大步骤 在第四篇博文<初识MapReduce>中,我们认识了MapReduce的八大步凑,其中在Map阶段总共五个步骤,如下 ...

  9. Hadoop的partitioner、全排序

    按数值排序 示例:按气温字段对天气数据集排序问题:不能将气温视为Text对象并以字典顺序排序正统做法:用顺序文件存储数据,其IntWritable键代表气温,其Text值就是数据行常用简单做法:首先, ...

随机推荐

  1. Python自动化之form验证

    model里面进行数据验证 在类里面定义一个clean方法 class User(models.Model): def clean(self): #在这个可以做一些验证的操作 pass 还可以手动抛出 ...

  2. CentOS中配置VNC Server

    环境:CentOS 6.4 1.安装tigervnc-server及相关软件 首先检查系统中是否安装tigervnc-server安装包 rpm -qa tigervnc-server 如果没有就直接 ...

  3. 【html】点击链接让页面在 iframe 中变换

    Demo: <html><body> <a href= "1.html " target= "iFrameName "> p ...

  4. hibernate -- 注解映射实体和表

    表名的映射 //代表此类参与ORM映射,此注解必须要有 @Entity //代表user这个类映射了一个表user50,如果表名和类名一样,此注解可以省略 @Table(name="user ...

  5. koa2学习笔记02 - 给koa2添加系统日志 —— node日志管理模块log4js

    前言 没有日志系统的后台应用是没有灵魂的, 平时工作中每次我们遇到接口报错的时候, 都会叫后台的童鞋看下怎么回事, 这时后台的童鞋都会不慌不忙的打开一个骚骚的黑窗口. 一串噼里啪啦的命令输进去, 哐哐 ...

  6. js replace 全局替换

    js 的replace 默认替换只替换第一个匹配的字符,如果字符串有超过两个以上的对应字符就无法进行替换,这时候就要进行一点操作,进行全部替换. <script language="j ...

  7. 数据分析-pandas基础入门(一)

    最近在学习python,所以了解了一下Pandas,Pandas是基于NumPy的一个开源Python库,它被广泛用于快速分析数据,以及数据清洗和准备等工作. 首先是安装numpy以及pandas, ...

  8. MySQL数据表命令

    显示表的相关信息: show table status like "表名": show table status like "表名" \G       格式化, ...

  9. Oracle的 EXEC SQL CONTEXT学习

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL杂记页     回到顶级页面:PostgreSQL索引页 [作者 高健@博客园  luckyjackgao@gmail. ...

  10. QtGUI Module's Classes

    Qt GUI C++ Classes The Qt GUI module provides the basic enablers for graphical applications written ...