Spark 是一种用于大数据工作负载的分布式开源处理系统,它使用内存中缓存和优化的查询执行方式,可针对任何规模的数据进行快速分析查询
-
特点
-
速度快
与 MapReduce 相比,Spark 基于内存的运算效率要快100倍以上,基于硬盘的运算效率也要快10倍以上
Spark 实现了高效的 DAG 执行引擎,能够通过内存计算高效地处理数据流
-
易用性
Spark 编程支持 Java、Python、Scala 及 R 语言,并且还拥有超过 80 种高级算法
除此之外,Spark 还支持交互式的 Shell 操作,开发人员可以方便地在 Shell 客户端中使用 Spark 集群解决问题
-
通用性
Spark 提供了统一的解决方案,适用于批处理、交互式查询 (SparkSQL)、实时流处理 (SparkStreaming)、机器学习 (SparkMLlib) 和图计算 (GraphX)
它们可以在同一个应用程序中无缝地结合使用,大大减少大数据开发和维护的人力成本和部署平台的物力成本
-
兼容性
Spark 可以运行在 Yarn 模式、Mesos 模式、Standalone 独立模式或 Cloud 中,并且还可以访问各种数据源,包括本地文件系统、HDFS、Cassandra、HBase 和 Hive 等
-
-
使用场景
- Spark 是基于内存的迭代计算框架,适用于需要多次操作特定数据集的场合
- 由于RDD 的特性,Spark 不适用与异步细粒度更新状态的应用,如 web 服务储存或增量的 web 爬虫和索引
- Spark 适用于数据量不是特别的,但要求实时统计分析的需求
- Spark 可以作为 Hive 的计算引擎,比 MR 计算速度更快
Spark 为什么快
-
磁盘 IO 方面
RDD 和 DAG 使 Spark 能在内存中进行迭代式运算,迭代过程的中间结果都写入内存可以重用,减少了磁盘 IO
MR 虽然可以在编写 map 和 reduce 时使用更复杂的代码实现在内存中计算的效果,但是扩展性和复用性太差
-
Shuffle 方面
Spark 的 Shuffle 只有在部分场景下才需要排序,大部分场景下是基于 Hash 的分布式聚合,更省时间
MR 的 Shuffle 进行过程中要进行很多次排序
-
任务调度方面
Spark Task 是基于多线程模型的,控制资源占用的粒度粗,但节省了启动和关闭进程的开销
MR 的 Task 都是基于多进程模型的,控制资源占用的粒度细,当启动和关闭进程的开销大
Spark 架构
-
核心模块
-
Spark Core
包含Spark的基本功能,尤其是定义 RDD 的 API、操作以及这两者上的动作
其他 Spark 的库都是构建在 RDD 和 Spark Core 之上的
-
Spark SQL
提供通过 Apache Hive 的 SQL 变体 Hive 查询语言 (HiveQL) 与 Spark 进行交互的 API
每个数据库表被当做一个 RDD,Spark SQL 查询被转换为 Spark 操作
-
Spark Streaming
对实时数据流进行处理和控制
Spark Streaming 允许程序能够像普通 RDD 一样处理实时数据
-
MLib
一个常用机器学习的算法库,算法被实现为对 RDD 的 Spark 操作
这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作
-
GraphX
控制图、并行图操作和计算的一组算法和工具的集合
GraphX 扩展了 RDD API,包含控制图、创建子图、访问路径上所有顶点的操作
-
-
基本组件
-
Cluster Manager
在 Standalone 模式中即为 Master 主节点,控制整个集群,监控 Worker
在 Yarn 模式中为 ResouceManager
-
Worker
从节点,负责控制计算节点,启动 Executor 或者 Driver
在 Yarn 模式中为 NodeManager,负责计算节点的控制
-
Driver
运行 Application 的 main() 函数并创建 SparkContext,驱使整个应用运行起来的程序,也称之为 Driver 类,主要负责以下功能:
-
将用户程序转化为作业 (job)
-
在 Executor 之间调度任务 (task)
-
跟踪 Executor 的执行情况
-
通过 UI 展示查询运行情况
-
-
Executor
Spark Executor 是集群中工作节点 (Worker) 中的一个JVM 进程,负责在 Spark 作业中运行具体任务 (Task)
任务彼此之间相互独立,每个 Application 拥有独立的一组 Executor
Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在
如果有 Executor 节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行
核心功能:
-
负责运行组成 Spark 应用的任务,并将结果返回给 Driver 进程
-
通过自身的块管理器 (Block Manager) 为用户程序中要求缓存的 RDD 提供内存式存储
RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算
-
-
SparkContext
整个应用的上下文,控制应用的生命周期
-
RDD
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型
代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合
RDD 是 Spark 的最小计算单元,用于储存计算的数据和逻辑,一个复杂的逻辑可以分解成多个 RDD 并行运行
-
DAG Scheduler
根据任务 (Task) 构建基于 Stage 的 DAG,并提交 Stage 给 TaskScheduler
-
TaskScheduler
将任务 (Task) 分发给 Executor 执行
-
SparkEnv
线程级别的上下文, 存储运行时的重要组件的引用
-