Apache Spark设计与实现
Table of Contents
从马老师那里白嫖了这本书,之前对 Hadoop/Spark 略有耳闻不过不了解实现,借此机会简单理解一下 Spark 想解决的问题和架构。
Overview
大数据处理框架
编程模型通常使用 MapReduce 1,Hadoop 实现了 MapReduce 规范,Dryad 和 Spark 设计了更多的 operator。有很多基于 Hadoop 的应用:数据库(Hive),机器学习库(MLlib),图处理库(GraphX)。
通常大数据框架分为四层结构:
- 用户层
- 数据:一般存在 HDFS 上,I/O 有优化机会
- 代码:不同框架不同接口,指定处理逻辑。
- 框架会启动一个 Driver,将用户代码/数据广播给集群的各个 task 运行(Map/Reduce 过程),并收集 task 的计算结果。
- 参数:资源/数据流,有 auto-tune 的机会。
- 并行处理层
- Logical Plan/Physical Plan
- Spark 将输入输出和中间数据统一使用 RDD(Resilient Distributed Datasets)表示。
- RDD 可以包含多个 Partition。
- 用户代码转化成逻辑处理流程
- 一个 RDD 组成的 DAG(类似于 DL 框架里的计算图)。
- 逻辑处理流程->物理执行计划
- Spark 根据依赖关系把 DAG 分成多个 stage,在每个 stage 形成 task。
- Task 个数与 stage 中的 RDD 的分区个数一致。
- 一个 stage 不一定是同一种任务(all map/reduce)
- 可以通过 cache 接口重用中间数据(类似于深度学习框架储存 checkpoint)。
- 资源管理与调度层
- 系统架构:Master-Worker 架构
- Master 接受用户提交的应用,处理请求,管理生命周期
- Worker 执行具体的 task,并向 Master 汇报执行状态。
- 主节点运行 JobTracker,接收 Job 并分解成 task(上一层描述的过程),把 task 交给 task scheduler。
- task scheduler 根据资源情况把 task 分配到合适的 Worker 节点上。
- TaskTracker 为每一个 task 启动一个进程,最大 task 数量由机器资源决定。
- 集群可能由多个用户共享,因此集群可能同时运行多个 job.
- 系统架构:Master-Worker 架构
- 物理执行层
- Spark 中一个应用可以有很多个 stage,形成复杂的 DAG 结构。
- Hadoop 中一个 task 对应一个进程,Spark 中一个 task 对应一个线程。
- 一个 task 的内存占用量代表 JVM 的堆内存占用量,Spark 的 JVM 内存空间由 task 共享。
- task 的内存和消耗时间在运行前未知,执行层解决的两大问题:省内存和估时间。
- 内存开销来源:
- 框架中间数据(例如 map 输出的 buffer)。
- Spark 中的 cache,用户指定缓存到内存中的数据。
- 用户代码产生的中间结果。
- 大部分跟用户代码强相关,难以预测,而 Spark 中大量的数据都缓存到内存中,因此省内存很重要。
- 省内存方法:优化垃圾回收,内存管理机制,Java 对象本身 overhead 等等。
- 预测执行时间:根据历史信息和各种特征。
- Spark 中一个应用可以有很多个 stage,形成复杂的 DAG 结构。
大数据处理框架通常需要考虑容错机制,相关工作有:
- 分析错误来源
- Debugging tools
- 错误修复工具
TODO Spark
以上的概念在 Spark 中都有一些专属名词与之对应。