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

编程硬核资料库,
随查随看随问答!

当前位置:首页  >  行业资讯  >  正文
分享到:

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

时间:2018-10-19 15:56     来源:千锋教育郑州校区 作者:Yolanda

     如何正确打开大数据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广告大数据分析平台、百度搜索引擎挖掘计算流量等。

相关文章

热门视频

开班信息

  • 云计算培训就业班--------------------------------

    12.23抢座

  • JavaEE培训就业班--------------------------------

    12.23抢座

  • HTML5大前端就业班--------------------------------

    12.23抢座

  • Python培训就业班--------------------------------

    12.16抢座

  • UI设计培训就业班--------------------------------

    11.25抢座

  • JavaEE培训就业班--------------------------------

    11.25抢座

  • HTML5大前端就业班--------------------------------

    11.25抢座

  • JavaEE培训就业班--------------------------------

    10.28抢座

  • HTML5大前端就业班--------------------------------

    10.28抢座

  • JavaEE培训就业班--------------------------------

    09.23开班

  • 北京总部地址:北京市海淀区宝盛北里西区28号中关村智诚科创大厦4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术学院广场服务楼
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、Linux云计算+网络安全培训、互联网营销培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 深圳校区地址:深圳市宝安区宝安大道5010号西部硅谷B座A区6层A605/B座C区1层108
    咨询电话:0755-23015275/23015546-801/86660670
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、Linux云计算+网络安全培训、互联网营销培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 上海校区地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-811-9990 021-65233829-609
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、Linux云计算+网络安全培训、互联网营销培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 广州校区地址:广州市天河区元岗路200号慧通产业园B9三层
    咨询电话:020-87088521
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 郑州二七区校区地址:郑州市二七区航海中路60号海为科技园C区10层
    郑州高新区校区地址:郑州市高新区金梭路与银杏路交叉口教育科技产业园南门D座4层
    咨询电话:0371-55191750/18610973027
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 大连校区地址:辽宁省大连市高新园区爱贤街10号大连设计城A座901
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 武汉金融港校区地址:武汉市东湖高新技术开发区光谷大道77号金融港B18栋3楼
    武汉智慧园校区地址:武汉市东湖高新技术开发区光谷大道61号智慧园21栋2楼
    咨询电话:027-59313371
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 成都校区地址:成都市武侯区科华北路62号力宝大厦N(北楼)16楼
    咨询电话:18628039301/18280029283/13028173481/18613201237
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 西安校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85363390
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 杭州旺田校区:浙江省杭州市江干区九堡旺田书画城A座4层
    杭州龙驰校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层
    咨询电话:400-811-9990 0571-86893632/0571-86094032
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 青岛校区地址:青岛市市北区龙城路卓越世纪中心3号楼8层801
    咨询电话:0532-80911190
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 重庆校区地址:重庆市高新区科园一路2号大西洋国际12-1
    咨询电话:400-811-9990 023-68883009
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 长沙校区地址:湖南省长沙市岳麓区麓谷企业广场A2栋三单元306号
    咨询电话:0731-85513210
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 哈尔滨校区地址:哈尔滨市松北区世泽路689号科技创新城4号楼11楼
    咨询电话:400-811-9990/0451-87173191
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 南京校区地址:南京市建邺区应天大街780号弘辉产业园1栋2层
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 太原校区地址:太原市小店区长治路230号能源互联网大厦6层
    咨询电话:400-811-9990 16603513433
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 沈阳校区地址:辽宁省沈阳市浑南区世纪路16号东大软件园B园B1座A201
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 合肥校区地址:合肥市包河区徽州大道396号东方广场B座12A
    咨询电话:400-811-9990
    面授课程:HTML5大前端培训、JavaEE+分布式开发培训、Python全栈+人工智能培训、全链路UI/UE设计培训、云计算培训、全栈软件测试培训、大数据+人工智能培训、智能物联网+嵌入式培训、Unity游戏开发培训、Go语言开发培训、PHP全栈+服务器集群培训、网络安全培训、互联网营销培训、好程序员
    认证课程:软考、Adobe认证、PMP认证、红帽RHCE认证
  • 千锋教育服务号

    了解千锋动态
    关注千锋教育服务号

  • 千锋教育移动站

    扫一扫快速进入
    千锋移动端页面

  • 千锋互联服务号

    扫码匿名提建议
    直达CEO信箱