一、Spark Introduction(Spark 简介)

设想一个场景:每个人都用过 QQ,它会不定期地给你推荐一些你可能认识的人。那么,这些数据是从哪里来的呢?实际上,它是通过分析每个人的好友列表数据得出的。一个人的好友列表数据量非常庞大,光是存储就是一个问题,更不用说数据处理了。这时,我们就可以有效地利用 MapReduce 来处理这些数据,但 MapReduce 只适合批处理。Spark 则能够克服这一复杂问题。对于 Spark,将学习以下内容:

  • Spark Background(Spark 背景)
  • Spark Definition(Spark 定义)
  • Spark History & Significance(Spark 历史与意义)
  • Stream-Oriented Computation(面向流的计算)

1、Spark Background(Spark 背景)

随着越来越多的数据被收集并存储在存储层,下一步就是对这些数据进行处理。虽然 MapReduce 适用于大多数批处理工作,并在大数据时代成为企业进行大数据处理的首选技术,但它的局限性也促使了 Spark 的发展。可以说,MapReduce 赋予了 Spark 其发展的背景:

  • 编程:MapReduce 仅提供 Map 和 Reduce 两种方法来处理数据,而 Spark 提供了 80 多种方法。
  • 任务级别:在 MapReduce 中,每个 Map 任务和 Reduce 任务都是一个独立的进程,启动和关闭都需要花费大量时间。而 Spark 的任务是基于线程的,每个执行器(executor)内部都有线程池。
  • 资源申请:在 MapReduce 中,每个作业(Job)的 Map 任务和 Reduce 任务都需要单独申请资源,重复申请资源非常耗时。而在 Spark 中,无论一个应用(Application)有多少个作业,只需要申请一次资源。
  • IO:MapReduce 以磁盘为基础,而 Spark 以内存为基础,这就导致了 IO 处理上的差异。
  • 排序:在 MapReduce 的执行过程中,排序是一项代价高昂的操作。但有些业务并不需要排序。为了避免不必要的排序,Spark 可以开启旁路(bypass)机制。
  • 迭代处理:MapReduce 的迭代处理是基于磁盘的;每个作业完成后都会将数据写入磁盘,后续作业需要从磁盘读取并处理文件,并且还需要程序员手动干预来衔接作业(请忽略 Hive SQL 中一个语句触发多个作业的情况)。而 Spark 的迭代处理是基于内存的,作业之间可以在内存中串行执行,一个作业完成后,下一个作业即可开始。

2、Spark Definition(Spark 定义)

Spark 由加州大学伯克利分校 AMP 实验室(Algorithms, Machines and People Lab)于 2009 年开发,它是一种快速的集群计算技术,用于构建大规模、低延迟的数据分析应用。在诞生之初,Spark 只是一个研究项目,许多核心思想都来源于学术研究论文。到 2013 年,Spark 发展成了一个庞大的开发者社区,并正式加入 Apache 软件基金会。

作为一个大数据计算平台,Spark 拥有非常高效的处理能力。在速度方面,Spark 扩展了被广泛使用的 MapReduce 计算模型,并有效支持更多的计算模式,包括交互式查询和流式处理。在处理海量数据时,速度至关重要。总体而言,Spark 适用于各种分布式平台,是一个更快、更高效的大数据计算平台。

Spark 提供的接口非常丰富。除了基于 Python、Java、Scala 和 SQL 的易用 API 以及内置的丰富库之外,Spark 还能与其他大数据工具紧密协作。Spark 项目包含若干紧密集成的组件。在其核心,Spark 拥有一个计算引擎,负责调度、分发和监控应用程序,这些应用由运行在多台工作机器或单个计算集群上的大量计算任务组成。

Spark 具有以下关键特性:

  • 速度:Spark 使用先进的 DAG(有向无环图)执行引擎来支持循环数据流和内存计算。在内存中执行的速度比 Hadoop MapReduce 快一百倍,在磁盘上执行也快十倍。
  • 易用性:Spark 支持 Scala、Java、Python 和 R 编程,简洁的 API 设计使用户能够轻松构建并行程序,并且可以通过 Spark Shell 进行交互式编程。
  • 完整技术栈:Spark 提供了完整而强大的技术栈,包括 SQL 查询、流式计算、机器学习和图计算等组件,这些都可以无缝集成到单个应用中,足以应对复杂的计算需求。
  • 多样化模式:Spark 可以运行在独立集群模式下,也可以运行在 Hadoop 环境中,还能运行在云环境(如 Amazon EC2)中,并可访问多种数据源,如 HDFS、Cassandra、HBase、Hive 等。

目前,Spark 已经引起国内外大型企业的关注,如腾讯、淘宝、百度、亚马逊等公司都已经使用 Spark 来构建大数据分析应用,并应用在实际生产环境中。可以预见,未来 Spark 将在更广泛的应用场景中发挥重要作用。

3、Spark History & Significance(Spark 历史与意义)

  • 2009 年,Spark 由伯克利大学 AMP 实验室作为一个研究项目开发。
  • 2010 年,Spark 正式以开源形式发布,采用 BSD(伯克利软件发行)许可证。
  • 2012 年,简化了 Standalone 部署模式,并发布了第一个 Standalone 应用(Spark 0.6.0)。这一年进行了大幅性能改进,增加了新功能,同时简化了 Standalone 部署模式。
  • 2013 年,Spark 成为 Apache 基金会项目;发布了 Spark Streaming、Spark MLlib(机器学习)和 Shark(基于 Hadoop 的 Spark)。
  • 2014 年,Spark 成为 Apache 顶级项目;5 月底发布 Spark 1.0.0;同年发布 Spark GraphX(图计算)以及 Spark SQL(取代 Shark)。
  • 2015 年,推出 DataFrame(大数据分析);自此,Spark 在国内 IT 行业越来越受欢迎,众多公司开始关注 Spark 的部署或使用,并逐步替代传统的大数据计算框架,如 MapReduce、Hive 和 Storm。
  • 2016 年,推出 Dataset API(新的数据集 API),带来了性能改进,以及大量新的机器学习和统计分析算法。
  • 2017 年,发布 Structured Streaming。
  • 2018 年,发布 Spark 2.4.0,使其成为全球最大的开源项目。

zcfe1qJJ-1.png

Spark 基于内存计算,允许将中间输出和结果存储在内存中,从而消除与 HDFS 交互时的 I/O 开销。其 DAG(有向无环图)引擎也支持在内存中存储中间结果和最终结果,因此 Spark 处理海量数据的能力比 Hadoop 快 10 到 100 倍。而且,Spark 使用起来非常方便,能够满足各种用户需求。

4、Streaming-Oriented Computation(面向流的计算)

面向流的计算是一种特殊的增量计算模型。它利用分布式的思想和方法对海量“流式”数据进行实时处理,这一模型来源于业务中基于“时间价值”对海量数据进行挖掘的需求。因此,它需要以相同的方式进行实例化。

从整体上看,数据可以分为静态数据和流式数据,对应着两种不同的计算模式:batch computing(批处理)real-time computing(实时计算)。批处理以“静态数据”为对象,可以在充足的时间内对海量数据进行处理,从而获得有价值的信息。Hadoop 就是典型的批处理模型,其中 HDFS 和 HBase 存储大量静态数据,而 MapReduce 则对海量数据执行批量计算。
流式数据则必须实时计算。实时计算最重要的要求之一就是能够实时获得计算结果,通常需要秒级的响应时间。当处理的数据量较小时,实现实时计算并不困难;然而,在大数据时代,不仅数据格式复杂、来源广泛,而且数据量庞大,这对实时计算提出了巨大挑战,因此,实时计算应运而生。

总体来说,流式计算坚持的基本理念是:数据的价值会随着时间的推移而降低。因此,当事件发生时,应立即进行处理,而不是缓存起来等待批量处理。要及时处理流式数据,需要一个低延迟、可扩展且高可靠性的处理引擎。一个流式计算系统应满足以下要求:

  • 高性能:这是处理大数据的基本要求,系统必须能够每秒处理数十万条数据。
  • 大规模:支持 TB 甚至 PB 级的数据规模。
  • 实时性:必须保证低延迟,达到秒级甚至毫秒级。
  • 分布式:作为支持大数据的基本架构,必须能够平滑扩展。
  • 易用性:能够快速开发和部署。
  • 可靠性:具备稳定可靠地处理流式数据的能力。

流式计算包括三个环节:实时数据采集、实时数据处理和实时查询服务

  • 实时数据采集:在实时采集阶段,通常需要从多个数据源收集海量数据,并确保其实时性、低延迟、稳定性和可靠性。以日志数据为例,由于分布式集群的广泛应用,数据分布在不同的机器上,因此需要将来自不同机器的日志数据实时汇总。目前,各大互联网公司都推出了多个开源的分布式日志处理系统,如 Facebook 的 Scribe、LinkedIn 的 Kafka、淘宝的 TimeTunnel 以及基于 Hadoop 的 Chukwa 和 Flume,这些系统都可以以每秒数百 MB 的速率进行数据处理和传输。
  • 实时数据处理:流式处理系统从数据采集系统中接收实时数据,进行实时分析和计算,并将实时结果反馈出去。
  • 实时查询服务:流式计算的第三个阶段是实时查询服务,用户可以实时访问流式计算框架的结果,用于查询、展示或存储。

zcfe1qJJ-2.png

二、Spark Ecosphere(Spark 生态圈)

Spark 生态系统(Spark Ecosystem),也称为 BDAS(Berkeley Data Analytics Stack,伯克利数据分析栈),是由伯克利大学 AMP 实验室创建的平台,通过在算法(Algorithms)、机器(Machines)和人(People)之间的深度整合来展示大数据应用。伯克利 AMP 实验室利用大数据、云计算和通信等多种资源,以及灵活的技术解决方案,将海量而复杂的数据筛选和解析为有用信息,帮助人们更好地理解世界。该生态系统涵盖了机器学习、数据挖掘、数据库、信息检索、自然语言处理和语音识别等能力。

Spark 生态系统以 Spark Core 为基础,从 HDFS、Amazon S3 和 HBase 等持久化存储层读取数据,并为 Spark 应用进行计算,作业调度则由资源管理器在 MESOS、YARN 以及 Spark 自身的 Standalone 模式 上完成。这些应用可以来自不同的组件,例如:

  • Spark Shell / Spark Submit — 批处理应用
  • Spark Streaming —— 实时处理应用
  • Spark SQL — 即席(Ad hoc)查询
  • BlinkDB — 权衡型查询(近似查询)
  • MLlib / MLbase — 机器学习
  • GraphX — 图计算
  • SparkR — 数学计算

zcfe1qJJ-3.png

1、Spark Architecture(Spark 架构)

Spark 的运行架构包括一个 集群资源管理器(Cluster Manager)、用于执行作业任务的 工作节点(Worker Node)、每个应用的 任务控制节点(Driver),以及负责在每个工作节点上执行具体任务的 执行进程(Executor)。其中,集群资源管理器可以是 Spark 自带的资源管理器,也可以是 YARN 或 Mesos 等资源管理框架。

与 Hadoop MapReduce 计算框架相比,Spark 使用的 Executor 有两个优势:

  • Executor 使用多线程执行具体任务,从而减少任务启动开销。
  • Executor 内部有一个 BlockManager 存储模块,同时使用内存和磁盘作为存储设备。当需要多轮迭代计算时,中间结果可以存储在该存储模块中。下次需要数据时,可以直接从存储模块读取数据,而无需再读写 HDFS 等文件系统,从而有效降低 I/O 开销;或者在交互式查询场景中,可以将表预先缓存到存储系统中,提高读写 I/O 性能。

Spark 遵循主从架构。其集群由一个 Master 和多个从节点(Slave)组成:

  • Driver Program(驱动程序):驱动程序是 Spark 应用程序的主控,负责将用户代码转换为阶段和任务的有向无环图(DAG),并进行任务调度,将任务分发到集群中。
  • Cluster Manager(集群管理器):集群管理器负责在整个集群中分配资源。Spark 支持多种类型的集群管理器。
  • Worker Node(工作节点):工作节点是从节点,其作用是在集群中运行应用程序代码。

zcfe1qJJ-4.png

2、Spark Components(Spark 组件)

Spark 框架包含若干紧密集成的组件。底层是 Spark Core,它实现了作业调度、内存管理、容错以及与存储系统交互等基本功能,并为弹性分布式数据集(RDD)提供丰富的操作。在 Spark Core 的基础上,Spark 提供了一系列满足不同应用需求的组件,包括 Spark SQL、Spark Streaming、MLlib、GraphX

Spark SQL

Spark SQL 是 Spark 用于操作结构化数据的组件。使用 Spark SQL,用户可以通过 SQL 或 Apache Hive 的 SQL 方言(HQL)查询数据。Spark SQL 支持多种数据源类型,如 Hive 表、Parquet 和 JSON。它不仅为 Spark 提供了 SQL 接口,还使开发者能够将 SQL 语句集成到 Spark 应用开发中,让用户在单个应用中执行 SQL 查询和复杂数据分析,无论使用 Python、Java 还是 Scala。由于与 Spark 提供的丰富计算环境紧密集成,Spark SQL 在开源数据仓库工具中脱颖而出。Spark SQL 首次随 Spark 1.0 引入。在 Spark SQL 出现之前,加州大学伯克利分校尝试修改 Apache Hive 以在 Spark 上运行,开发了 Shark 组件。然而,随着 Spark SQL 的引入和发展,它与 Spark 引擎及 API 的集成更紧密,使 Shark 被 Spark SQL 取代。

Spark Streaming

许多应用领域对流式实时数据有强烈需求,例如网络环境中的 Web 服务器日志,或由用户提交状态更新组成的消息队列,这些都是实时数据流。Spark Streaming 是 Spark 平台上的流式实时数据处理组件,提供了丰富的 API 用于处理数据流。由于这些 API 对应于 Spark Core 的基本操作,一旦开发者熟悉了 Spark Core 的概念和编程方法,就能更轻松地编写 Spark Streaming 应用。从底层设计来看,Spark Streaming 在容错、吞吐量和可扩展性方面与 Spark Core 保持一致。

MLlib

MLlib 是 Spark 提供的机器学习算法库,包含多种经典和常用的机器学习算法,包括分类、回归、聚类、协同过滤等。MLlib 不仅提供模型评估、数据导入等附加功能,还提供一些底层机器学习原语,包括通用的梯度下降优化基础算法。这些方法都被设计为能够在集群上轻松扩展的架构。

GraphX

GraphX 是 Spark 的图计算框架和库。GraphX 提出了弹性分布式属性图(elastic distributed property graph)的概念,并在此基础上实现了图视图与表视图的有机结合与统一。同时,它提供了丰富的图数据处理操作,如子图操作(subgraph)、顶点属性映射操作(mapVertices)、边映射操作(mapEdges)等。GraphX 还实现了与 Pregel 的结合,使用户可以直接使用常用图算法,如 PageRank、三角形计数等。

这些 Spark 核心组件以 jar 包的形式呈现给用户,避免了复杂繁琐的学习、部署、维护和测试等工作,这与 Hive on MapReduce、Mahout、Pig 等组件不同。用户只需完成 Spark 平台的配置,即可直接使用这些组件,从而节省大量系统开发和运维成本。这些组件共同构成了 Spark 软件栈(Spark Stack)。基于这一软件栈,Spark 提出了并实现了一个大数据处理理念——“One Stack to rule them all”(一套堆栈掌控一切)。换句话说,Spark 可以同时进行批处理、流处理和大数据查询。

三、Advantages and Disadvantages of Spark(Spark 的优缺点)

MapReduce 大大简化了大数据分析,但随着大数据需求和使用模式的不断扩展,用户的需求也越来越复杂:

  • 更复杂的处理需求,例如迭代计算、机器学习(ML)和图计算;
  • 低延迟的交互式查询需求,例如即席查询(ad-hoc query)。

MapReduce 计算模型的架构导致这两类应用固有的低效,用户迫切需要一种更快的计算模型来解决 MapReduce 的固有限制。

1、Advantages(优点)

使用 Spark 代替 Hadoop MapReduce 的主要原因是 速度。借助内存计算和先进的 DAG 调度等机制,Spark 能够更快地处理相同的数据集。

Spark 的另一个重要优势是 多样性。Spark 可以作为独立集群部署,也可以与现有的 Hadoop 集群集成,既能运行批处理,也能运行流处理,并且一个集群可以处理不同类型的任务。

除了引擎本身的能力外,Spark 周围还建立了广泛的生态库,以更好地支持机器学习和交互式查询等任务。与 MapReduce 相比,Spark 任务更容易编写,从而显著提高了生产力。

流处理系统采用批处理方法,这需要对进入系统的数据进行缓冲。缓冲使该技术能够处理非常大量的输入数据,从而提高整体吞吐量,但等待缓冲清空也会导致更高的延迟。这意味着 Spark Streaming 可能不适合对低延迟有严格要求的工作负载。

2、Disadvantages(缺点)

由于内存通常比磁盘空间更昂贵,Spark 的成本高于基于磁盘的系统。然而,这种速度提升使任务能够更快完成,在按小时计费的资源环境中通常可以抵消更高的成本。

Spark 内存计算设计的另一个后果是,如果在共享集群中部署,可能会遇到资源问题。Spark 比 Hadoop MapReduce 更加消耗资源,可能会影响同时需要使用该集群的其他任务。从本质上讲,Spark 与 Hadoop 栈中的其他组件共存的适应性更差。

四、Spark VS Hadoop

1、Comparison(比较)

Hadoop 和 Apache Spark 都是大数据框架,但它们的存在目的不同:

  • Hadoop 以存储为重点,是一个分布式文件系统(HDFS)——将数据存储到磁盘,同时也具有数据处理能力。其 MapReduce 只能分步骤处理数据。
  • Spark 以数据计算(处理)为重点——既可以进行批处理,也可以与 Hadoop 等文件存储系统结合使用,但并不必须依赖 Hadoop,因为两者结合效果最佳。
  • 在数据处理速度方面,Hadoop 的 MapReduce 是逐步处理的,每次读取数据只能处理一次,无法像 Spark 那样进行批量处理,因此通常选择 Spark。
  • 在数据恢复方面,由于 Hadoop 的 HDFS 需要将数据存储在磁盘上,恢复相对顺利;而 Spark 的数据对象(而非原始数据)通常可以存储在磁盘或内存中,但安全性不如 Hadoop,因此在数据恢复时需要注意。

2、Distinction(区别)

Hadoop 在进行大规模数据分析时,MapReduce 经常出现性能瓶颈,I/O 操作多,计算时间被拉长。由于这种设计的影响,在计算过程中无法进行迭代计算,并导致网络节点间的数据传输。

Spark 在概念上进行了改变。它利用 Scala 的特性解决上述核心问题,提高了处理速度。Spark 基于内存实现,效率远高于磁盘访问。但 Spark 并不能完全依赖内存(不能将所有待处理数据都放入内存),部分数据仍需落盘。部分数据存储在内存中进行计算,中间结果部分滞留在内存中,直接放在内存中,使用 Val 静态常量,并以新的 RDD 形式存在,从而可以实现迭代计算。

如果基于内存,Spark 的性能比 Hadoop 高 100 倍;如果基于磁盘,性能也比 Hadoop 高 10 倍。由于 Spark 基于内存,其性能自然比 Hadoop 提升了 100 倍。Spark 的磁盘模式下,比 Hadoop 快 10 倍。但 Spark 对内存需求很大,需要大量内存,成本高于磁盘,对企业硬件采购压力较大。Spark 基于内存,也容易出现内存泄漏,需要通过增加硬件、增加缓存/persist 或增加检查点(checkpoint)将内存内容落盘来解决,但性能会略微受影响。

总体来看,Spark 是一个优秀的设计,基于内存,并结合硬件,内存速度更快、成本更低,最终有望超越 Hadoop。Hadoop 3.0 也引入了将部分中间结果数据直接存储在内存的机制,Hive 新版本性能提高了 29 倍。

在实际应用中:
Hadoop 使用更广泛,并且与 Yarn 集成较多;而企业已经开始用 Spark 替代 Hadoop 作业,MR/Hive 正在被逐步取代。

3、Superiority(优势)

在很多方面,Spark 是 MapReduce 模式的最佳实现。例如,从程序抽象的角度来看:

  • Hadoop 在 Map/Reduce 阶段抽象出了任何 DAG 来支持任务。大多数计算依赖于缓冲区进行映射操作。而在 Spark 的 RDD 编程模型中,这些依赖被转换为 DAG,从而使计算逻辑可以更自然地表达。
  • Spark 通过更优的语言整合数据流到模型中,省去了 Hadoop MapReduce 中大量的模板代码。
  • 由于 Spark 的灵活编程模型,在 Hadoop MapReduce 中必需且嵌入的操作现在可以直接在应用上下文中进行。这使得应用能够重写 shuffle 或聚合函数,而在 MapReduce 中是不可能做到的!虽然绝大多数应用不会重写这些方法,但这个机制允许用户根据特定场景覆盖相关函数以优化计算。

从系统的高层来看:

  • Spark 通过快速 RPC(远程过程调用)进行作业调度。
  • Spark 在线程池中运行任务,而不是像 MapReduce 那样启动一系列 JVM 进程。两者结合,使 Spark 能在毫秒级完成任务调度。而 MapReduce 的调度模型中,调度任务可能需要几秒甚至几分钟(在繁忙集群中)。
  • Spark 不仅支持基于检查点(Checkpoint)的容错机制,还支持基于失败的容错机制。错误非常常见,而基于血缘关系(lineage)的容错机制可以快速从失败中恢复。

五、Spark Installation Modes(Spark Installation Modes)

当 Spark 应用程序部署在集群上时,可以由不同组件提供资源管理和调度服务(资源包括 CPU、内存等)。例如,用于本地开发测试的 Local 模式,可以作为独立集群管理器(Standalone)使用,也可以与 YARN 或 Mesos 配合使用。因此,Spark 包含 Local 模式以及三种不同类型的集群部署模式,包括 Local、Standalone、Spark on Mesos 和 Spark on YARN。

Spark 集群部署模式包括:

  • Local Mode(本地模式)
  • Standalone Mode(独立模式)
  • Spark on Mesos Mode(Mesos 模式)
  • Spark on YARN Mode(YARN 模式)

1、Local

Local Mode:本地模式,一种测试或实验性质的本地操作模式。运行这种模式非常简单,只需解压 Spark 安装包并修改一些常用配置即可,无需启动 Spark 的 Master 或 Worker 守护进程(这些仅在 Standalone 集群模式下需要),也无需启动 Hadoop 服务(除非你在使用 HDFS)。Spark 可以在本地使用多线程运行。

2、Standalone

Standalone Mode:独立模式,Spark 自身的资源管理模式,类似于 MapReduce 框架。Spark 框架本身也提供完整的资源调度管理服务,可以在集群中独立部署,无需依赖其他系统提供资源管理和调度服务。在架构设计上,Spark 与 MapReduce 完全一致,由一个 Master 和多个从节点组成,使用 slot 作为资源分配单位。不同之处在于,Spark 中的 slot 不再像 MapReduce 那样分为 Map slot 和 Reduce slot,而是设计了统一的 slot,供各种任务使用。

3、Spark on Mesos

Spark on Mesos Mode:Mesos 模式,这种模式是官方推荐的,因为 Mesos 是一个为运行其上的 Spark 提供资源调度管理的框架。在 Spark on Mesos 模式下,Spark 程序所需的各种资源由 Mesos 进行调度。由于 Mesos 与 Spark 的紧密关联,框架在设计和开发时充分考虑了对 Mesos 的支持,因此 Spark 在 Mesos 上运行比在 YARN 上运行更灵活、更自然。目前,Spark 官方推荐这种模式,因此许多公司已在实际应用中采用该模式。

4、Spark on YARN

Spark 可以在 YARN 之上运行,实现与 Hadoop 的统一部署,即“Spark on YARN”,其资源管理和调度依赖于 YARN,分布式存储依赖于 HDFS。

Spark on YARN 是当前一种有前景的部署模式,支持两种模式:

  • Yarn-cluster:适合生产环境
  • Yarn-client:适合交互和调试,希望能够立即看到应用程序的输出