Spark 大数据计算框架、架构、计算模型和数据管理策略及 Spark 在工业界的应用。围绕 Spark 的 BDAS 项目及其子项目进行了简要介绍。目前,Spark 生态系统已经发展成为一个包含多个子项目的集合,其中包含 SparkSQL、Spark Streaming、GraphX、 MLlib 等子项目,本章只进行简要介绍,后续章节再详细阐述。
1.1 Spark 是什么
Spark 是基于内存计算的大数据并行计算框架。Spark 基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性和高可伸缩性,允许用户将 Spark 部署在大量廉价硬件之上,形成集群。
Spark 于 2009 年诞生于加州大学伯克利分校 AMPLab。目前,已经成为 Apache 软件基金会旗下的顶级开源项目。下面是 Spark 的发展历程。
1.Spark 的历史与发展
2009 年:Spark 诞生于 AMPLab。
2010 年:开源。
2013 年 6 月:Apache 孵化器项目。
2014 年 2 月:Apache 顶级项目。
2014 年 2 月:大数据公司 Cloudera 宣称加大 Spark 框架的投入来取代 MapReduce。
2014 年 4 月:大数据公司 MapR 投入 Spark 阵营,Apache Mahout 放弃 MapReduce,
将使用 Spark 作为计算引擎。
2014 年 5 月:Pivotal Hadoop 集成 Spark 全栈。
2014 年 5 月 30 日:Spark 1.0.0 发布。
2014 年 6 月:Spark 2014 峰会在旧金山召开。
2014 年 7 月:Hive on Spark 项目启动。
目前 AMPLab 和 Databricks 负责整个项目的开发维护,很多公司,如 Yahoo!、Intel 等
参与到 Spark 的开发中,同时很多开源爱好者积极参与 Spark 的更新与维护。
AMPLab 开发以 Spark 为核心的 BDAS 时提出的目标是:one stack to rule them all,也
就是说在一套软件栈内完成各种大数据分析任务。相对于 MapReduce 上的批量计算、迭代型计算以及基于 Hive 的 SQL 查询,Spark 可以带来上百倍的性能提升。目前 Spark 的生态系统日趋完善,Spark SQL 的发布、Hive on Spark 项目的启动以及大量大数据公司对 Spark 全栈的支持,让 Spark 的数据分析范式更加丰富。
2.Spark 之于 Hadoop
更准确地说,Spark 是一个计算框架,而 Hadoop 中包含计算框架 MapReduce 和分布式文件系统 HDFS,Hadoop 更广泛地说还包括在其生态系统上的其他系统,如 Hbase、
Hive 等。
Spark 是 MapReduce 的替代方案,而且兼容 HDFS、Hive 等分布式存储层,可融入
Hadoop 的生态系统,以弥补缺失 MapReduce 的不足。 Spark 相比 Hadoop MapReduce 的优势 如下。
(1)中间结果输出基于 MapReduce 的计算引擎通常会将中间结果输出到磁盘上,进行存储和容错。出于
任务管道承接的考虑,当一些查询翻译到 MapReduce 任务时,往往会产生多个 Stage,而这些串联的 Stage 又依赖于底层文件系统(如 HDFS)来存储每一个 Stage 的输出结果。
Spark 将执行模型抽象为通用的有向无环图执行计划(DAG),这可以将多 Stage 的任务串联或者并行执行,而无须将 Stage 中间结果输出到 HDFS 中。类似的引擎包括 Dryad、
Tez。
(2)数据格式和内存布局由于 MapReduce Schema on Read 处理方式会引起较大的处理开销。Spark 抽象出分布式内存存储结构弹性分布式数据集 RDD,进行数据的存储。RDD 能支持粗粒度写操作,但对于读取操作,RDD 可以精确到每条记录,这使得 RDD 可以用来作为分布式索引。
Spark的特性是能够控制数据在不同节点上的分区,用户可以自定义分区策略,如 Hash 分区等。 Shark 和 Spark SQL 在 Spark 的基础之上实现了列存储和列存储压缩。
(3)执行策略 MapReduce 在数据 Shuffle 之前花费了大量的时间来排序,Spark 则可减轻上述问题带
来的开销。因为 Spark 任务在 Shuffle 中不是所有情景都需要排序,所以支持基于 Hash 的分布式聚合,调度中采用更为通用的任务执行计划图(DAG),每一轮次的输出结果在内存缓存。
(4)任务调度的开销传统的 MapReduce 系统,如 Hadoop,是为了运行长达数小时的批量作业而设计的,在
某些极端情况下,提交一个任务的延迟非常高。
Spark 采用了事件驱动的类库 AKKA 来启动任务,通过线程池复用线程来避免进程或线程启动和切换开销。
3.Spark 能带来什么
Spark 的一站式解决方案有很多的优势,具体如下。(1)打造全栈多计算范式的高效数据流水线
Spark 支持复杂查询。在简单的“ map ”及“ reduce ”操作之外,Spark 还支持 SQL 查询、流式计算、机器学习和图算法。同时,用户可以在同一个工作流中无缝搭配这些计算范式。
(2)轻量级快速处理 Spark 1.0 核心代码只有 4 万行。这是由于 Scala 语言的简洁和丰富的表达力,以及
Spark 充分利用和集成 Hadoop 等其他第三方组件,同时着眼于大数据处理,数据处理速度是至关重要的,Spark 通过将中间结果缓存在内存减少磁盘 I/O 来达到性能的提升。
(3)易于使用,Spark 支持多语言 Spark 支持通过 Scala、Java 及 Python 编写程序,这允许开发者在自己熟悉的语言环境
下进行工作。它自带了 80 多个算子,同时允许在 Shell 中进行交互式计算。用户可以利用 Spark 像书写单机程序一样书写分布式程序,轻松利用 Spark 搭建大数据内存计算平台并充分利用内存计算,实现海量数据的实时处理。
(4)与 HDFS 等存储层兼容 Spark 可以独立运行,除了可以运行在当下的 YARN 等集群管理系统之外,它还可以读取已有的任何 Hadoop 数据。这是个非常大的优势,它可以运行在任何 Hadoop 数据源上,0 Hive、HBase、HDFS 等。这个特性让用户可以轻易迁移已有的持久化层数据。(5)社区活跃度高
Spark 起源于 2009 年,当下已有超过 50 个机构、260 个工程师贡献过代码。开源系统的发展不应只看一时之快,更重要的是支持一个活跃的社区和强大的生态系统。
同时我们也应该看到 Spark 并不是完美的,RDD 模型适合的是粗粒度的全局数据并行计算。不适合细粒度的、需要异步更新的计算。对于一些计算需求,如果要针对特定工作负载达到最优性能,还是需要使用一些其他的大数据系统。例如,图计算领域的 GraphLab 在特定计算负载性能上优于 GraphX,流计算中的 Storm 在实时性要求很高的场合要比
Spark Streaming 更胜一筹。
随着 Spark 发展势头日趋迅猛,它已被广泛应用于 Yahoo!、Twitter、阿里巴巴、百度、网易、英特尔等各大公司的生产环境中。