【Hadoop】一:MapReduce初探

基本概念

在python和swift中,map,reduce都是一种高阶函数(还有filter),那么什么是高阶函数呢?这里引用一下廖雪峰大神的总结,高阶函数就是指函数参数可以接收其他函数,还有一种函数叫作偏函数,就是指函数的返回值是一个函数。
高阶函数和偏函数的概念可以阅读函数式编程一书得到参考
java8的lambda表达式就是一种高阶函数的实现。

好吧,回归正题,那么什么是map,什么又是reduce呢?
map:map就是指把输入的数据集中的每一个元素进行处理后输出,这种输入输出通常是键值对形式的。
reduce:reduce的英文释义是规约,也就是说reduce函数是将一定的数据集进行循环的处理得到最终的结果。比如找出每个数据集中的最大值。

Mapper和Reducer

Mapper是泛型类型,分别是map函数的输入键,输入值,输出建和输出值,hadoop在java自带的基本类型之上还封装了一套适用于网络序列化传输的基本类型,这些类型位于or.apache.hadoop.io包中,例如Text类型相当于java的String类型。
Reducer也是泛型类型,类型参数和Mapper一样,Reducer提供了强大的数据比较和抽取能力。
Job是用来指定作业执行规范的,主要包括如下几步:

  1. 设置作业完整的类名
  2. 设置作业名称
  3. 设置输入和输入源(可以来自网络,可以来自文件系统)
  4. 设置map(即对数据进行处理的Mapper实现类)和设置reduce(Reducer的实现类)。

新旧api差别

参考官网

MapReduce的横向(水平)扩展

为了实现横向扩展,需要将数据存储在类似于HDFS的分布式文件系统中。

在MapReduce的作业中,有两类节点控制着作业的执行,一类是jobtracker(作业节点)和一系列的tasktracker(任务节点),一个作业是由多个任务(map任务和reduce任务)组成的。

Hadoop将数据分为大小相等的数据块,每个数据块就是一个分片,并且为每个分片指定一个map任务,由该任务来运行用户自定义的map函数从而处理分片中的每条记录。

分片的大小决定了程序的效率和资源的利用率,如果分片太小,那么管理分片的总时间和构建map任务的时间将会决定整个处理时间,如果分片太大,又没有充分利用map函数提供的处理能力,所以合适的分片大小至关重要。一个合理的分片大小大概是HDFS的一个块的大小。默认是64MB。如果超过了该大小,那么输入源的数据就会存储在两个机架上面,这样就会产生网络传输,降低了效率。

对于map任务,一般运行在输入数据存储的机器上,这样不需要使用网络带宽资源,提高了IO效率。如果该map任务在处理其他的任务,则需要协调其他机架上面的map任务来进行处理,这样还是会产生网络传输。但是这么做,会大大的减少这种情况的发生。

map任务的输出一般都是存储在任务执行的机器上面,因为map输出的数据大多是一个中间数据,只需要临时存储,在传给reduce任务处理之后,就可以删除该中间结果。如果中间数据传输给reduce任务失败,则会在另一个节点上重新运行map任务重新传输从而避免再次失败。

reduce任务可以接收来自多个map任务的输出,这之间复杂的数据传输流称为shuffle。shuffle就是怎样把map task的输出结果有效地传送到reduce端,也可以理解为 Shuffle描述着数据从map task输出到reduce task输入的这段过程。
下图是官方的shuffle解释图

shuffle官网解释图

shuffle参考资料

combiner

为了减少map和reduce之间的数据传输量,充分利用集群之间的带宽,可以对map的输出执行一次或者多次的combiner函数,相当于对于单个map进行的规约操作(reduce是对于多个map任务的规约).但是combiner的适用场景有限,例如平均数的计算可能就不适用-((x+y+z+a)/4+(b+c)/2)/2!=(a+b+c+x+y+z)/6,所以该函数的适用范围为对分片数据规约不会影响整个结果的场景。

Streaming API

Streaming API 使得我们可以用其他编程语言实现自己的map和reduce函数,例如用c++实现,提高程序的处理效率。
该API使用标准输入输出流作为hadoop和不同语言编写的map和reduce任务之间的接口。
当使用Streaming时需要在hadoop的运行命令里面指定streaming.jar文件的位置从而让hadoop支持其他语言。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 目的这篇教程从用户的角度出发,全面地介绍了Hadoop Map/Reduce框架的各个方面。先决条件请先确认Had...
    SeanC52111阅读 1,697评论 0 1
  • 思考问题 MapReduce总结 MapReduce MapReduce的定义MapReduce是一种编程模型, ...
    Sakura_P阅读 922评论 0 1
  • MapReduce框架结构## MapReduce是一个用于大规模数据处理的分布式计算模型MapReduce模型主...
    Bloo_m阅读 3,713评论 0 4
  • github链接 针对Hive的优化主要有以下几个方面: map reduce file format shuff...
    zoyanhui阅读 6,162评论 2 33
  • MapReduce是一个数据处理的编程模型。这个模型很简单,但也不是简单到不能够支持一些有用的语言。Hadoop能...
    单行线的旋律阅读 1,506评论 0 2