本文发表于本人博客

在上一篇文章我写了个简单的WordCount程序,也大致了解了下关于mapreduce运行原来,其中说到还可以自定义分区、排序、分组这些,那今天我就接上一次的代码继续完善实现自定义分区。

首先我们明确一下关于中这个分区到底是怎么样,有什么用处?回答这个问题先看看上次代码执行的结果,我们知道结果中有个文件(part-r-00000),这个文件就是所有的词的数量记录,这个时候有没什么想法比如如果我想把一些包含特殊的词放置单独的一个文件,其他我不关心的放置在另一个文件这样我就好查看方便多了,又比如如果是统计关于人的某些爱好那我是不是可以把童年的放置在一个文件,成年的放置在一个文件等等这样输出结果。是,这个倒是非常有用哦输出的结果就是最直接的了,那现在我们就来分析一下应该怎么搞怎么实现:

我们清楚,这个输出文件是由reduce端输出的,reduce端的数据是由map函数处理完通过shufflecopy至reduce端的,然而map端的输出数量会对于reduce输入的数量,那么map端会负责划分数据,在shuffle过程中有个步骤就是分区,我们先来看看上次代码中使用的分区类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;
}
}

这里出现了个numReduceTasks变量,这个是由哪里过来的呢,那就得看谁调用了这个方法了,看:MapTask.java就可以看到其write方法调用了,然而这个方法的partitions参数是由:

jobContext.getNumReduceTasks();

觉得,那我们继续找下去这个变量是由mapred.reduce.tasks配置节点决定的默认是1。那现在我们虽然不知道(key.hashCode() & Integer.MAX_VALUE)值是多少但是%1我们可以知道结果就是0;现在我来继承这个类(也可继承其父类Partitioner<K, V>)重写其getPartition方法来实现分区,看下面自定义分区MyPartition代码:

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner; /**
* 自定义分区类
* @author Liang
*
*/
public class MyPartition extends HashPartitioner<Text, LongWritable> {
@Override
public int getPartition(Text key, LongWritable value, int numReduceTasks) {
return key.toString().contains("luoliang") ? 0 : 1;
}
}

上面重写getPartition函数,其中如果键中有字符串"luoliang"的键值就返回0否则其它返回1。执行后在(hdfs://hadoop-master:9000/mapreduce/output/)会有2个文件,一个是part-r-00000,一个是part-r-00001。part-r-00000对应的是条件key.toString().contains("luoliang")为真的!

注意先要在mian函数中加入:

job.setJarByClass(Test.class);

还需要更改:

job.setPartitionerClass(MyPartition.class);
job.setNumReduceTasks(2);

再把程序打包成jar.jar文件上传至服务器使用命令运行:

hadoop jar jar.jar

如果本地调试或者运行会报错必须打包至服务器运行,结果会生成有那下面2个文件如下:

part-r-00000
part-r-00001

这次先到这里。坚持记录点点滴滴!

Hadoop mapreduce自定义分区HashPartitioner的更多相关文章

  1. Hadoop mapreduce自定义分组RawComparator

    本文发表于本人博客. 今天接着上次[Hadoop mapreduce自定义排序WritableComparable]文章写,按照顺序那么这次应该是讲解自定义分组如何实现,关于操作顺序在这里不多说了,需 ...

  2. Hadoop学习之路(6)MapReduce自定义分区实现

    MapReduce自带的分区器是HashPartitioner 原理:先对map输出的key求hash值,再模上reduce task个数,根据结果,决定此输出kv对,被匹配的reduce任务取走. ...

  3. 【Hadoop】MapReduce自定义分区Partition输出各运营商的手机号码

    MapReduce和自定义Partition MobileDriver主类 package Partition; import org.apache.hadoop.io.NullWritable; i ...

  4. [Hadoop] - Mapreduce自定义Counter

    在Hadoop的MR程序开发中,经常需要统计一些map/reduce的运行状态信息,这个时候我们可以通过自定义Counter来实现,这个实现的方式是不是通过配置信息完成的,而是通过代码运行时检查完成的 ...

  5. Hadoop mapreduce自定义排序WritableComparable

    本文发表于本人博客. 今天继续写练习题,上次对分区稍微理解了一下,那根据那个步骤分区.排序.分组.规约来的话,今天应该是要写个排序有关的例子了,那好现在就开始! 说到排序我们可以查看下hadoop源码 ...

  6. Hadoop MapReduce自定义数据类型

    一 自定义数据类型的实现 1.继承接口Writable,实现其方法write()和readFields(), 以便该数据能被序列化后完成网络传输或文件输入/输出: 2.如果该数据需要作为主键key使用 ...

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

    当遇到有特殊的业务需求时,需要对hadoop的作业进行分区处理 那么我们可以通过自定义的分区类来实现 还是通过单词计数的例子,JMapper和JReducer的代码不变,只是在JSubmit中改变了设 ...

  8. [MapReduce_8] MapReduce 中的自定义分区实现

    0. 说明 设置分区数量 && 编写自定义分区代码 1. 设置分区数量 分区(Partition) 分区决定了指定的 Key 进入到哪个 Reduce 中 分区目的:把相同的 Key ...

  9. mapreduce自定义排序(map端1.4步)

    3 3 3 2 3 1 2 2 2 1 1 1 -----------------期望输出 1 1 2 1 2 2 3 1 3 2 3 3 将以上数据进行排序,排序规则是:按照第一列升序排序,如果第一 ...

随机推荐

  1. day15<集合框架>

    集合框架(对象数组的概述和使用) 集合框架(集合的由来及集合继承体系图) 集合框架(Collection集合的基本功能测试) 集合框架(集合的遍历之集合转数组遍历) 集合框架(Collection集合 ...

  2. GIS-010-ArcGIS JS 三种查询模式(转)

    QueryTask.FindTask.IdentifyTask都是继承自ESRI.ArcGIS.Client.Tasks: 1.QueryTask:是一个进行空间和属性查询的功能类,它可以在某个地图服 ...

  3. Python 插件安装

    0.下载Python包文件后,解压缩: 1.cd 到 插件解压缩目录,里面有setup.py的文件: 2.定位到当前目录: 3.执行:python setup.py install; 4.结束安装. ...

  4. laravel 使用验证码

    1)php.ini需要开两个扩展 extension=php_fileinfo.dllextension=php_gd2.dll 2)使用composer安装类包 composer require m ...

  5. 在联网时,两台linux服务器传输文件方法

    登陆服务器root用户命令:su - root 传输文件命令:scp +需要传输linux系统文件+空格+目标linux服务器的用户名@服务器ip地址:+传输的文件路径:例:scp /mnt/work ...

  6. linux配置了dns后导致mysql远程连接慢问题

    有时候dns配置错误或者其它原因会导致mysql远程连接缓慢,此时只需要关闭mysqlDNS反向解析即可解决此问题. 打开my.cnf配置,将[mysqld]下的#skip-name-resolve前 ...

  7. c++11——右值引用

    1. 左值和右值 左值是表达式结束之后仍然存在的持久化对象,而右值是指表达式结束时就不再存在的临时对象.     c++11中,右值分为两种类型:将亡值(xvalue, expiring value) ...

  8. SenchaTouch 的一些问题记录

    1 : textfield 的 focus事件在手机上会被触发很多次,原因不明,在pc上测试无问题

  9. C#IIS网站应用程序池启动回收停止 .

    //添加应用程序池空间引用using System.DirectoryServices;using System.Text; using System.Text.RegularExpressions; ...

  10. 宝塔面板快速开启https服务

    最近在做小程序开发,急需要一个https的域名,首先我的域名是阿里云的,服务器是腾讯云的,操作都一样: 无论阿里云还是腾讯云,配置SSL是针对服务器的,所以首先是要去申请 腾讯/阿里云服务器的SSL( ...