1. 阐述Hadoop生态系统中,HDFS, MapReduce, Yarn, Hbase及Spark的相互关系,为什么要引入Yarn和Spark。

  Hadoop分布式文件系统(HDFS)是针对谷歌分布式文件系统的开源实现,它是Hadoop两大核心组成部分之一,提供了在廉价服务器集群中进行大规模分布式文件存储的能力。HDFS具有很好的容错能力,并且兼容廉价的硬件设备,因此,可以以比较低的成本利用现有机器实现大流量和大数据量的读写。

  MapReduce是一种分布式并行编程模型,用于大规模数据集(大于1TB)的并行运算,它将复杂的、运行于大规模集群上的并行计算过程高度抽象为两个函数:Map和Reduce。MapReduce极大地方便了分布式编程工作,编程人员在不会分布式并行编程的情况下,也可以很容易的将自己的程序运行在分布式系统上,完成海量数据集的运算。

  Yarn是负责集群资源管理的组件,它是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性差,不支持多计算框架而提出的。YARN是下一代Hadoop计算平台,是一个通用的运行时框架,用户可以编写自己的极端框架,在该运行环境中运行。

  HBase是针对谷歌BigTable的开源实现,是一个高可靠、高性能、面向列、可伸缩的分布式数据库,主要用来存储非结构化的松散数据。HBase可以支持超大规模数据存储,它可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。HBase利用MapReduce来处理HBase中海量的数据,实现高性能运算,使用HDFS作为高可靠的底层存储,利用廉价集群提供海量数据存储能力。

  Spark是一个可运用于大规模数据处理的快速通用引擎,Spark既能够提供内存计算框架,也可以支持SQL即席查询、流计算、机器学习和图计算等,Spark可以部署在Yarn上,提供一站式的数据解决方案,因此,Spark提供的生态系统同时支持批处理、交互式查询和流数据处理。

  引入Yarn的目标是实现“一个集群多个框架”,即在一个集群上部署一个统一的资源调度管理框架Yarn,在Yarn上可以部署其他各种计算框架,如MapReduce、Tez、Spark等。Yarn为这些计算框架提供统一的资源调度管理服务(包括CPU、内存等资源),并且能够根据各种计算框架的负载需求,调整各自占用的资源,实现集群资源共享和资源弹性收缩。通过这种方式,可以实现一个集群上的不同应用负载混搭,有效提高了集群的利用率。同时,不同计算框架可以共享底层存储,在一个集群上集成多个数据集,使用多个计算框架来访问这些数据集,从而避免了数据集跨集群移动,来降低企业的运行成本。

  Hadoop虽然已经成为大数据技术的事实标准,但其本身还存在诸多缺陷,如(1)Hadoop MapRedue 的表达能力有限,所有计算都需要转换成 Map 和 Reduce 两个操作,不能适用于所有场景,对于复杂的数据处理过程难以描述;(2)磁盘 I/O 开销大,Hadoop MapReduce 要求每个步骤间的数据序列化到磁盘,所以 I/O 成本很高,导致交互分析和迭代算法开销很大,而几乎所有的最优化和机器学习都是迭代的,所以Hadoop MapReduce 不适合于交互分析和机器学习;(3)计算延迟高,如果想要完成比较复杂的工作,就必须将一系列的 MapReduce 作业,串联起来,然后顺序执行这些作业。每一个作业,都是高时延的,而且只有在前一个作业完成之后,下一个作业才能开始启动,因此Hadoop MapReduce 不能胜任比较复杂的、多阶段的计算服务。Spark 是借鉴了 Hadoop MapReduce 技术发展而来的,继承了其分布式并行计算的优点,并改进了 MapReduce 明显的缺陷。Spark 使用Scala 语言进行实现,它是一种面向对象的函数式编程语言,能够像操作本地集合对象一样,轻松地操作分布式数据集。它具有运行速度快、易用性好、通用性强和随处运行等特点,具体优势如下:(1)Spark 提供了内存计算,把中间结果,放到内存中,带来了更高的迭代运算效率,通过支持有向无环图(DAG)的分布式,并行计算的编程框架,Spark 减少了迭代过程中数据需要写入磁盘的需求,提高了处理效率;(2)Spark 为我们提供了一个全面、统一的框架,用于管理各种有着不同性质(文本数据、图表数据等)的数据集和数据源(批量数据或实时的流数据)的大数据处理的需求,Spark 使用内存缓存来提升性能,因此进行交互式分析也足够快速,缓存同时提升了迭代算法的性能,这使得 Spark 非常适合数据理论任务,特别是机器学习;(3)Spark 比 Hadoop 更加通用,Hadoop 只提供了 Map 和 Reduce 两种处理操作,而Spark 提供的数据集操作类型更加丰富,从而可以支持更多类型的应用,Spark 的计算模式也属于 MapReduce 类型,但提供的操作不仅包括 Map 和 Reduce,还提供了包括 Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort、PartionBy 等多种转换操作,以及 Count、Collect、Reduce、Lookup、Save 等行为操作;(4)Spark 基于 DAG 的任务调度执行机制,比 Hadoop MapReduce 的迭代执行机制更优越,Spark 各个处理结点之间的通信模型,不再像 Hadoop 一样,只有 Shuffle 一种模式,程序开发者可以使用 DAG 开发复杂的多步数据管道,控制中间结果的存储、分区等。

2. Spark已打造出结构一体化、功能多样化的大数据生态系统,请简述Spark生态系统。

  Spark生态圈以Spark Core为核心,从HDFS、Amazon S3和HBase等持久层读取数据,以MESS、YARN和自身携带的Standalone为资源管理器调度Job完成Spark应用程序的计算。 这些应用程序可以来自于不同的组件,如Spark Shell/Spark Submit的批处理、Spark Streaming的实时处理应用、Spark SQL的即席查询、BlinkDB的权衡查询、MLlib/MLbase的机器学习、GraphX的图处理和SparkR的数学计算等等。无论是Spark SQL、Spark Streaming、MLlib还是GraphX,都可以使用Spark Core的API处理问题,它们的方法几乎是通用的,处理的数据也可以共享,不同应用之间的数据可以无缝集成。

3. 用图文描述你所理解的Spark运行架构,运行流程。

  如下图所示,Spark运行架构包括集群资源管理器(Cluster Manager)、运行作业任务的工作节点(Worker Node)、每个应用的任务控制节点(Driver)和每个工作节点上负责具体任务的执行进程(Executor)。其中,集群资源管理器可以是Spark自带的资源管理器,也可以是YARN或Mesos等资源管理框架。
与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点:一是利用多线程来执行具体的任务(Hadoop MapReduce采用的是进程模型),减少任务的启动开销;二是Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,当需要多轮迭代计算时,可以将中间结果存储到这个存储模块里,下次需要时,就可以直接读该存储模块里的数据,而不需要读写到HDFS等文件系统里,因而有效减少了IO开销;或者在交互式查询场景下,预先将表缓存到该存储系统上,从而可以提高读写IO性能。

                                                            

 

  如下图 所示,Spark的基本运行流程如下:
  (1)当一个Spark应用被提交时,首先需要为这个应用构建起基本的运行环境,即由任务控制节点(Driver)创建一个SparkContext,由SparkContext负责和资源管理器(Cluster Manager)的通信以及进行资源的申请、任务的分配和监控等。SparkContext会向资源管理器注册并申请运行Executor的资源;
  (2)资源管理器为Executor分配资源,并启动Executor进程,Executor运行情况将随着“心跳”发送到资源管理器上;
  (3)SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAG调度器(DAGScheduler)进行解析,将DAG图分解成多个“阶段”(每个阶段都是一个任务集),并且计算出各个阶段之间的依赖关系,然后把一个个“任务集”提交给底层的任务调度器(TaskScheduler)进行处理;Executor向SparkContext申请任务,任务调度器将任务分发给Executor运行,同时,SparkContext将应用程序代码发放给Executor;
  (4)任务在Executor上运行,把执行结果反馈给任务调度器,然后反馈给DAG调度器,运行完毕后写入数据并释放所有资源。

                                                    

 

  总体而言,Spark运行架构具有以下特点:
  (1)每个应用都有自己专属的Executor进程,并且该进程在应用运行期间一直驻留。Executor进程以多线程的方式运行任务,减少了多进程任务频繁的启动开销,使得任务执行变得非常高效和可靠;
  (2)Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可;
  (3)Executor上有一个BlockManager存储模块,类似于键值存储系统(把内存和磁盘共同作为存储设备),在处理迭代计算任务时,不需要把中间结果写入到HDFS等文件系统,而是直接放在这个存储系统上,后续有需要时就可以直接读取;在交互式查询场景下,也可以把表提前缓存到这个存储系统上,提高读写IO性能;
  (4)任务采用了数据本地性和推测执行等优化机制。数据本地性是尽量将计算移到数据所在的节点上进行,即“计算向数据靠拢”,因为移动计算比移动数据所占的网络资源要少得多。而且,Spark采用了延时调度机制,可以在更大的程度上实现执行过程优化。

 

posted on 2021-03-13 19:58  多吃外卖  阅读(80)  评论(0编辑  收藏  举报