vlambda博客
学习文章列表

「大数据」(七十)Spark之生态系统

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[70]篇文章,欢迎阅读和收藏】

1 基本概念

Spark 生态圈以 Spark Core 为核心,从 HDFS 、 Amazon S3 和 HBase 等持久层读取数据,以 MESS 、 YARN 和自身携带的 Standalone 为资源管理器调度 Job 完成 Spark 应用程序的计算。这些应用程序可以来自于不同的组件,如 Spark Shell/Spark Submit 的批处理、 Spark Streaming 的实时处理应用、 Spark SQL 的即席查询、 BlinkDB 的权衡查询、 MLlib/MLbase 的机器学习、 GraphX 的图处理和 SparkR 的数学计算等等。


2 术语解释

HDFS :Hadoop Distributed File System , Hadoop 分布式文件系统, HDFS 有着高 容错性 ( fault-tolerant )的特点,并且设计用来部署在低廉的( low-cost )硬件上。而且它提供高吞吐量( high throughput )来访问应用程序的数据,适合那些有着超大数据集( large data set )的应用程序。HDFS 放宽了( relax ) POSIX 的要求( requirements )这样可以实现流的形式访问( streaming access )文件系统中的数据。

HBase: Hadoop Database, 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable :一个结构化数据的 分布式存储系统 ” 。HBase 是 Apache 的 Hadoop 项目的子项目。HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是 HBase 基于列的而不是基于行的模式。

3 生态系统组件

3.1 Spark Core

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

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


3.2 Spark Streaming

Spark Streaming 是一个对实时数据流进行高吞吐、高容错的流式处理系统,可以对多种数据源(如 Kafka 、 Flume 、 Twitter 和 ZeroMQ 等)进行类似 Map 、 Reduce 和 Join 等复杂操作,并将结果保存到外部文件系统、数据库或应用到实时仪表盘。

计算流程:Spark Streaming 是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是 Spark Core ,也就是把 Spark Streaming 的输入数据按照 batch size (如 1 秒)分成一段一段的数据( Discretized Stream ),每一段数据都转换成 Spark 中的 RDD ( Resilient Distributed Dataset ),然后将 Spark Streaming 中对 DStream 的 Transformation 操作变为针对 Spark 中对 RDD 的 Transformation 操作,将 RDD 经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加或者存储到外部设备。

容错性:对于流式计算来说,容错性至关重要。首先我们要明确一下 Spark 中 RDD 的容错机制。每一个 RDD 都是一个不可变的分布式可重算的数据集,其记录着确定性的操作继承关系( lineage ),所以只要输入数据是可容错的,那么任意一个 RDD 的分区( Partition )出错或不可用,都是可以利用原始输入数据通过转换操作而重新算出的。

实时性:对于实时性的讨论,会牵涉到流式处理框架的应用场景。Spark Streaming 将流式计算分解成多个 Spark Job ,对于每一段数据的处理都会经过 Spark DAG 图分解以及 Spark 的任务集的调度过程。对于目前版本的 Spark Streaming 而言,其最小的 Batch Size 的选取在 0.5~2 秒钟之间( Storm 目前最小的延迟是 100ms 左右),所以 Spark Streaming 能够满足除对实时性要求非常高(如高频实时交易)之外的所有流式准实时计算场景。

扩展性与吞吐量:Spark 目前在 EC2 上已能够线性扩展到 100 个节点(每个节点 4Core ),可以以数秒的延迟处理 6GB/s 的数据量( 60M records/s ),其吞吐量也比流行的 Storm 高 2 ~ 5 倍 。

3.3 Spark SQL

Spark SQL 的前身是 Shark ,它发布时 Hive 可以说是 SQL on Hadoop 的唯一选择( Hive 负责将 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 表示, Shark 更多是对 Hive 的改造,替换了 Hive 的物理执行引擎,使之有一个较快的处理速度。然而,不容忽视的是, Shark 继承了大量的 Hive 代码,因此给优化和维护带来大量的麻烦。随着性能优化和先进分析整合的进一步加深,基于 MapReduce 设计的部分无疑成为了整个项目的瓶颈。因此,为了更好的发展,给用户提供一个更好的体验, Databricks 宣布终止 Shark 项目,从而将更多的精力放到 Spark SQL 上。

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

Spark SQL 的特点如下。

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

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

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

Shark 的出现使得 SQL-on-Hadoop 的性能比 Hive 有了 10 ~ 100 倍的提高,那么,摆脱了 Hive 的限制, Spark SQL 的性能又有怎么样的表现呢?虽然没有 Shark 相对于 Hive 那样瞩目的 性能提升,但也表现得优异。

为什么 Spark SQL 的性能会得到这么大的提升呢?主要是 Spark SQL 在以下几点做了优化。

内存列存储( In-Memory Columnar Storage ):Spark SQL 的表数据在内存中存储不是采用原生态的 JVM 对象存储方式,而是采用内存列存储。

字节码生成技术( Bytecode Generation ):Spark 1.1.0 在 Catalyst 模块的 Expressions增加了 Codegen 模块,使用动态字节码生成技术,对匹配的表达式采用特定的代码动态编译。另外对 SQL 表达式都做了 CG 优化。CG 优化的实现主要还是依靠 Scala 2.10 运行时的反射机制( Runtime Reflection )。

Scala 代码优化:Spark SQL 在使用 Scala 编写代码的时候,尽量避免低效的、容易 GC 的代码;尽管增加了编写代码的难度,但对于用户来说接口统一。