Hadoop实践(一)---Hadoop核心组件之MapReduce

29 篇文章 6 订阅
23 篇文章 0 订阅

MapReduce

  1. MR是基于批处理的分布式计算框架,可以并行处理大量原始数据,如合并网络日志与OLTP数据库上的相关数据,以用于模拟用户如何与你的网站互动

  2. MR模型简化了分布式系统中的并行计算、工作分配和处理不可靠硬件和软件等并行处理过程,让程序员可以更专注于解决业务需求,而不用纠缠于复杂的分布式系统中

  3. MR将客户端提交的任务分解为一个个小型的并行Map和reduce进程。MapReduce 的灵感来源于函数式编程(无共享模型),用户可将他们的计算表达为 map 和 reduce 函数,将数据作为键值对来处理。Hadoop 提供了一个高级 API 来在各种语言中实现自定义的 map 和 reduce 函数

无共享模型是一个分布式计算概念,它表示每个点是独立的、自治的,以消除任何并行进程间的依赖关系,因为这种关系可能增加不必要的同步点或状态共享

1、Map Shuffle:

  1. 输入:在map task 执行时,其输入来源 HDFS的 block ,map task 只读取split 。Split 与 block 的对应关系可能是多对一,默认为一对一。

  2. 切分:决定于当前的 mapper的 part交给哪个 reduce的方法是:mapreduce 提供的Partitioner接口,对key 进行 hash 后,再以 reducetask 数量取模,然后到指定的 job 上。然后将数据写入内存缓冲区中,缓冲区的作用是批量收集map结果,减少磁盘IO的影响。key/value对以及 Partition 的结果都会被写入缓冲区。写入之前,key 与value 值都会被序列化成字节数组。

  3. 溢写:由于内存缓冲区的大小限制(默认100MB),当map task输出结果很多时就可能发生内存溢出,所以需要在一定条件下将缓冲区的数据临时写入磁盘,然后重新利用这块缓冲区。这个从内存往磁盘写数据的过程被称为Spill,中文可译为溢写。
    这个溢写是由另外单独线程来完成,不影响往缓冲区写map结果的线程。
    整个缓冲区有个溢写的比例spill.percent。这个比例默认是0.8

Merge:

map 很大时,每次溢写会产生一个 spill_file,这样会有多个 spill_file,而最终的输出只有一个文件,在最终输出之前会对多个中间过程多次产生的溢写文件 spill_file 进行合并,此过程就是 merge。
merge 就是把相同 key 的结果加起来。(当然,如果设置过combiner,也会使用combiner来合并相同的key)

Combiner:

Combiner 将有相同key的 key/value 对加起来,减少溢写spill到磁盘的数据量。Combiner的适用场景:由于Combiner的输出是Reducer的输入,Combiner绝不能改变最终的计算结果。故大多数情况下,combiner适用于输入输出的key/value类型完全一致,且不影响最终结果的场景(比如累加、最大值等……)。

2、Reduce Shuffle

在 reduce task 之前,不断拉取当前 job 里每个 maptask 的最终结果,然后对从不同地方拉取过来的数据不断地做 merge ,也最终形成一个文件作为 reduce task 的输入文件。

  1. copy:Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。因为maptask早已结束,这些文件就归TaskTracker管理在本地磁盘中。

  2. merge:Copy 过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比 map 端的更为灵活,它基于 JVM 的 heap size 设置,因为 Shuffle 阶段 Reducer 不运行,所以应该把绝大部分的内存都给 Shuffle 用。这里需要强调的是,merge 有三种形式:1)内存到内存 2)内存到磁盘 3)磁盘到磁盘。默认情况下第一种形式不启用,让人比较困惑,是吧。当内存中的数据量到达一定阈值,就启动内存到磁盘的 merge 。与 map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有 map 端的数据时才结束,然后启动第三种磁盘到磁盘的 merge 方式生成最终的那个文件。

  3. reducer的输入:merge 的最后会生成一个文件,大多数情况下存在于磁盘中,但是需要将其放入内存中。当reducer 输入文件已定,整个 Shuffle 阶段才算结束。然后就是 Reducer 执行,把结果放到 HDFS 上。

这里写图片描述

整体的Shuffle过程包含以下几个部分:Map端Shuffle、Sort阶段、Reduce端Shuffle。即是说:Shuffle 过程横跨 map 和 reduce 两端,中间包含 sort 阶段,就是数据从 map task 输出到reduce task输入的这段过程。

sort、combine 是在 map 端的,combine 是提前的 reduce ,需要自己设置。

Hadoop 集群中,大部分 map task 与 reduce task 的执行是在不同的节点上。当然很多情况下 Reduce 执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的 job 有很多,那么 task 的正常执行对集群内部的网络资源消耗会很严重。而对于必要的网络资源消耗,最终的目的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘 IO 对 job 完成时间的影响也是可观的。从最基本的要求来说,对于 MapReduce 的 job 性能调优的 Shuffle 过程,目标期望可以有:

* 完整地从map task端拉取数据到reduce 端。

* 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。

* 减少磁盘IO对task执行的影响。

总体来讲这段Shuffle过程,能优化的地方主要在于减少拉取数据的量及尽量使用内存而不是磁盘。

MapReduce的只要功能展现在map输出和reduce输入之间的shuffle和sort阶段:

  • shuffle和sort负责执行两个主要动作:决定哪个reducer接收map函数输出的键值对(分片);确保传送给reducer的键值对是按照键值进行排序的
  • map会将同一个输入键的所以输出键值对进行合并后传送给同一个reducer
  • reducer对象中的所有输入键值对都是按键值进行排序的

程序员的主要任务是定义map和reduce函数,map函数用于输出键值对,reduce函数对这些键值对进行处理并输出最终结果

map和reduce函数的逻辑过程

  • map函数将输入看作一个键值对,这个键值对代表输入数据源的逻辑记录,对于每个输入的键值对,map函数输出0值或多个键值对
数据源逻辑记录
文件文件中每行数据
数据库中的一个表表中每行数据
map操作输出结果
过滤函数符合条件的结果
多行化操作一个输入键值对 对应多个输出键值对
  • reduce被每个独特的map输出键调用一次(所以相同键的map输出保存在同一个list中),reduce输出被写到HDFS的扁平文件中,在NOSQL数据中插入/更新列,或者根据作业的需求写入其他数据库存储器中
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值