Spark分布式处理实战
上QQ阅读APP看书,第一时间看更新

【知识链接】

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注销并释放所有资源。