Spark架构与运行流程

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

Hadoop:Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的。不是一个工具,也不是一种技术,是一种技术的合称
HDFS:分布式文件系统。传统的文件系统是单机的,不能横跨不同的机器。比如你说我要获取/hdfs/tmp/file1的数据,你引用的是一个文件路径,但是实际的数据存放在很多不同的机器上。你作为用户,不需要知道这些,就好比在单机上你不关心文件分散在什么磁道什么扇区一样。HDFS为你管理这些数据。
Map Reduce:分布式计算。一台机器读取成T上P的数据,也许需要好几天甚至好几周。对于很多公司来说,单机处理是不可忍受的。如果要用很多台机器处理,我就面临了如何分配工作,如果一台机器挂了如何重新启动相应的任务,机器之间如何互相通信交换数据以完成复杂的计算等等。这就是MapReduce / Tez / Spark的功能。
Spark:之前的Map Reduce类似于汇编语言,那么现在的spark就类似于python了,功能和Map Reduce类似,但是对于开发人员更加的友好,更方便使用。
Hive:你希望有个更高层更抽象的语言层来描述算法和数据处理流程。于是就有了Hive。Hive用SQL描述MapReduce。它把脚本和SQL语言翻译成MapReduce程序,丢给计算引擎去计算,而你就从繁琐的MapReduce程序中解脱出来,用更简单更直观的语言去写程序了。
SparkSQL和Hive on Spark:自从数据分析人员开始用Hive分析数据之后,它们发现,Hive在MapReduce上跑,很慢! 它们的设计理念是,MapReduce慢,但是如果我用新一代通用计算引擎Tez或者Spark来跑SQL,那我就能跑的更快。
Yarn:有了这么多乱七八糟的工具,都在同一个集群上运转,大家需要互相尊重有序工作。所以另外一个重要组件是,调度系统。

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

Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算
Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写,特别是Scala是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
Spark具有很强的适应性,能够读取HDFS、Cassandra、HBase、S3和Techyon为持久层读写原生数据,能够以Mesos、YARN和自身携带的Standalone作为资源管理器调度job,来完成Spark应用程序的计算。
Spark是在借鉴了MapReduce之上发展而来的,继承了其分布式并行计算的优点并改进了MapReduce明显的缺陷,具体如下:
首先,Spark把中间数据放到内存中,迭代运算效率高。MapReduce中计算结果需要落地,保存到磁盘上,这样势必会影响整体速度,而Spark支持DAG图的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。
其次,Spark容错性高。Spark引进了弹性分布式数据集RDD (Resilient Distributed Dataset) 的抽象,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即充许基于数据衍生过程)对它们进行重建。另外在RDD计算时可以通过CheckPoint来实现容错,而CheckPoint有两种方式:CheckPoint Data,和Logging The Updates,用户可以控制采用哪种方式来实现容错。
最后,Spark更加通用。不像Hadoop只提供了Map和Reduce两种操作,Spark提供的数据集操作类型有很多种,大致分为:Transformations和Actions两大类。Transformations包括Map、Filter、FlatMap、Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort和PartionBy等多种操作类型,同时还提供Count, Actions包括Collect、Reduce、Lookup和Save等操作。另外各个处理节点之间的通信模型不再像Hadoop只有Shuffle一种模式,用户可以命名、物化,控制中间结果的存储、分区等。
Spark支持多种分布式存储系统:HDFS和S3及其生态系统简介总结
Spark拥有DAG执行引擎,支持在内存中对数据进行迭代计算
Spark不仅支持Scala编写应用程序,而且支持Java和Python等语言进行编写,特别是Scala是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。
Spark具有很强的适应性,能够读取HDFS、Cassandra、HBase、S3和Techyon为持久层读写原生数据,能够以Mesos、YARN和自身携带的Standalone作为资源管理器调度job,来完成Spark应用程序的计算。

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

Spark应用程序在群集上作为独立的进程集运行,由SparkContext 主程序中对象(称为驱动程序协调

具体来说,要在集群上运行,SparkContext可以连接到几种类型的集群管理器 (Spark自己的独立集群管理器Mesos或YARN),它们可以在应用程序之间分配资源。连接后,Spark会在群集中的节点上获取执行程序,这些节点是运行计算并为您的应用程序存储数据的进程。接下来,它将您的应用程序代码(由传递给SparkContext的JAR或Python文件定义)发送给执行者。最后,SparkContext将任务发送给执行程序以运行。

Spark集群组件

关于此体系结构,有几点有用的注意事项:

1.每个应用程序都有其自己的执行程序进程,这些进程在整个应用程序期间保持不变,并在多个线程中运行任务。这样的好处是可以在调度方面(每个驱动程序调度自己的任务)和执行者方面(来自不同应用程序的任务在不同的JVM中运行)将应用程序彼此隔离。但是,这也意味着,如果不将数据写入外部存储系统,则无法在不同的Spark应用程序(SparkContext实例)之间共享数据。

2.Spark与基础群集管理器无关。只要它可以获取执行程序进程,并且它们彼此通信,即使在还支持其他应用程序(例如Mesos / YARN)的集群管理器上运行它,也是相对容易的。

3.驱动程序在其整个生命周期中必须侦听并接受其执行程序的传入连接(例如,请参见网络配置部分中的spark.driver.port)。因此,驱动程序必须是可从工作程序节点进行网络寻址的。

4.由于驱动程序在群集上调度任务,因此应在工作节点附近运行,最好在同一局域网上运行。如果您想将请求远程发送到集群,最好是将RPC打开到驱动程序,并让它在附近提交操作,而不是在远离工作节点的地方运行驱动程序。

 

参考内容:http://spark.apache.org/docs/latest/cluster-overview.html

posted @ 2021-03-12 15:56  写那么快干嘛啊?  阅读(147)  评论(0编辑  收藏  举报