Apache Spark是专为大规模数据处理而设计的快速、通用、可扩展的计算引擎。Spark是由加州大学伯克利分校的AMP实验室(UC Berkeley AMP lab)开源的类似于Hadoop MapReduce的通用并行框架。Spark继承了MapReduce的扩展性和高容错性,同时对MapReduce进行了优化。目前,Spark已经发展成为一个包含SparkSQL、Spark Streaming、GraphX、MLlib等多个组件在内的生态系统,得到了众多互联网巨头公司(如Intel、IBM、阿里、腾讯、百度、京东等)的支持。
与MapReduce相比,Spark具有如下优势:
(1)运行速度更快。Spark基于内存实现大数据并行计算,不需要频繁地读写HDFS,满足了在大数据环境下数据处理的实时性,因此能够更好地应用于数据挖掘与机器学习等需要迭代的算法。
(2)适用场景更广。Spark适用于复杂的批量处理、基于历史数据的交互式查询和基于实时数据流的数据处理等复杂场景。
(3)开发更简单。Spark支持Java和Scala等多种语言,所提供的丰富的API可以支持近百种高级算子,数据源更丰富,可部署在多种集群中。
(4)容错性更高。Spark引入了弹性分布式数据集(resilient distributed datasets,RDD),如果数据集一部分被丢失,可以基于数据衍生过程进行重建。
下面简单介绍Spark生态系统、Spark核心数据模型RDD、Spark集群架构及运行步骤。
一、Spark生态系统
Spark的生态系统如图6-3所示。Spark系统的核心框架是Spark core,此外还提供了基于结构化查询的数据仓库工具Spark SQL、基于流数据处理的计算框架Spark Streaming、基于机器学习算法的分布式学习库MLlib,以及基于图计算的并行框架GraphX等。
其中,Spark Core提供了Spark最核心的功能,其它组件的运行和扩展都是在Spark core的基础上进行的。构成Spark的其它重要组件中,Spark SQL是Spark用来处理结构化数据的分布式SQL查询引擎,用户可以在Spark SQL上通过SQL语句进行操作,这些查询语句会被转换为Spark操作,最终形成可执行的物理操作;Spark Streaming是Spark引擎的一种扩展,适用于实时处理流式数据;MLlib是Spark的可扩展机器学习库,由一系列机器学习算法和实用程序组成,如分类、聚类、回归、决策树、随机森林等数据分析与挖掘算法以及一些底层优化的方法;GraphX是Spark的图计算引擎,提供了对图计算和图挖掘的简洁、易用且丰富的接口,极大地满足了对分布式图处理的需求。
图6-3 Spark生态系统[18]
二、Spark的核心数据模型RDD
RDD是Spark的数据核心。RDD对象实际上是用来存储数据块(block)和节点(node)等映射关系以及其它信息的元数据结构,逻辑上可以分为多个分区(partion),毎个分区对应于内存或磁盘中的一个块。如图6-4所示。
图6-4 Spark的核心数据模型RDD[18]
RDD主要有以下3个方面的特性:(www.xing528.com)
(1)数据集合抽象特性。RDD可以看作是被封装过的、具有一定扩展特性的数据集,是存储在物理介质上的数据的一种逻辑视图,是数据集合的抽象。
(2)分布式特性。RDD的多级存储特性使其可以存储在多个节点的磁盘与内存中。
(3)弹性特性。RDD分区的结构和数量可以通过再分区等操作,人为地进行设计和修改。
RDD在Spark中的运行主要分为以下3个步骤:
(1)创建RDD对象。
(2)构建有向无环图(directed acyclic graph,DAG):DAG调度器负责对各个RDD之间的依赖关系进行分析和计算,并根据这些依赖关系构建DAG;然后将DAG划分为不同的阶段,每个阶段由可以并发执行的多个任务构成。DAG调度器将任务划分完成后提交到任务调度器。
(3)任务分发及运行:任务调度器通过集群管理器申请计算资源,将任务分发到不同计算节点上的进程,从而在进程中运行任务。
三、Spark工作原理及运行步骤
Spark的工作原理如图6-5所示,其中集群管理器(cluster manager)负责集群的资源调度,比如为计算节点分配CPU和内存等资源,并实时监控计算节点(worker node)的资源使用情况;驱动器程序(driver program)运行应用的main()函数,并且创建一个代表集群环境的SparkContext对象,程序的执行从驱动器程序开始;SparkContext对象的作用是联系集群管理器以及与进程(executor)交互,负责任务(task)的调度分配;集群上一个计算节点默认分配一个进程,任务是在进程上执行的最小单元;进程负责运行计算任务之后,并在完成之后将结果传回驱动器(driver)。
图6-5 Spark的工作原理[18]
Spark的运行步骤如下:
(1)构建Spark应用的运行环境,启动SparkContext对象。
(2)SparkContext对象向资源管理器申请进程资源。
(3)进程就绪之后,向SparkContext申请任务。
(4)SparkContext将应用程序分发给进程。
(5)进程执行任务。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。