2019独角兽企业重金招聘Python工程师标准>>>

5.Combiner编程

Combiner实质上就是不同上下文的Reducer的功能是差不多的.所以说它本质上就是一个Reducer.每一个map可能会产生大量的输出,combiner的作用就是在map端对输出先做一次合并,以减少传输到reducer的数据量。combiner最基本是实现本地key的归并,combiner具有类似本地的reduce功能。如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下(会消耗较多的网络IO)。使用combiner,先完成的map会在本地聚合,提升速度.

  1. 实现本地key的聚合,对map的输出的key排序,value进行迭代.

  2. 本地reduce功能.

案例3:在wordcount的基础上,实现Combiner编程

  1. 编写Combiner实现类,直接继承Reduce,编写内容与ruduce差不多.

package cn.itcast.yun10;
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class WordcountCombiner extendsReducer<Text, LongWritable, Text, LongWritable> {@Overrideprotected void reduce(Text key, Iterable<LongWritable> values,Context context) throws IOException, InterruptedException {// accept // the same as reduceString word = key.toString();long count = 0L;for (LongWritable v : values) {count += v.get();}context.write(new Text(word), new LongWritable(count));}
}

2.指定Combiner

使用Combiner编程的两点注意:

          a.不要以为在写MapReduce程序时设置了Combiner就认为Combiner一定会起作用,实际情况是这样的吗?答案是否定的。hadoop文档中也有说明Combiner可能被执行也可能不被执行。那么在什么情况下不执行呢?如果当前集群在很繁忙的情况下job就是设置了也不会执行Combiner.

          b.Combiner的输出是Reducer的输入,所以添加Combiner绝不能改变最终的计算结果。所以Combiner只应该用于那种Reduce的输入key/value与输出key/value类型完全一致,且不影响最终结果的场景。比如累加,最大值等。但是并不适用于求平均值类似的操作.

至于Combiner的执行时机,待分析完Shuffle之后再来说...?????

6.Shuffle过程分析

MapReduce确保每个Reducer的输入都按键排序.系统执行排序的过程在map输出之后,而在reducer输入之前完成。称为Shuffle---洗牌.观察shuffle如何工作的,有助于我们理解工作机制例如(优化MapReduce程序).shuffle属于不断被优化和改进的代码库的一部分.它会随着版本的不同而随时改变.在Hadoop里有这么一句话,说shuffle是MapReduce的心脏,是奇迹发生的地方.

Map端:map函数之后.

map函数开始产生输出时,并不是简单地将它写到磁盘中。这个过程是很复杂的。它会利用缓冲区的方式写到内存。而且处于效率会考虑进行预先排序.

每个map任务都有一个环形内存缓冲区,用于存储任务的输出。默认的情况下,缓冲区的大小为100MB,可以通过io.sort.mb的属性来指定。一旦缓冲区达到阀值(io.sort.spill.percent,默认情况下是80%),就有一个后台线程开始把内容写到spill磁盘中。在写磁盘过程中,map输出继续被写到缓冲区,但如果在此期间缓冲区被填满,map输出就会被阻塞直到写磁盘过程完成。而写磁盘将按轮询方式写到 mapred.local.dir 属性指定的作业特定子目录中的目录中.在这个目录下新建一个溢出写文件。

在写磁盘之前,要partition,sort(数据先分区,然后再排序)。如果有combiner,combiner排序后数据。combiner待榷商。

在写磁盘的时候会采用压缩格式。Hadoop中的压缩库由 mapred.map.output.compression.codec指定.以后会做详细的说明.

等最后记录写完,合并全部溢出写文件为一个分区且排序的文件.配置属性 io.sort.factor控制着一次最多能合并多少流,默认大小为10.这就是merge合并了.

实际上,Conbiner函数的执行时机可能会在map的merge操作完成之前,也可能在merge之后执行,这个时机由配置参数min.num.spill.for.combine(该值默认为3),也就是说在map端产生的spill溢出文件最少有min.num.spill.for.combine的时候,Conbiner函数会在(merge操作合并最终的本机结果文件之前)执行,否则在merge之后执行。通过这种方式,就可以在spill文件很多并且需要做conbiner的时候,减少写入本地磁盘的数据量,同样也减少了对磁盘的读写频率,可以起到优化作业的目的。--------也就是说spill出的而文件个数达到三,就可以执行Combiner函数.然后再meger.

reducer会通过HTTP方式得到上述执行的结果(输出文件的分区) (map中),用于文件分区的工作线程的数量由任务的tracker.http.threads属性控制.默认值是40.

Reducer端:reduce函数之前

在运行reduce任务之前,需要集群中多个map任务的输出作为分区材料。但是每个map任务的完成时间很有可能是不同的。所以只要有个map任务完成,reduce就会复制COPY它的输出。这就是复制阶段。在reduce端会开启几个复制的线程去COPY。该数字有mapred.reduce.parallel.copies属性决定。默认值为5.

复制到reduce的话,是有可能到内存,也有可能到磁盘上.这是内存缓冲区大小有mapred.job.shuffle.input.buffer.percenet属性控制。占堆空间的百分比。一旦缓冲区达到阀值的大小,则会合并后溢出到磁盘。随着磁盘文件复制文件越来越多。就会合并更大的文件。

然后进入排序阶段。准确来说是合并阶段,因为排序在map端已经完成。合并时循环进行的。这个合并也是比较复杂的。

最后将得到的数据输入reduce函数.最后合并可能来自内存也有可能来自磁盘.最后来几个图吧。

7.自定义的排序编程---倒排索引

案例4:存在两个文件a.txt,b.txt.两者里面的内容如下:

a.txt文件

--------------------------------

hello world

hello tom

how are you

how do you do

-----------------------------------

b.txt文件

hello is fool

i say hi

how do you think

---------------------------------------

c.txt文件

you are all handsome

i am the superman

how do you think

---------------------------------------

在上述文件中建立倒排索引,就像如下格式:

hello --> a.txt,2    b.txt,1

how --->a.txt,2    b.txt,1   c.txt,1

思路如下:通过两次MapReduce执行出想要的结果.

代码省略.....

实验结果:

8.常见的MapReduce算法

单词计数,数据去重,排序,Top K,选择,投影,分组,多表连接,单表关联.都可以通过MapReduce完成。熟悉这些的话,对于后面的Hive学习有很大的用处.

在这里就拿多表连接来做一个案例.

案例5:存在两个表A,B.两表之间存在关系。假设两个表都是以文本文件的形式存储,SQL语句:select a.id,b.name from a,b where a.id = b.id,得到结果输出到文件.

思路如下:

代码省略.

9.Split原理及源码分析

split的作用就是决定mapper的数量,hadoop将mapreduce的输入数据划分成等长的小数据块。称为输入分片(input split).在前面的mapreduce输入类InputFormat中有讲到过.这些小数据块称为分片。一个分片对应着一个map任务.关于分片的大小,经验来说,趋向于一个HDFS的默认块大小.


这样的话,就可以获取分片的大小啦......

-----------------------------------------------------------------------------------------------------------------------------

本篇结束。。

转载于:https://my.oschina.net/codeWatching/blog/366951

2014-11-18--Hadoop的基础学习(五)--编写不同MapReudce程序及其特性(下)相关推荐

  1. 第11期:Hadoop零基础学习路线

    大家好,我是你们的老朋友老王随聊,今天和大家讨论的话题--Hadoop零基础应该怎么学? 通过这段时间和群里同学们交流,发现很多大学生甚至职场小白对Hadoop学习路线不是很清晰,所以我花了一些时间给 ...

  2. Java基础学习——第十六章 Java8新特性

    Java基础学习--第十六章 Java8 新特性 Java8(JDK8.0)较 JDK7.0 有很多变化或者说是优化,比如 interface 里可以有静态方法和默认方法,并且可以有方法体,这一点就颠 ...

  3. Linux学习笔记(2014/11/18前 )

    第一天: 认识E9供电.复位,LCD液晶显示屏连接方式.磁盘资料copy: 第二天: 认识下载模式(很奇怪的模式,不是由boot_mode0/boot_mode1决定),putty的安装(打印信息的输 ...

  4. 将汉字转换成笔画代码_0基础学习五笔输入法之汉字的拆分

    未来的五笔高手们大家好,上篇文章我们讲述了五笔输入法的字型类型.我们先来回顾一下.五笔输入法字型分为三种类型,即左右型.上下型.杂合型.其中左右型与上下型比较好区分,杂合型相对来说不好区分. 大家以后 ...

  5. Python基础学习五 内置模块

    time 模块 1 >>> import time2 >>> time.time()3 1491064723.8086694 >>> # time ...

  6. Linux基础学习五:软件的相关安装(JDK,Tomcat,Yum)

    设置静态ip 通过 dhclient 命令获取动态ip,动态ip存在的问题: 每次重启,需要重新获取 获取的ip地址不固定 解决方案:设置静态ip 配置步骤: 编辑 /etc/sysconfig/ne ...

  7. SwiftTour基础学习(五)控制流

    使用 if 和 switch 来进行条件操作,,使用 for-in .for .while 和 repeat-while 来进行循环.包裹条件和循环变量括号可以省略,但是语句的大括号是必须的. let ...

  8. Linux基础学习五(1):java项目部署实战教程

    项目部署:就是将集成开发工具(eclipse.idea)中开发编译好的项目,部署到tomcat中运行的过程. 本地部署 本地部署:将项目部署到本机安装的tomcat中,可以借助于开发工具的本身的提供的 ...

  9. go语言基础学习 (五) http请求

    通过net/http包实现go语言的http请求 1. GET请求 普通请求 1. http.Get方法... response, _ := http.Get("http://httpbin ...

最新文章

  1. 关于解决多台linux服务器间的文件实时同步问题
  2. 航空航天大事件c语言程序设计,2017年沈阳航空航天大学航空航天工程学部823C语言程序设计考研强化模拟题...
  3. Python 技术篇-用smtplib和email库实现邮件发送并展示本地图片实例演示
  4. quratz启动流程
  5. eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写
  6. socekt编程-select
  7. “约见”面试官系列之常见面试题之第六十三篇之get和post区别(建议收藏)
  8. 学习索引结构的一些案例——Jeff Dean在SystemML会议上发布的论文(上)
  9. 网站从无到有--个人(第一次)搭建。服务器环境搭建 对大家有帮助那就最好-第一次发...
  10. Blender使用maya系快捷键
  11. 实践论:论认识和实践的关系
  12. 2020福州大学计算机录取名单,福州大学数学与计算机科学/软件学院2020年硕士研究生招生复试结果(第二批非全日制公示)...
  13. html凹凸感设置,想让VRAY渲染的图有点凹凸效果怎么做?
  14. 北京工作居住证的申请条件和可享受的待遇
  15. 关于5G,四大运营商说......
  16. 欧文工学院计算机,UCI的EECS「加州大学欧文分校电气工程与计算机科学系」
  17. 工具之DBeaver安装及使用
  18. 设计一个类代表二维空间的一个圆。_绝了!这是什么神仙花园设计! | 2020世界花园大会...
  19. Unity音乐可视化效果研究
  20. 使用Cheat Engine(CE)来对植物大战僵尸进行逆向分析

热门文章

  1. QTP11补丁下载 – 完美支持FIREFOX 9~10
  2. Oracle TNS 不能启动
  3. 关于龙芯的争吵我都无语了
  4. js实现图片轮播(终结版)
  5. 属性(Properties)和字段在C#中的关系
  6. Ubuntu10下MySQL搭建Amoeba系列(文章索引)
  7. Redis 桌面管理工具 RedisDesktopManager 2019.0 发布
  8. Debian Security Advisory(Debian安全报告) DSA-4410-1 openjdk-8 security update
  9. 通过JavaScript简单的操作DOM(一)
  10. 深入浅出HTTPS基本原理