Hadoop入门(八)Mapreduce高级shuffle之Partitioner

一、Partitioner概述

Map阶段总共五个步骤,2就是一个分区操作

 

哪个key到哪个Reducer的分配过程,是由Partitioner规定的。

 

二、Hadoop内置Partitioner

MapReduce的使用者通常会指定Reduce任务和Reduce任务输出文件的数量(R)。
用户在中间key上使用分区函数来对数据进行分区,之后在输入到后续任务执行进程。一个默认的分区函数式使用hash方法(比如常见的:hash(key) mod R)进行分区。hash方法能够产生非常平衡的分区。

Hadoop中自带了一个默认的分区类HashPartitioner,
它继承了Partitioner类,提供了一个getPartition的方法

/** Partition keys by their {@link Object#hashCode()}. */
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;}}

将key均匀布在Reduce Tasks上
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 

如果Key为Text的话,Text的hashcode方法跟String的基本一致,都是采用的Horner公式计算,得到一个int整数。但是,如果string太大的话这个int整数值可能会溢出变成负数,所以和整数的上限值Integer.MAX_VALUE(即0111111111111111)进行与运算,然后再对reduce任务个数取余,这样就可以让key均匀分布在reduce上 

 

三、自定制Partitioner

一般我们都会使用默认的分区函数HashPartitioner

自定义数据类型处理手机上网日志: 在第二列上并不是所有的数据都是手机号(84138413并不是一个手机号),任务就是在统计手机流量时,将手机号码和非手机号输出到不同的文件中

自定义MKPartitioner

 public static class MKPartitioner extends Partitioner<Text, KpiWritable> {@Overridepublic int getPartition(Text key, KpiWritable value, int numPartitions) {// 实现不同的长度不同的号码分配到不同的reduce task中int numLength = key.toString().length();if (numLength == 11) return 0;else   return 1; }}

设置为打包运行,设置Partitioner为MKPartitioner设置ReducerTask的个数为2
注意:分区的例子必须要设置为打成jar包运行!

    public int run(String[] args) throws Exception {// 定义一个作业Job job = new Job(getConf(), "MyJob");// 分区需要设置为打包运行job.setJarByClass(MyJob.class);// 设置输入目录FileInputFormat.setInputPaths(job, new Path(INPUT_PATH));// 设置自定义Mapper类job.setMapperClass(MyMapper.class);// 指定<k2,v2>的类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(KpiWritable.class);// 设置Partitionerjob.setPartitionerClass(NKPartitioner.class);job.setNumReduceTasks(2);// 设置自定义Reducer类job.setReducerClass(MyReducer.class);// 指定<k3,v3>的类型job.setOutputKeyClass(Text.class);job.setOutputKeyClass(KpiWritable.class);// 设置输出目录FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));// 提交作业System.exit(job.waitForCompletion(true) ? 0 : 1);return 0;}

打成jar包并在Hadoop中运行

  1. 通过Idea导出jar包
  2. 通过FTP上传到Linux中,可以使用各种FTP工具
  3. 通过Hadoop Shell执行jar包中的程序

通过Web接口验证Partitioner的运行:

  • 通过访问http://hadoop01:50030 查看 是否有2个Reduce任务?
  • Reduce输出结果是否一致?

小结:

  • 分区Partitioner主要作用在于以下两点  根据业务需要,产生多个输出文件
  • 多个reduce任务并发运行,提高整体job的运行效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue调用methods里的方法

刚学vue的时候&#xff0c;以为要想方法自启动&#xff0c;只能通过生命周期函数的钩子。 而methods里的函数大多用ckick进行调用 要想直接启用里面的方法&#xff0c;给挂载的vue一个名字就行了&#xff0c;如下 var app new Vue({el: "#app",methods:{aaa:functi…

在ASP.NET Core中使用AOP来简化缓存操作

前言 关于缓存的使用&#xff0c;相信大家都是熟悉的不能再熟悉了&#xff0c;简单来说就是下面一句话。 优先从缓存中取数据&#xff0c;缓存中取不到再去数据库中取&#xff0c;取到了在扔进缓存中去。 然后我们就会看到项目中有类似这样的代码了。 public Product Get(int p…

Hadoop入门(七)Mapreduce高级Shuffle

一、Shuffle概述 Reduce阶段三个步骤&#xff0c;Shuffle就是一个随机、洗牌操作 Shuffle是什么 针对多个map任务的输出按照不同的分区&#xff08;Partition&#xff09;通过网络复制到不同的reduce任务节点上&#xff0c;这个过程就称作为Shuffle。 二、Shuffle过程 &#…

methods中axios里的数据无法渲染到页面

最近在研究axios聊天室室遇到一个问题 将axios获取到的数据传递给data&#xff0c;从而改变页面中的数值&#xff0c;但是结果令人失望 这是data里的数据 原想将data中的items数组换成axios里的response.data&#xff0c;后来发现items一直为空&#xff0c;就拿字符串做实验了…

jzoj4229-学习神技【逆元,费马小定理】

正题 题目大意 求 (∑i1na∗qi)mod(1097)(\sum_{i1}^na*q^i)\ mod\ (10^97)(i1∑n​a∗qi) mod (1097) 解题思路 题目里都给出公式 ∑i1na∗qia∗(1−qn)1−q\sum_{i1}^na*q_i\frac{a*(1-q^n)}{1-q}i1∑n​a∗qi​1−qa∗(1−qn)​ 其实就是 a∗(qn−1)q−1\frac{a*(q^n-1)}{…

.NET Core跨平台的奥秘[上篇]:历史的枷锁

微软推出的第一个版本的.NET Framework是一个面向Windows桌面和服务器的基础框架&#xff0c;在此之后&#xff0c;为此微软根据设备自身的需求对.NET Framework进行裁剪&#xff0c;不断推出了针对具体设备类型的.NET Framework版本以实现针对移动、平板和嵌入式设备提供支持。…

Hadoop入门(十)Mapreduce高级shuffle之Sort和Group

一、排序分组概述 MapReduce中排序和分组在哪里被执行 第3步中需要对不同分区中的数据进行排序和分组&#xff0c;默认情况按照key进行排序和分组 二、排序 在Hadoop默认的排序算法中&#xff0c;只会针对key值进行排序 任务&#xff1a; 数据文件中&#xff0c;如果按照第一…

Js使滑轮到最底部

在做ajax的聊天室页面时&#xff0c;新数据总是不能显示出来&#xff0c;需要下翻&#xff0c;所以必须在setInterval(“app.aaa()”, 1000)中aaa函数里添加一个可以使滑轮在底部的代码 加入 div1 document.getElementById("div1") div1.scrollTop div1.scrollHe…

jzoj4230-淬炼神体【0/1分数规划】

正题 题目大意 nnn个东西&#xff0c;有ai,bia_i,b_iai​,bi​。选择kkk个&#xff0c;使得∑ai/∑bi\sum a_i/\sum b_i∑ai​/∑bi​最大。 解题思路 ∑ai/∑bik\sum a_i/\sum b_ik∑ai​/∑bi​k ∑ai/∑bi/k1\sum a_i/\sum b_i/k1∑ai​/∑bi​/k1 ∑ai/k∑bi\sum a_i/k\sum…

使用Identity Server 4建立Authorization Server (3)

预备知识: 学习Identity Server 4的预备知识 第一部分: 使用Identity Server 4建立Authorization Server (1) 第二部分: 使用Identity Server 4建立Authorization Server (2) 上一部分简单的弄了个web api 并通过Client_Credentials和ResourceOwnerPassword两种方式获取token然…

php接口跨域问题

报错是因为接口跨域&#xff0c;不允许访问 只需在php头部加入此行代码就行了 header(Access-Control-Allow-Origin:*);

jzoj4231-寻找神格【线段树,数学】

正题 题目大意 4个操作 单点修改&#xff0c;区间修改&#xff0c;区间求和&#xff0c;区间求方差 方差为:∑(xi−ave)2n\frac{\sum(x_i-ave)^2}{n}n∑(xi​−ave)2​ aveaveave为平均值 解题思路 我们将方差的式子分解一下 ∑(xi−ave)2n\frac{\sum(x_i-ave)^2}{n}n∑(xi​…

Hadoop入门(十四)Mapreduce的数据去重程序

1 实例描述 对数据文件中的数据进行去重。数据文件中的每行都是一个数据 样例输入如下所示&#xff1a; 1&#xff09;file1 2012-3-1 a 2012-3-2 b 2012-3-3 c 2012-3-4 d 2012-3-5 a 2012-3-6 b 2012-3-7 c 2012-3-3 c 2&#xff09;file2 2012-3-1 b 2012-3-2 a 2012…

spring boot输出hello world几种方法

1、手动配置&#xff0c;三个文件 打开创建maven,创建这三个文件从上到下依次复制即可 配置文件&#xff08;重要&#xff09;&#xff08;否则后面会报错&#xff09; pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w…

欢乐纪中某B组赛【2019.1.20】

前言 有回来做BBB组了&#xff0c;话说第3道题就是AAA组第一道。 成绩 RankRankRank是有算别人的 今天XJQXJQXJQ不在 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017wyc2017wyc2017wyc2702702701001001001001001007070701010102017hjq2017hjq2017hjq13013013…

向ASP.NET Core迁移

我们首先来看看ASP.NET Core有哪些优势&#xff1f; 跨平台&#xff1a;可以部署到Linux服务器上 内置一套对云和部署环境非常友好的配置模块 内置依赖注入 IIS或者Kestrel&#xff08;或者其它自定义&#xff09; 轻量级、高性能、模块化的Http处理管线 .NET Core 是开源…

Hadoop入门(十五)Mapreduce的数据排序程序

"数据排序"是许多实际任务执行时要完成的第一项工作&#xff0c;比如学生成绩评比、数据建立索引等。这个实例和数据去重类似&#xff0c;都是先对原始数据进行初步处理&#xff0c;为进一步的数据操作打好基础 1 实例描述 对输入文件中数据进行排序。输入文件中的…

Java我来了

引言 原本我也是个计算机的小白&#xff0c;从今年的二月份开始学习java&#xff0c;接触eclipse&#xff0c;终于算是开启了我的编程之旅。 在此之前我也不算是零基础&#xff0c;学校在上学期还未开设c语言课程的时候&#xff0c;我就自学了c语言&#xff0c;学的不深&#x…

jzoj4208-线段树什么的最讨厌了【dfs】

正题 题目大意 一个0∼n0\sim n0∼n的线段树包含l∼rl\sim rl∼r的区间&#xff0c;求最小的nnn 解题思路 dfsdfsdfs一下&#xff0c;从下面开始往上扩展区间&#xff0c;知道变成0∼x0\sim x0∼x的格式就就可以去最小值了。 记得剪枝 codecodecode #include<cstdio> …

Hadoop入门(十六)Mapreduce的单表关联程序

"单表关联"要求从给出的数据中寻找所关心的数据&#xff0c;它是对原始数据所包含信息的挖掘 1 实例描述 给出child-parent&#xff08;孩子——父母&#xff09;表&#xff0c;要求输出grandchild-grandparent&#xff08;孙子——祖父母&#xff09;表 样例输入&…