4.3.1 Spark关键组件

更新于 2026年10月10日 版权声明
4.3.1 Spark关键组件

在第3章,已经简单介绍了Spark。Spark的整个生态系统称为BDAS(Berkeley Data Analysis Stack,伯克利数据分析栈),力图在算法(Algorithms)、机器(Machines)和人(People)三者之间通过大规模集成来展现大数据应用的一个开源平台。Spark框架包含了多种计算组件,从而支持交互式计算、流式计算、机器学习等多种计算模式。

Spark使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合对象一样轻松地操作分布式数据集。Spark具有运行速度快、易用性好、通用性强和随处运行等特点。

Spark生态系统包含了Spark SQL、Spark Streaming、MLlib/ML和GraphX等组件。Spark生态系统以Spark Core为核心,能够读取传统文件(如文本文件)、HDFS、Amazon S3、HyperTable和HBase等数据源,利用Standalone、YARN和Mesos等资源调度管理,完成应用程序分析与处理。正是这个生态系统实现了Spark“One Stack to Rule Them All”(一站式解决平台)目标。

1)Spark Core

Spark Core是整个Spark生态系统的核心,是一个分布式大数据处理框架。Spark Core提供了多种资源调度管理,通过内存计算、有向无环图(DAG)等机制保证分布式计算的快速,并引入了RDD的抽象保证数据的高容错性。其具有如下一些特性:

(1)多种运行模式

Spark Core提供了多种运行模式,不仅可以使用自身运行模式处理任务,如本地模式(Local)、Standalone,而且可以使用第三方资源调度框架来处理任务,如YARN、Mesos等。相比较而言,第三方资源调度框架能够更细粒度地管理资源。

(2)DAG计算框架

Spark Core提供了有向无环图(DAG,Directed Acyclic Graph)的分布式并行计算框架,并提供内存机制来支持多次迭代计算或者数据共享,大大减少迭代计算之间读取数据的开销,这对需要进行多次迭代的数据挖掘和分析性能有极大提升。另外在任务处理过程中移动计算而非移动数据(数据本地性)。

(3)RDD弹性分布式数据集

Spark的核心是建立在统一的抽象弹性分布式数据集RDD之上的,这使得Spark的各个组件可以无缝地进行集成,能够在同一个应用程序中完成大数据处理。可以将RDD理解为一个分布式对象集合,本质上是一个只读的分区记录集合。每个RDD可以分成多个分区,每个分区就是一个数据集片段。一个RDD的不同分区可以保存到集群中的不同结点上,从而可以在集群中的不同结点上进行并行计算。RDD是Spark提供的最重要的抽象概念,它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。

2)Spark SQL

在3.2.4节中,介绍了Spark SQL在大数据交互式计算中的应用。Spark SQL的前身是Shark,Shark发布前,Hive可以说是SQL on Hadoop的唯一选择,负责将SQL编译成可扩展的MapReduce作业,鉴于Hive的性能以及与Spark的兼容,Shark项目由此而生。

Shark即Hive on Spark,本质上是通过Hive的HQL解析,把HQL翻译成Spark上的RDD操作,然后通过Hive的metadata获取数据库里的表信息,物理HDFS上的数据和文件,会由Shark获取并放到Spark上运算。Shark的最大特性就是快以及与Hive的完全兼容,且可以在Shell模式下使用像rdd2sql()这样的API,把HQL得到的结果集,继续放在scala环境下运算,支持自己编写简单的机器学习或简单分析处理函数,对HQL结果进一步分析计算。

在2014年7月1日的Spark Summit上,Databricks宣布终止对Shark的开发,将重点放到Spark SQL上。Databricks表示,Spark SQL将涵盖Shark的所有特性,用户可以从Shark 0.9进行无缝升级。在会议上,Databricks表示,Shark更多是对Hive的改造,替换了Hive的物理执行引擎,因此会有一个很快的速度。然而,不容忽视的是,因为Shark继承了大量的Hive代码,因此也给它的优化和维护带来了大量的麻烦。随着性能优化和先进分析整合的进一步加深,基于MapReduce设计的部分无疑成为了整个项目的瓶颈。因此,为了更好地发展,给用户提供一个更好的体验,Databricks宣布终止Shark项目,从而将更多的精力放到Spark SQL上。(https://www.daowen.com)

Spark SQL允许开发人员直接处理RDD,同时也可查询例如在Apache Hive上存在的外部数据。Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,同时进行更复杂的数据分析。

Spark SQL的特点:

①引入了新的RDD类型SchemaRDD,可以像传统数据库定义表一样来定义SchemaRDD,SchemaRDD由定义了列数据类型的行对象构成。SchemaRDD可以从RDD转换过来,也可以从Parquet文件读入,也可以使用HiveQL从Hive中获取。

②内嵌了Catalyst查询优化框架,在把SQL解析成逻辑执行计划之后,利用Catalyst包里的一些类和接口,执行了一些简单的计划优化,最后变成RDD的计算。

③在应用程序中可以混合使用不同来源的数据,如可以将来自HiveQL的数据和来自SQL的数据进行join操作。

3)Spark Streaming

Spark Streaming是Spark生态中对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如Kdfka、Flume、Twitter、ZeroMQ和TCP套接字)进行类似map、reduce和join等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。

相比其他的处理引擎要么只专注于流处理,要么只负责批处理(仅提供需要外部实现的流处理API接口),而Spark Streaming最大的优势是提供的处理引擎和RDD编程模型可以同时进行批处理与流处理。在后面的小节将单独介绍Spark Streaming流计算框架。

对于传统流处理中一次处理一条记录的方式而言,Spark Streaming使用的是将流数据离散化处理(Discretized Streams)的方式,通过该处理方式能够进行秒级以下的数据批处理。在Spark Streaming处理过程中,Receiver并行接收数据,并将数据缓存至Spark工作节点的内存中。经过延迟优化后,Spark引擎对短任务(几十毫秒)能够进行批处理,并且可将结果输出至其他系统中。传统连续算子模型是静态地将数据分配给一个节点进行计算,而Spark可基于数据的来源以及可用资源情况动态地将数据分配给工作节点。

4)Spark MLlib

Spark MLlib是Spark生态圈专注于机器学习的组件,让机器学习的门槛更低,让一些可能并不了解机器学习的用户也能方便地使用MLlib实现机器学习。Spark MLlib提供了一些常见的机器学习算法和实用程序,包括分类、回归、聚类、协同过滤、降维以及底层优化,同时支持算法的扩充,Spark MLlib将Spark的分布式计算应用到机器学习领域,在后续内容中将进一步介绍Spark MLlib。

5)Spark GraphX

GraphX最先是伯克利AMPLAB的一个分布式图计算框架项目,后来整合到Spark中成为一个核心组件。

在3.3.4中,已经介绍了Spark GraphX,它是Spark中用于图和图并行计算的API,跟其他分布式图计算框架相比,GraphX最大的贡献是,在Spark之上提供一站式数据解决方案,可以方便且高效地完成图计算的一整套流水作业。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)