【知识链接】
1.Spark简介
Spark 是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMP实验室,2013年6月成为Apache孵化项目,2014年2月成为Apache顶级项目。该项目主要使用Scala语言进行编写。
Spark集群的资源管理模式主要有Standalone、YARN和Mesos 3种。资源管理框架之上主要是Spark Core模块,它实现了Spark最基础的功能。Spark Core模块之上是更高层的API,主要由Spark SQL、Spark Streaming、Spark MLlib和Spark Graph X组成,如图1-1所示。
图1-1 Spark模块
Spark的主要模块介绍如下。
● Spark Core:实现了Spark的基本功能,包含任务调度、内存管理、错误恢复、与存储系统交互等模块。Spark Core中还包含了对弹性分布式数据集(Resilient Distributed Dataset,RDD)的API定义。
● Spark SQL:Spark用来操作结构化数据的程序包。通过Spark SQL,可以使用SQL或者Apache Hive版本的SQL查询语言(Hibernate Query Language,HQL)来查询数据。Spark SQL支持多种数据源,比如Hive表、Parquet以及JSON等。
● Spark Streaming:Spark提供的对实时数据进行流式计算的组件,提供了用来操作数据流的API。
● Spark MLlib:提供常见的机器学习功能的程序库,包括分类、回归、聚类、协同过滤等,还提供模型评估、数据导入等额外的功能。
● 集群管理器:Spark支持在各种集群管理器上运行,包括YARN、Mesos,以及Spark自带的调度器——独立(Standalone)调度器。
2.Spark的主要优势
Spark 采用内存性计算方式。相对于Hadoop,在基于内存的并行计算方面,Spark具有非常明显的优势。Spark的主要优势如下。
● 快。与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,基于硬盘的运算也要快10倍以上,如图1-2所示。Spark实现了高效的执行引擎,可以基于内存高效处理数据流,计算的中间结果存储在内存中。
● 易用。Spark支持Java、Python和Scala编程语言的API,还支持超过80种高级算法,使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地使用Spark集群执行分布式计算。
● 通用。Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询、实时流处理、机器学习和图计算,可以在同一个应用中无缝使用。
● 兼容性高。Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用YARN和Mesos作为资源管理器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。
图1-2 Spark和Hadoop性能对比
3.Spark系统架构
Spark 系统的架构是基于Master/Slave模式进行设计的。系统主要由一个Driver和多个Worker Node组成,如图1-3所示。
图1-3 Spark系统架构
● Driver是运行Spark应用的入口,它会创建SparkContext,SparkContext负责和Cluster Manager通信,进行资源申请、任务分配和监控等。
● Cluster Manager负责申请和管理在Worker Node上运行应用所需的资源,包括Spark原生的Cluster Manager、Mesos Cluster Manager和Hadoop YARN Cluster Manager。
● Executor是Application运行在Worker Node上的一个进程,负责运行Task(任务)以及将数据存储在内存或者磁盘上,每个Application都有各自独立的一批Executor。每个Executor则包含了一定数量的资源来运行分配给它的任务。在提交应用中,可以提供参数指定计算节点的个数,以及对应的资源。
4.Spark任务执行流程
在集群环境中提及并运行Spark任务,需要考虑资源的申请、分配及注销的过程。资源管理器承担了这个任务,它分配并监控资源的使用情况,根据集群不同的部署模式,会应用不同的资源管理器,可能是YARN、Mesos或者是Spark的Standalone。
SparkContext负责生成RDD对象,并基于RDD构建DAG图。DAG Scheduler将DAG图分解为Stage,生成Taskset。TaskScheduler提交和监控Task。
Spark任务执行流程如图1-4所示。
图1-4 Spark任务执行流程
(1)构建Spark应用的运行环境,启动SparkContext。SparkContext向Cluster Manager注册,并申请运行Executor资源。
(2)Cluster Manager为Executor分配资源并启动Executor进程,Executor运行情况将随着“心跳”发送到Cluster Manager上。
(3)SparkContext构建DAG图,将DAG图分解成多个Stage,并把每个Stage的Taskset(任务集)发送给Task Scheduler(任务调度器)。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor,同时,SparkContext将应用程序代码发放给Executor。
(4)Task在Executor上运行,把运行结果反馈给Task Scheduler,然后再反馈给DAG Scheduler。运行完毕后写入数据。SparkContext向ClusterManager注销并释放所有资源。