【Hadoop】(二)mapreduce的知识点总结

MapReduce历史背景

  • Hadoop MapReduce诞生于搜索领域,主要解决搜索引擎面临的海量数据处理扩展性差的问题。它的程序本质上是并行运行的,因此可以将大规模的数据分析任务分发给任何一个拥有足够多机器的数据中心。
  • 它的实现很大程度上借鉴了谷歌MapReduce的设计思想,包括简化编程接口、提高系统容错性等。

什么是MapReduce

在这里插入图片描述

什么是MapReduce分布式计算

在这里插入图片描述
在这里插入图片描述

MapReduce特点

  • 易于编程:传统的分布式程序设计非常复杂,用户需要关注的细节非常多,比如数据分片、数据传输、节点间通信等,因而设计分布式程序的门槛非常高。Hadoop的一个重要设计目标便是简化分布式程序设计,将所有并行程序均需要关注的设计细节抽象成公共模块并交由系统实现,而用户只需专注于自己的应用程序逻辑实现,这样简化了分布式程序设计且提高了开发效率。
  • 良好的扩展性:随着公司业务的发展,积累的数据量(如搜索公司的网页量)会越来越大,当数据量增加到一定程度后,现有的集群可能已经无法满足其计算能力和存储能力,这时候管理员可能期望通过添加机器以达到线性扩展集群能力的目的。
  • 高容错性:在分布式环境下,随着集群规模的增加,集群中的故障率会显著增加,进而导致任务失败和数据丢失的可能性增加。为此,Hadoop通过计算迁移或数据迁移等策略提高集群的可用性与容错性。

Map端流程

在这里插入图片描述
Map端Shuffle设计包括4个阶段:

  • Input:分片数据输入
  • Partition:让Map对Key进行分区
  • Spill:将内存中溢出的数据写入磁盘中的临时文件,并对数据进行排序和合并
  • Merge:将溢写文件归并到一起

1)Split分片

Hadoop把输入数据划分成等长的小数据发送到MapReduce,称为输入分片(input split)或者分片。Hadoop为每个分片创建一个map任务,由它来运行用户自定义的map函数来分析每个分片中的记录。

如果我们并行处理每个分片,并且分片是小块的数据,那么处理过程将有一个更好的负载平衡。分片不是越小越好,如果分片太小,那么管理分片的总时间和map任务创建的总时间将决定作业执行的总时间。对于大多数作业,一个理想的分片往往是一个HDFS块的大小,大小可以根据集群进行调整。

分片大小和块大小相同优势:map任务的执行节点和输入数据存储几乎是同一个节点,Hadoop的性能达到最佳。如果分片跨域两个块,那么对于任何一个HDFS节点而言,基本不可能同时存储这两数据块,因此分片的部分数据必须通过网络传输到节点,这与使用本地数据运行map任务相比,显然效率更低。

2)键值对

键值对由一个键一个值组成,map和reduce函数的输入和输出都是键值对。

例如:定义文件读取格式是map的键是文件中的行偏移量,值是行对应的文本数据,map面对的是一堆杂乱无章的互不相关的数据,它解析每个数据,从中提取出key和value,也就是提取了数据的特征,在WordCount中则只需要解析map中按行读取的值,然后输出该行单词word作为key,数量count作为value到下一步。

3)Combiner

Combiner是用Reducer来定义的,多数的情况下Combiner和Reducer处理的是同一种逻辑,当然也可以单独去定义一个有别于reduce的Combiner,继承Reducer,写法基本上和定义Reducer一样。通过同一个节点上map的合并来减少网络传输。

4)Partitioner

Partitioner组件可以让Map对Key进行分区,从而可以根据不同的key来分发到不同的reduce中去处理。

输入是Map的结果对<key, value>和Reducer的数目,输出则是分配的Reducer(整数编号)。系统缺省的Partitioner是HashPartitioner,它以key的Hash值对Reducer的数目取模,得到对应的Reducer。这样保证如果有相同的key值,肯定被分配到同一个reducre上。

这里输出的Partition的结果和map函数输出的key/value对都会被写入缓冲区。

5)Spill:sort&combiner

Map结果溢出以后,需要对空间内的key做排序(Sort)。 map task的输出需要发送到不同的reduce端去,而内存缓冲区没有对将发送到相同reduce端的数据做合并,这就需要将数据送到Combiner做合并。

例如: 现在map输出的每个key对应的value是一大串1,但处理的文本很多时,这一串1已将占用很大的带宽,如果我们在map的输出给于reduce之前做一下合并或计算,那么传给reduce的数据就会少很多,减轻了网络压力。我们现在本地把Map的输出做一个合并计算,把具有相同key的1做一个计算,然后再把此输出作为reduce的输入,这样传给reduce的数据就少了很多。

Combiner是用reducer来定义的,多数的情况下Combiner和reduce处理的是同一种逻辑,当然也可以单独去定义一个有别于reduce的Combiner,继承Reducer,写法基本上和定义reduce一样。

6)Merge

每次溢写会在磁盘上生成一个溢写文件,如果map的输出结果真的很大,有多次这样的溢写发生,磁盘上相应的就会有多个溢写文件存在。因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,这个过程就叫做Merge。

例如:“aaa”从某个溢出文件读取过来时值是5,从另外一个溢出文件读取时值是8,因为它们有相同的key,所以得merge成group。什么是group。对于“aaa”就是像这样的:{“aaa”, [5, 8, 2, …]},数组中的值就是从不同溢写文件中读取出来的,然后再把这些值加起来。请注意,因为merge是将多个溢写文件合并到一个文件,所以可能也有相同的key存在,在这个过程中如果client设置过Combiner,也会使用Combiner来合并相同的key。

Reduce端流程

在这里插入图片描述
Reduce端Shuffle有两个阶段:

  • Copy:map任务结束,拷贝map输出
  • Merge:将多个map的输出文件合并

1)Copy

Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求map task所在的TaskTracker获取map task的输出文件。

Copy启动时机:
每个map task结束的时候就开始拷贝输出,因为不同的map task完成时间不同。

reduce task中有多个copy线程,可以并行拷贝map输出。

2)Merge

当所有的map输出都拷贝到reduce task后,进入merge过程,将所有的map输出合并为大的排好序的文件。

最后进入Reduce过程,调用Reducer的reduce函数,处理排好序的输出的每个key,最后的结果写入HDFS。

job任务的执行流程

在这里插入图片描述

  1. Run job启动job。收集job环境信息,比如输入路径、输出结果路径等信息。
  2. Get new job id。向jobTracker申请一个新的jobid。jobid的作用一是起到一个唯一标识作用,二是程序员可以根据jobid来查询job,以及kill job
  3. jobTracker分配一个jobid后,告诉jobclient,把job的运算资源上传到HDFS上
  4. jobClient执行submit job,在这个过程中,jobclient把jobid和jar包以及HDFS存储路径交给jobTracker
  5. jobTracker收到相关任务信息,开始进行job的初始化
  6. 根据分片数量以及用户设置的分区数量,计算出有多少个map任务和reduce任务
  7. TaskTracker通过RPC心跳领到jobTracker分配的任务,taskTracker根据任务信息,去HDFS上找到相应的jar包,并下载到自己的节点上
  8. 启动jvm,执行map任务或reduce任务

MapReduce的shuffle调优

详情参考:MapReduce的Shuffle及调优

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值