千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:郑州千锋IT培训  >  行业资讯  >  郑州大数据培训学员教你如何正确打开大数据MapReduce?

郑州大数据培训学员教你如何正确打开大数据MapReduce?

来源:千锋教育
发布人:Yolanda
时间: 2018-10-19 15:56:00

     如何正确打开大数据MapReduce?本文将由千锋郑州大数据培训学员给大家分享。

  一、 Job的提交过程

  1.首先由客户端发送job提交请求,然后由rm返回给client一个jobid。

  2.Client将根据程序中的输入地址去hdfs中找文件,然后按照问价的分块来对整个文

  件进行逻辑分片一般按照块的大小来分片,(最后一个分片有1.1倍的冗余,为了节省内存空间的使用,因为一个分片就开启一个mapTask)。

  3.然后client把分片信息以及jar包放到hdfs中的一个位置,client告诉rm自己已经

  做好了准备工作,然后rm根据芬片信息计算出需要的maptask个数,分配好具体的执行的nm和每个nm需要执行的maptask个数(具体的分配规则好像是根据数据块具体存储的datanode(移动计算,少移动数据),把这些信息放入job中一起放入自己的可调度作业队列。

  4.Nm通过每次心跳来监控rm的可调度job队列,从而获取自己的job任务。然后运

  行apptask计算出具体需要的内存资源,然后向rm申请资源,得到资源后运行自己的job任务。

  5.Apptask监控整个作业流程,如果map端运行全部结束然后通知reducer去拿取数据reducer端的工作。

图片1

  二、MR运行全流程

  1.Map端输入:

  Inputformat这个抽象类中有createrecordread方法来创建一个Recordreader中有:boolean nextKeyValue(); public abstract KEYIN getCurrentKey(); public abstract VALUEIN getCurrentValue()。三个方法来获取map端的输入, 在这里有可干预的组件。 (1)自定义输入的数据类型

输入格式

描述

TextInputFormat

默认格式,读取文件的行

行的字节偏移量

行的内容

KeyValueInputFormat

把行解析为键值对

第一个tab字符前的所有字符

行剩下的内容

SequenceFileInputFormat

Hadoop定义的高性能二进制格式

用户自定义

用户自定义

  (2)自定义读取的方法

  map端接收到输入然后maptask调用map函数,每一个k,v对调用一次map函数。

  三、shuffle的过程

  Map端

  1. Mapper产生的数据首先写入到内存缓冲区,默认大小是100M。在内存使用了80%的时候,开始将数据spill到磁盘上。在spill到磁盘前,在内存中做如下操作:

  (1)首先对数据按照Reducer的数目进行分区。

  (2)分区完成后,对每个分区的数据按照Key进行排序。

  (3)每个分区的数据排序完成后,如果Map端定义了Combiner,那么对该分区的

  数据进行Map端combine,这有利于压缩写到磁盘所需要的空间以及发送到reducer的数据.

  2.spill file

  (1)针对每个partiton,mapper可能会spill磁盘多次。每当内存缓冲区满,要spill

  到磁盘时,Hadoop不是追加的方式,而是新建一个新的spill文件,这个文件内的数据是按照Key排序的。

  (2)在Map任务结束前,会对磁盘上的所有的spill文件进行一个总排序,这样Map

  任务结束时,map产生了一个唯一的且排序的输出文件。如果map产生了多余3个的spill file,那么在产生这个唯一的文件之前,再做一次combine操作,将位于不同文件的相同Key进行combine

  3.数据压缩

  为了压缩mapper输出数据,一方面节省占用的磁盘空间,另一方面减少数据传输量,可以使用数据压缩。默认情况下,数据压缩是没有开启的。可以将mapred.compress.map.out设置为true开启即可。同时,也可以为mapper设置压缩算法。

  常用的压缩算法有gzip,lzo和snappy,实际生产环境下,gzip已经很少使用,lzo和snappy各有优缺点,需根据实际情况选择。

  4.数据传输

  Hadoop使用HTTP将map节点的数据传输到reduce节点,默认是五个线程去拉取数据。

  总结:Map只产生一个Partion内部排序的文件(这个文件分割成多个Partition),也就是说Reduce拉取数据时,需要按照offset来取,这个信息记录于什么位置来着。是ApplicationMaster。

  四、 Reduce端

  Reducer从每个Mapper拉取过来的数据都是在Mapper端排好序的。

  1. 1个reducer可能到多个map端拉取属于自己需要处理的map输出文件。拉取的策略即只要有map输出文件完成,那么reducer就去拉取,而不是等到所有的map都完成了才去拉取。

  2. reducer如何得知map已经产生了一个分区的输出文件?在Hadoop2中,mapper直接通知ApplicationMaster。在Hadoop1中,mapper通知TaskTracker,任务已经执行完成,而TaskTracker则通知JobTracker,那么JobTracker则会通知Reducer已经有Mapper任务执行完成并且数据的位置在什么地方(此处可见,JobTracker确实承担了很多的职责)。

  3. reducer拉取分区数据后,如果拉过来的数据量较小,那么直接加载到内存;如果较大,则存放到磁盘上。这跟Mapper端的处理过程类似,此时Reducer的内存大小是50M,随着拉取的数据越来越多,内存容不下,Reducer开启Spill到磁盘操作。

  4. 当所有的分区数据拉取过来后,就开始了merge sort阶段,将单个已排序的文件进行总排序。

  5.当所有的文件归并排序完成后,就开始了reduce阶段,即把排序的数据传给reducer。

  6.然后reducertask把文件写出到外部文件系统。

图片2

  五、Shuffle总结

  Hadoop Map/Reduce Shuffle过程简单的总结为:

  map->partition(根据Reducer的个数 进行分区)->map side sort(partition内排序)->combine(Partition内Combine)->spill->map side merge(因为可能spill出多个文件,最后需要merge成一个大文件)->fetch->reduce side merge->reduce

  而此时最常见的问题大致有几点:

  1. 每个partition经过Map后得到一个排序的文件,那么这个文件中的数据只被一个Reducer消费还是被所有的Reducer消费?答案自是被所有的Reducer消费,也就是说一个Map输出文件包含了很多个Partition,Reducer只关心属于自己的Partition。在上面的那幅图中也清楚的看到,一个Map产生的最终输出文件包含了3个Partition(merge on disk右侧连在一起的三个矩形框),而每个Partition由reducer进行消费。

  2. 每个partition经过Map后得到一个排序的文件,那么所有的Map总共产生Map数目的文件。

  这里的Partition是输入的Partition数,即Input Split的输入产生的Partition数目。在Spark的Sort Based的shuffle中,最终也是产生了m个(m是输出文件。在Spark的Hash Based的shuffle中,产生的输出文件个数是MR

  3.这里需要注意的是,流程是在排序前就要partition,然后partition内部做排序。然后分区数据会被送往处理它的Reducer。

  4. 此外,需要提及一点Sort Based Shuffle的优势在哪里?Hadoop MapReduce 是 sort-based,进入 combine() 和 reduce() 的 records 必须先sort。这样的好处在于 combine/reduce() 可以处理大规模的数据,因为其输入数据可以通过外排得到(mapper 对每段数据先做排序,reducer 的 shuffle 对排好序的每段数据做归并)。

  六、shuffle的特性

  1. Reducer从Map端拉取属于自己Partition(分区)的数据时,该Partition(分区)的数据已经在Map端排好序。Reducer将属于它的所有的partition(分区)拉取过去后,进行Reducer端的归并排序(归并排序的原因是Reducer会从多个Mapper拉取相应的Partition(分区),Reducer需要将所有这些Partition(分区)进行排序)。

  2. 如果客户端定义了Combiner,那么在数据在排好序后,会调用CombinerClass对数据已经combine,然后才spill到磁盘。这就是说Sort操作在Combine操作之前执行,而Partititon操作在Sort之前执行,也就是Parttion(分区)->Sort->Combine(连接)的过程。

  3. 整个Shuffle的过程包含如下几部分:foreach inputsplit do: map->output to memory buffer->partition(根据Reducer的个数进行分区)->map side sort(partition(分区)内排序)->combine(连接)(Partition内Combine)->spill->map side merge(因为可能spill出多个文件,最后需要merg(归并)成一个大文件)->reducer fetch from Mapper->reducer side merge->reduce to ouput。

  4. 那map side什么时候开始partition流程?在Map结果或者内存缓冲即将满需要spill到磁盘时做。

  七、mr过程中可干预的组件

  1.Map/Reduce数量

  (1)Mapper数量不能直接设定,可以通过选择BlockSize间接调整Mapper数量,

  压缩输入文件,重写InputFormat,覆盖getSplits方法。

  (2)适当选择Reducer数量,Reducer数量由程序指定,默认为1。Reducer数量

  过小导致并发度不够,过大导致Overhead过高。每个Reducer处理1-2G的数据比较合适,Jobtracker上每个任务需要维护一个(MapNum * ReduceNum)的矩阵,每个reducer很有可能要从所有的mapper获取数据。

  2.Combiner

  (1)Combiner可做看local reducer 合并相同的key对应的value(wordcount子) ,

  通常与Reducer逻辑一样 。

  (2)其好处在于 减少Map Task输出数据量(磁盘IO) ,减少Reduce-Map网络

  传输数据量(网络IO)

  3.Partitioner

  Partitioner用于划分键值空间(key space)。

  Partitioner负责控制map输出结果key的分割。Key(或者一个key子集)被用于产生分区,通常使用的是Hash函数。分区的数目与一个作业的reduce任务的数目是一样的。因此,它控制将中间过程的key(也就是这条记录)应该发送给m个reduce任务中的哪一个来进行reduce操作。HashPartitioner是默认的 Partitioner。

  (1) Partitioner决定了Map Task输出的每条数据,交给哪个Reduce Task处理

  (2) 默认实现:hash(key) mod R ,R是Reduce Task数目

  (3)很多情况需自定义Partitioner ,如“hash(hostname(URL)) mod R”确保相

  同域名的网页交给同一个Reduce Task处理 。

  4. GroupingComparator

  继承WritableComparator类来重写compare重定义分组策略。

  互联网是当下流行趋势,大数据的发展是必然的,如果你想要学习大数据的话可以关注千锋大数据培训机构,主打全程面授的教学方针,先进的技术+项目:以北京的中关村、西二旗等IT密集的公司为技术背景。如:sina微博的DSP广告大数据分析平台、百度搜索引擎挖掘计算流量等。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

大数据培训要花多少钱

2023-04-12

计算机前端怎么学

2023-04-12

大数据都需要学什么?难不难

2023-03-30

最新文章NEW

javaee是前端还是后端,都学什么

2023-03-24

it前端是做什么的

2023-03-24

大数据培训要多久?你了解多少

2023-03-09

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>