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.
  • 物理执行层
    • Spark 中一个应用可以有很多个 stage,形成复杂的 DAG 结构。
      • Hadoop 中一个 task 对应一个进程,Spark 中一个 task 对应一个线程。
      • 一个 task 的内存占用量代表 JVM 的堆内存占用量,Spark 的 JVM 内存空间由 task 共享。
      • task 的内存和消耗时间在运行前未知,执行层解决的两大问题:省内存和估时间。
      • 内存开销来源:
        • 框架中间数据(例如 map 输出的 buffer)。
        • Spark 中的 cache,用户指定缓存到内存中的数据。
        • 用户代码产生的中间结果。
      • 大部分跟用户代码强相关,难以预测,而 Spark 中大量的数据都缓存到内存中,因此省内存很重要。
      • 省内存方法:优化垃圾回收,内存管理机制,Java 对象本身 overhead 等等。
      • 预测执行时间:根据历史信息和各种特征。

大数据处理框架通常需要考虑容错机制,相关工作有:

  • 分析错误来源
  • Debugging tools
  • 错误修复工具

TODO Spark

以上的概念在 Spark 中都有一些专属名词与之对应。

TODO Logical Plan/Physical Plan

TODO 迭代型应用

TODO 性能和可靠性保障机制

Footnotes:

Author: Zihao Ye

Email: expye@outlook.com

Date:

Last modified: 2021-02-19 Fri 21:14

Licensed under CC BY-NC 4.0