Spark 教程

Spark SQL

Spark 笔记

Spark MLlib

Spark 简介


Apache Spark 是一个开源集群运算框架,最初是由加州大学伯克利分校 AMP 实验室(Algorithms、Machines and People Lab)所开发。相对于 Hadoop 的 MapReduce 会在运行完工作后将中间数据存放到磁盘中,Spark 使用了存储器内存运算技术,能在数据尚未写入硬盘时即在存储器内分析运算。Spark 在存储器内运行程序的运算速度能做到比 Hadoop MapReduce 的运算速度快上100倍,即便是运行程序于硬盘时,Spark 也能快上10倍速度。Spark 允许用户将数据加载至集群存储器,并多次对其进行查询,非常适合用于机器学习算法。

使用 Spark 需要搭配集群管理员和分布式存储系统。Spark 支持独立模式(本地 Spark 集群)、Hadoop YARN 或 Apache Mesos 的集群管理。在分布式存储方面,Spark 可以和 HDFS、Cassandra、OpenStack Swift 和 Amazon S3 等接口搭载。 Spark 也支持伪分布式(pseudo-distributed)本地模式,不过通常只用于开发或测试时以本机文件系统取代分布式存储系统。在这样的情况下,Spark 仅在一台机器上使用每个 CPU 核心运行程序。

Spark 特点

运行速度快

Spark 的中文意思是“电光火石”,Spark 确实如此!官方提供的数据表明,如果数据由磁盘读取,速度是 Hadoop MapReduce 的 10 倍以上,如果数据从内存中读取,速度可以高达 100 多倍。

Spark 相对于 Hadoop 有如此快的计算速度有数据本地性、调度优化和传输优化等原因,其中最主要的原因是基于内存计算引入 DAG 执行引擎

  1. Spark 默认情况下迭代过程的数据保存到内存中,后续的运行作业利用这些结果进行计算,而 Hadoop 每次计算结果都直接存储到磁盘中,在随后的计算中需要从磁盘中读取上次计算的结果。由于从内存读取数据时间比磁盘读取时间低两个数量级,这就造成了 Hadoop 的运行速度较慢,这种情况在迭代计算中尤为明显。
  2. 由于较复杂的数据计算任务需要多个步骤才能实现,且步骤之间具有依赖性。对于这些步骤之间,Hadoop 需要借助 Oozie 等工具进行处理。而 Spark 在执行任务前,可以将这些步骤根据依赖关系形成 DAG 图(有向无环图),任务执行可以按图索骥,不需要人工干预,从而优化了计算路径,大大减少了 IO 读取操作。

易用性好

Spark 不仅支持 Scala 编写应用程序,而且支持 Java、Python 和 R 等语言进行编写。Scala 是一种高效、可拓展的语言,能够用简洁的代码处理较为复杂的处理工作。

通用性强

Spark 生态圈即 BDAS(伯克利数据分析栈)所包含的组件:Spark Core 提供内存计算框架、Spark Streaming 的实时处理应用、Spark SQL 的即时查询、MLlib 的机器学习和 GraphX 的图处理,它们都是由 AMP 实验室提供,能够无缝地集成,并提供一站式解决平台。

随处运行

Spark 具有很强的适应性,能够读取 HDFS、Cassandra、HBase、S3 和 Tachyon,为持久层读写原生数据,能够以 Mesos、YARN 和自身携带的 Standalone 作为资源管理器调度作业来完成 Spark 应用程序的计算;此外,Spark 集群可扩展至超过8000个结点。

Spark 历史

对于一个具有相当技术门槛与复杂度的平台,Spark 从诞生到正式版本的成熟,经历的时间如此之短,让人感到惊诧。

  • 2009年,由 Matei Zaharia 在加州大学伯克利分校 AMPLab 开创 Spark;
  • 2010年,透过 BSD 许可协议开源发布;
  • 2013年,该项目被捐赠给 Apache 软件基金会并切换许可协议至 Apache 2.0;
  • 2014年2月,Spark 成为 Apache 的顶级项目;
  • 2014年5月30日,Spark 1.0.0发布;

    增加了 Spark SQL,并对 MLlib、GraphX 和 Spark Streaming 都增加了新特性和优化。Spark 核心引擎还增加了对安全 YARN 集群的支持;

  • 2015年3月13日,Spark 1.3.0发布;

    该版本发布的最大亮点是新引入的 DataFrame API,对于结构型的 DataSet,它提供了更方便更强大的操作运算。除了引入 DataFrame 之外,还值得关注的一点是 Spark SQL成为了正式版本,这意味着它将更加的稳定,更加的全面;

  • 2015年6月11日,Spark 1.4.0发布;

    该版本将 R API 引入 Spark,同时提升了 Spark 的核心引擎和 MLlib,以及 Spark Streaming 的可用性;

  • 2015年9月9日,Spark 1.5.0发布;

    Spark 1.5.0 是 1.x 线上的第6个发行版。这个版本共处理了来自230多个贡献者及80多个机构贡献了1400多个补丁程序。 Spark 1.5的许多改变都是围绕在提升 Spark 的性能、可用性以及操作稳定性。 Spark 1.5.0 焦点在 Tungsten 项目,它主要是通过对低层次的组建进行优化从而提升 Spark 的性能。 Spark 1.5 版本为 Streaming 增加了 operational 特性,比如支持 backpressure。另外比较重要的更新就是新增加了一些机器学习算法和工具,并扩展了Spark R 的相关 API;

  • 2016年1月4日,Spark 1.6.0发布;

    该版本包含了超过1000个 patches,在这里主要展示三个方面的主题,新的 Dataset API,性能提升(读取 Parquet 50%的性能提升,自动内存管理,streaming state management 十倍的性能提升),以及大量新的机器学习和统计分析算法。在 Spark 1.3.0引入 DataFrame,它可以提供 high-level functions 让 Spark 更好的处理数据结构和计算。这让 Catalyst optimizer 和 Tungsten execution engine 自动加速大数据分析。发布 DataFrame 之后开发者收到了很多反馈,其中一个主要的是大家反映缺乏编译时类型安全。为了解决这个问题,Spark 采用新的 Dataset API(DataFrame API 的类型扩展)。Dataset API 扩展 DataFrame API 支持静态类型和运行已经存在的 Scala 或 Java 语言的用户自定义函数。对比传统的 RDD API,Dataset API 提供更好的内存管理,特别是在长任务中有更好的性能提升;

  • 2016年7月26日,Spark 2.0.0发布;

    该版本主要更新 APIs,支持 SQL 2003,支持 R UDF,增强其性能。300个开发者贡献了2500补丁程序;

  • 2016年12月28日,Spark 2.1.0发布;

    这是2.x版本线的第二个发行版。此发行版在为 Structured Streaming 进入生产环境做出了重大突破,Structured Streaming 现在支持了 event time watermarks 了,并且支持 Kafka 0.10。此外,此版本更侧重于可用性,稳定性和优雅性,并解决了1200多个 tickets;

  • 2017年7月11日,Spark 2.2.0发布;

    这也是2.x系列的第三个版本。此版本移除了 Structured Streaming 的实验标记(experimental tag),意味着已可以放心在线上使用;该版本的主要更新内容主要针对的是系统的可用性、稳定性;

  • 2018年2月28日,Spark 2.3.0发布;

    这也是2.x系列中的第四个版本。此版本增加了对 Structured Streaming 中的 Continuous Processing 以及全新的 Kubernetes Scheduler 后端的支持。其他主要更新包括新的 DataSource 和 Structured Streaming v2 API,以及一些 PySpark 性能增强。此外,此版本继续针对项目的可用性、稳定性进行改进。

Spark 组成

Spark 由核心引擎及不同的包组成。

Spark Core

Spark 核心是整个项目的基础,提供了分布式任务调度,调度和基本的 IO 功能。而其基础的程序抽象则称为弹性分布式数据集(RDDs),是一个可以并行操作、有容错机制的数据集合。RDDs 可以透过引用外部存储系统的数据集创建(例如:共享文件系统、HDFS、HBase 或其他 Hadoop 数据格式的数据源),或者是透过在现有 RDDs 的转换而创建(比如:map、filter、reduce、join 等等)。 RDD 抽象化是经由一个以 Scala,Java,Python 等语言集成 API 所呈现,简化了编程复杂性,应用程序操纵 RDDs 的方法类似于操纵本地端的数据集合。

Spark SQL

Spark SQL 在 Spark 核心上带出一种名为 SchemaRDD 的数据抽象化概念,提供结构化和半结构化数据相关的支持。Spark SQL 提供了领域特定语言,可使用 Scala、Java 或 Python 来操纵 SchemaRDDs。它还支持使用使用命令行界面和 ODBC/JDBC 服务器操作 SQL 语言。在 Spark 1.3版本,SchemaRDD 被重命名为 DataFrame。

Spark Streaming

Spark Streaming 充分利用 Spark 核心的快速调度能力来运行流分析。它截取小批量的数据并对之运行 RDD 转换。这种设计使流分析可在同一个引擎内使用同一组为批量分析编写而撰写的应用程序代码。

Spark MLlib

Spark MLlib 是 Spark 上分布式机器学习框架。Spark 分布式存储器式的架构比 Hadoop 磁盘式的 Apache Mahout 快上10倍,扩展性甚至比 Vowpal Wabbit 要好。MLlib 可使用许多常见的机器学习和统计算法,简化大规模机器学习时间,其中包括:

  • 汇总统计、相关性、分层抽样、假设检定、随机数据生成;
  • 分类与回归:支持向量机、回归、线性回归、逻辑回归、决策树、朴素贝叶斯;
  • 协同过滤:ALS;
  • 分群:k-平均算法维度约减:奇异值分解(SVD),主成分分析(PCA);
  • 特征提取和转换:TF-IDF、Word2Vec、StandardScaler;
  • 最优化:随机梯度下降法(SGD)、L-BFGS

Spark GraphX

Spark GraphX 是 Spark 上的分布式图形处理框架。它提供了一组 API,可用于表达图表计算并可以模拟 Pregel 抽象化。GraphX 还对这种抽象化提供了优化运行。GraphX 最初为加州大学伯克利分校 AMPLab 和 Databricks 的研究项目,后来捐赠给 Spark 项目。

Spark 和 Hadoop

Spark 是一个计算框架,而 Hadoop 中包含计算框架 MR 和分布式文件存储系统 HDFS 以及资源调度系统 YARN。Hadoop 还包括在其生态系统上的其他系统,如 HBase、Hive 等。

  • Hadoop 有两个核心模块,分布式存储模块 HDFS 和分布式计算模块 MapReduce;
  • Spark 本身并没有提供分布式文件系统,因此 Spark 的分析大多依赖于 Hadoop 的分布式文件系统 HDFS;
  • Hadoop 的 MapReduce 与 Spark 都可以进行数据计算,而相比于 MapReduce,Spark 的速度更快并且提供的功能更加丰富。

Spark 和 MapReduce 比较

Spark 是通过借鉴 Hadoop MapReduce 发展而来的,继承了其分布式并行计算的优点,并改进了 MapReduce 明显的缺陷,有具体体现在以下几个方面。

  1. Spark 把中间数据放在内存中,迭代运算效率高。MapReduce 中的计算结果是保存在磁盘上,这样势必会影响整体的运行速度,而 Spark 支持 DAG 图的分布式并行计算的编程框架,减少了迭代过程中数据的落地,提高了处理效率。
  2. Spark 的容错性高。Spark 引进了弹性分布式数据集(Resilient Distributed Dataset,RDD)的概念,它是分布在一组节点中的只读对象集合,这些集合是弹性的,如果数据集一部分丢失,则可以根据“血统”(即允许基于数据衍生过程)对它们进行重建。另外,在 RDD 计算时可以通过 CheckPoint 来实现容错,而 CheckPoint 有两种方式,即 CheckPoint Data 和 Logging The Updates,用户可以控制采用哪种方式来实现容错。
  3. Spark 更加通用。不像 Hadoop 只提供了 Map 和 Reduce 两种操作,Spark 提供的数据集操作类型有很多种,大致分为转换操作行动操作两大类。转换操作包括 Map、Filter、FlatMap、 Sample、GroupByKey、ReduceByKey、Union、Join、Cogroup、MapValues、Sort 和 PartionBy 等多种操作类型,行动操作包括 Collect、Reduce、Lookup 和 Save 等操作类型。另外,各个处 理节点之间的通信模型不再像 Hadoop 只有 Shuffle 一种模式,用户可以命名、物化,控制中间结果的存储、分区等。