Hadoop 面试,有它就够了

Map Reduce & YARN
简介
Apache Hadoop 是一个开源软件框架,可安装在一个商用机器集群中,使机器可彼此通讯并协同工做,以高度分布式的方式共同存储和处理大量数据。最初,Hadoop 包含如下两个主要组件:Hadoop Distributed File System (HDFS) 和一个分布式计算引擎,该引擎支持以 MapReduce 做业的形式实现和运行程序。
MapReduce 是 Google 推广的一个简单的编程模型,它对以高度并行和可扩展的方式处理大数据集颇有用。MapReduce 的灵感来源于函数式编程,用户可将他们的计算表达为 map 和 reduce 函数,将数据做为键值对来处理。Hadoop 提供了一个高级 API 来在各类语言中实现自定义的 map 和 reduce 函数。
Hadoop 还提供了软件基础架构,以一系列 map 和 reduce 任务的形式运行 MapReduce 做业。Map 任务 在输入数据的子集上调用 map 函数。在完成这些调用后,reduce 任务 开始在 map 函数所生成的中间数据上调用 reduce 任务,生成最终的输出。 map 和 reduce 任务彼此单独运行,这支持并行和容错的计算。
最重要的是,Hadoop 基础架构负责处理分布式处理的全部复杂方面:并行化、调度、资源管理、机器间通讯、软件和硬件故障处理,等等。得益于这种干净的抽象,实现处理数百(或者甚至数千)个机器上的数 TB 数据的分布式应用程序从未像如今这么容易过,甚至对于以前没有使用分布式系统的经验的开发人员也是如此。
MR架构java

将任务分割为 Map 端和 reduce 端。面试

JobClient JobTracker TaskTracker

  1. JobClient 向 JobTracker 请求一个新的 jobID
  2. 检查做业输出说明
  3. 计算做业输出划分split
  4. 将运行做业所须要的资源(做业的jar文件、配置文件、计算所得的输入划分)复制到一个以做业ID命名的目录中JobTracker的文件系统。
  5. 经过调用JobTracker的submitJob()方法,告诉JobTracker做业准备执行
  6. JobTracker接收到submitJob()方法调用后,把此调用放到一个内部队列中,交由做业调度器进行调度,并对其进行初始化
  7. 建立运行任务列表,做业调度去首先从共享文件系统中获取JobClient已经计算好的输入划分信息(图中step6),而后为每一个划分建立一个Map任务(一个split对应一个map,有多少split就有多少map)。
  8. TaskTracker执行一个简单的循环,按期发送心跳(heartbeat)调用JobTracker

shuffle combine

总体的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过程,能优化的地方主要在于减小拉取数据的量及尽可能使用内存而不是磁盘。架构

Map Shuffle

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

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

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

  • Combiner 将有相同key的 key/value 对加起来,减小溢写spill到磁盘的数据量。Combiner的适用场景:因为Combiner的输出是Reducer的输入,Combiner毫不能改变最终的计算结果。故大多数状况下,combiner适用于输入输出的key/value类型彻底一致,且不影响最终结果的场景(好比累加、最大值等……)。函数式编程

  1. Merge
    map 很大时,每次溢写会产生一个 spill_file,这样会有多个 spill_file,而最终的输出只有一个文件,在最终输出以前会对多个中间过程屡次产生的溢写文件 spill_file 进行合并,此过程就是 merge。

merge 就是把相同 key 的结果加起来。(固然,若是设置过combiner,也会使用combiner来合并相同的key)

 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 上。

YARN

YARN(Yet Another Resource Negotiator),下一代MapReduce框架的名称,为了容易记忆,通常称为MRv2(MapReduce version 2)。该框架已经再也不是一个传统的MapReduce框架,甚至与MapReduce无关,她是一个通用的运行时框架,用户能够编写本身的计算框架,在该运行环境中运行。用于本身编写的框架做为客户端的一个lib,在运用提交做业时打包便可。

why YARN instead of MR

MR 的缺点

经典 MapReduce 的最严重的限制主要关系到可伸缩性资源利用对与 MapReduce 不一样的工做负载的支持。在 MapReduce 框架中,做业执行受两种类型的进程控制:

  • 一个称为 JobTracker 的主要进程,它协调在集群上运行的全部做业,分配要在 TaskTracker 上运行的 map 和 reduce 任务。
  • 许多称为 TaskTracker 的下级进程,它们运行分配的任务并按期向 JobTracker 报告进度。

大型的 Hadoop 集群显现出了由单个 JobTracker 致使的可伸缩性瓶颈。
此外,较小和较大的 Hadoop 集群都从未最高效地使用他们的计算资源。在 Hadoop MapReduce 中,每一个从属节点上的计算资源由集群管理员分解为固定数量的 map 和 reduce slot,这些 slot 不可替代。设定 map slot 和 reduce slot 的数量后,节点在任什么时候刻都不能运行比 map slot 更多的 map 任务,即便没有 reduce 任务在运行。这影响了集群的利用率,由于在全部 map slot 都被使用(并且咱们还须要更多)时,咱们没法使用任何 reduce slot,即便它们可用,反之亦然。
Hadoop 设计为仅运行 MapReduce 做业。随着替代性的编程模型(好比 Apache Giraph 所提供的图形处理)的到来,除 MapReduce 外,愈来愈须要为可经过高效的、公平的方式在同一个集群上运行并共享资源的其余编程模型提供支持。

原MapReduce框架的不足

  • JobTracker是集群事务的集中处理点,存在单点故障
  • JobTracker须要完成的任务太多,既要维护job的状态又要维护job的task的状态,形成过多的资源消耗
  • 在taskTracker端,用map/reduce task做为资源的表示过于简单,没有考虑到CPU、内存等资源状况,当把两个须要消耗大内存的task调度到一块儿,很容易出现OOM
  • 把资源强制划分为map/reduce slot,当只有map task时,reduce slot不能用;当只有reduce task时,map slot不能用,容易形成资源利用不足。

解决可伸缩性问题

在 Hadoop MapReduce 中,JobTracker 具备两种不一样的职责:

  • 管理集群中的计算资源,这涉及到维护活动节点列表、可用和占用的 map 和 reduce slots 列表,以及依据所选的调度策略将可用 slots 分配给合适的做业和任务
  • 协调在集群上运行的全部任务,这涉及到指导 TaskTracker 启动 map 和 reduce 任务,监视任务的执行,从新启动失败的任务,推测性地运行缓慢的任务,计算做业计数器值的总和,等等

为单个进程安排大量职责会致使重大的可伸缩性问题,尤为是在较大的集群上,JobTracker 必须不断跟踪数千个 TaskTracker、数百个做业,以及数万个 map 和 reduce 任务。相反,TaskTracker 一般近运行十来个任务,这些任务由勤勉的 JobTracker 分配给它们。

为了解决可伸缩性问题,一个简单而又绝妙的想法应运而生:咱们减小了单个 JobTracker 的职责,将部分职责委派给 TaskTracker,由于集群中有许多 TaskTracker。在新设计中,这个概念经过将 JobTracker 的双重职责(集群资源管理和任务协调)分开为两种不一样类型的进程来反映。

YARN 的优势

  1. 更快地MapReduce计算
  2. 对多框架支持
  3. 框架升级更容易

YARN

  • ResourceManager 代替集群管理器
  • ApplicationMaster 代替一个专用且短暂的 JobTracker
  • NodeManager 代替 TaskTracker
  • 一个分布式应用程序代替一个 MapReduce 做业

一个全局 ResourceManager 以主要后台进程的形式运行,它一般在专用机器上运行,在各类竞争的应用程序之间仲裁可用的集群资源。
在用户提交一个应用程序时,一个称为 ApplicationMaster 的轻量型进程实例会启动来协调应用程序内的全部任务的执行。这包括监视任务,从新启动失败的任务,推测性地运行缓慢的任务,以及计算应用程序计数器值的总和。有趣的是,ApplicationMaster 可在容器内运行任何类型的任务。
NodeManager 是 TaskTracker 的一种更加普通和高效的版本。没有固定数量的 map 和 reduce slots,NodeManager 拥有许多动态建立的资源容器。

感兴趣能够加Java架构师群获取Java工程化、高性能及分布式、高性能、深刻浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走不少的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

一、具备工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。

二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。

三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。

四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工做经验的梳理和总结,带着你们全面、科学地创建本身的技术体系和技术认知!

相关文章
相关标签/搜索