Hadoop数据分析平台实战——070深入理解MapReduce 02(案例)离线数据分析平台实战——070深入理解MapReduce 02
离线数据分析平台实战——070深入理解MapReduce 02
Shuffle阶段说明
shuffle阶段主要包括map阶段的combine、group、sort、partition以及reducer阶段的合并排序。 Map阶段通过shuffle后会将输出数据按照reduce的分区分文件的保存, 文件内容是按照定义的sort进行排序好的。 Map阶段完成后会通知ApplicationMaster,然后AM会通知Reduce进行数据的拉取,在拉取过程中进行reduce端的shuffle过程。
用户自定义Combiner
Combiner可以减少Map阶段的中间输出结果数,降低网络开销。 默认情况下是没有Combiner的。 用户自定义的Combiner要求是Reducer的子类,以Map的输出<key,value>作为Combiner的输入<key,value>和输出<key,value>,也就是说Combiner的输入和输出必须是一样的。
可以通过job.setCombinerClass设置combiner的处理类,MapReduce框架不保证一定会调用该类的方法。
用户自定义Partitoner
Partitioner是用于确定map输出的<key,value>对应的处理reducer是那个节点。
默认MapReduce任务reduce个数为1个,此时Partitioner其实没有什么效果,但是当我们将reduce个数修改为多个的时候,partitioner就会决定key所对应reduce的节点序号(从0开始)。 可以通过job.setPartitionerClass方法指定Partitioner类,默认情况下使用HashPartitioner(默认调用key的hashCode方法)。
用户自定义Group
GroupingComparator是用于将Map输出的<key,value>进行分组组合成<key,List<value>>的关键类,直白来讲就是用于确定key1和key2是否属于同一组,如果是同一组,就将map的输出value进行组合。 要求我们自定义的类实现自接口RawComparator,可以通过job.setGroupingComparatorClass方法指定比较类。 默认情况下使用WritableComparator,但是最终调用key的compareTo方法进行比较。
用户自定义Sort
SortComparator是用于将Map输出的<key,value>进行key排序的关键类,直白来讲就是用于确定key1所属组和key2所属组那个在前,那个在后。
要求我们自定义的类实现自接口RawComparator,可以通过job.setSortComparatorClass方法指定比较类。默认情况下使用WritableComparator,但是最终调用key的compareTo方法进行比较。
用户自定义Reducer的Shuffle
在reduce端拉取map的输出数据的时候,会进行shuffle(合并排序),MapReduce框架以插件模式提供了一个自定义的方式,我们可以通过实现接口ShuffleConsumerPlugin
,并指定参数mapreduce.job.reduce.shuffle.consumer.plugin.class
来指定自定义的shuffle规则,但是一般情况下,直接采用默认的类org.apache.hadoop.mapreduce.task.reduce.Shuffle
。
案例--二次排序
hadoop默认只对key进行排序,有时候我们需要将value部分也进行排序,这种情况下有两种方式实现,第一种,我们将排序放到reducer端进行,但是这种方式当数据量比较大的时候,会比较消耗内存。 那么另外一种方式就是二次排序。 二次排序的内部实行其实是先按照key+value组合的方式进行排序,然后根据单独key进行分组的一种实行方式。 要求reducer个数为2,而且奇数到第一个reducer进行处理,偶数到第二个reducer进行处理。
- Intent和PendingIntent的区别
- android程序崩溃后重启
- jQuery源码——.html()方法原理解析
- 【翻译】JavaScript内存泄露
- 【翻译】ES6生成器简介
- 浅谈事件冒泡
- Github page搭建博客使用自定义插件的方法
- 【翻译】JavaScript中5个值得被广泛使用的数组方法
- 【翻译】浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle
- Entity Framework Core 实现MySQL 的TimeStamp/RowVersion 并发控制
- 《JQuery技术内幕》读书笔记——自调用匿名函数剖析
- 【代码+论文】通过ML、Time Series模型学习股价行为
- .NET Core 系列5 :使用 Nuget打包类库
- 解决transition动画与display冲突的几种方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【STM32F429】第12章 RL-TCPnet V7.X之TCP客户端
- Django DeleteView without confirmation template, but with CSRF attack
- 小记 TypeScript 中的循环引用问题
- 别只会搜日志了,求你懂点检索原理吧
- 分布式系统中的事务问题
- JDK 中的栈竟然是这样实现的?
- 谈一谈如何在Python开发中拒绝SSRF漏洞
- eval长度限制绕过 && PHP5.6新特性
- Cookie-Form型CSRF防御机制的不足与反思
- Python 格式化字符串漏洞(Django为例)
- unity官方案例精讲(第三章)--星际航行游戏Space Shooter
- Pwnhub Web题Classroom题解与分析
- WTForm的URLXSS谈开源组件的安全性
- 谈一谈复杂的正则表达式分析
- Linux 用户名、主机添加背景色