一、引言

作者:Albert陈凯
链接:https://www.jianshu.com/p/f3181afec605
來源:简书

Introduction

本文主要讨论 Apache Spark 的设计与实现,重点关注其设计思想、运行原理、实现架构及性能调优,附带讨论与 Hadoop MapReduce 在设计与实现上的区别。不喜欢将该文档称之为“源码分析”,因为本文的主要目的不是去解读实现代码,而是尽量有逻辑地,从设计与实现原理的角度,来理解 job 从产生到执行完成的整个过程,进而去理解整个系统。

讨论系统的设计与实现有很多方法,本文选择 问题驱动 的方式,一开始引入问题,然后分问题逐步深入。从一个典型的 job 例子入手,逐渐讨论 job 生成及执行过程中所需要的系统功能支持,然后有选择地深入讨论一些功能模块的设计原理与实现方式。也许这样的方式比一开始就分模块讨论更有主线。

本文档面向的是希望对 Spark 设计与实现机制,以及大数据分布式处理框架深入了解的 Geeks。

因为 Spark 社区很活跃,更新速度很快,本文档也会尽量保持同步,文档号的命名与 Spark 版本一致,只是多了一位,最后一位表示文档的版本号。

由于技术水平、实验条件、经验等限制,当前只讨论 Spark core standalone 版本中的核心功能,而不是全部功能。诚邀各位小伙伴们加入进来,丰富和完善文档。

关于学术方面的一些讨论可以参阅相关的论文以及 Matei 的博士论文,也可以看看我之前写的这篇 blog

好久没有写这么完整的文档了,上次写还是三年前在学 Ng 的 ML 课程的时候,当年好有激情啊。这次的撰写花了 20+ days,从暑假写到现在,大部分时间花在 debug、画图和琢磨怎么写上,希望文档能对大家和自己都有所帮助。

Contents

https://github.com/JerryLead/SparkInternals

Spark Version: 1.0.2
Doc Version: 1.0.2.0

本文档首先讨论 job 如何生成,然后讨论怎么执行,最后讨论系统相关的功能特性。具体内容如下:

  1. Overview 总体介绍
    Spark详解01概览|Spark部署|执行原理
  2. Job logical plan 介绍 job 的逻辑执行图(数据依赖图)
    Spark详解02Job 逻辑执行图
  3. Job physical plan 介绍 job 的物理执行图
    Spark详解03Job 物理执行图
  4. Shuffle details 介绍 shuffle 过程
    Spark详解04Shuffle 过程
  5. Architecture 介绍系统模块如何协调完成整个 job 的执行
    Spark详解05架构Architecture
  6. Cache and Checkpoint 介绍 cache 和 checkpoint 功能
    Spark详解06容错机制Cache 和 Checkpoint
  7. Broadcast 介绍 broadcast 功能
    Spark详解07广播变量Broadcast
  8. Job Scheduling 尚未撰写
  9. Fault-tolerance 尚未撰写

可以直接点 md 文件查看。

喜欢看 pdf 版本的可以去 这里 下载。

如果使用 Mac OS X 的话,推荐下载 MacDown 后使用 github 主题去阅读这些文档。

Examples

写文档期间为了 debug 系统,自己设计了一些 examples,放在了 SparkLearning/src/internals 下。

二、我的理解

0、Spark概述

  Spark是分布式的基于内存的迭代式计算框架,当然它也可以基于磁盘做迭代计算,根据Apache Spark开源组织官方描述,Spark基于磁盘做迭代计算也会比基于磁盘迭代的MapReduce框架快10余倍;而基于内存迭代计算则比MapReduce迭代快100倍以上。同时由于Spark是迭代式的计算框架,因此它天生擅长于将多步骤作业通过应用层面向过程的流水化操作将其转换成底层的多个作业串联操作,这在第一代计算框架MapReduce中需要我们程序员手动分解多个步骤的操作到各个作业中去。于此,我们如果基于Mapreduce来编写数据分析应用会耗费大量代码。然而如果基于Spark的API来构建应用会表现的非常的快速和高效,其Spark生态圈如下图所示:

1、Spark框架原理

  Spark是基于内存的一种迭代式计算框架,其处理的数据可以来自于任何一种存储介质,如:关系数据库、本地文件系统、分布式存储、网络Socket字节流等;Spark从数据源存储介质中装载需要处理的数据到内存中,并将这些数据集抽象为RDD(弹性分布式数据集)对象,然后采用一系列的算子(封装计算逻辑的API)来处理这些RDD,并将处理好的结果以RDD的形式输出到内存或以数据流的方式持久化写入到其它存储介质中。

  Spark框架拥有一系列的用于迭代计算的算子库,通过对这些算子的调用可以完成数据集在内存中的实时计算和处理,Spark在提交一个应用之后会在Spark客户端启动一个Driver进程,之后就是该Driver进程负责与Spark集群中Master节点进行数据交互,同时Driver进程会跟踪和收集Master节点反馈回来的数据处理工况。Spark集群中Master节点接收到Driver进程申请应用的请求后会基于Spark框架内部机制分析应用并将提交的应用拆解为各个可以直接执行的作业,这些作业之间根据设计的业务逻辑流程或为并发执行、或为串行执行都有Spark的分析器来实现决策,每个作业的内部又可以细分为各个任务,每个任务都对应一个具体的执行进程。Spark根据分析器拆分的作业以及任务的类型和数量将其分配到各个工作节点上去,每个工作节点上都有一个Worker进程来响应Master节点的调度处理;分配的具体任务都是由Spark在各个工作节点上生成的Executor进程来予以处理;在任务调度过程中,从一个任务到另一个任务的过渡或为在一个Executor进程内部完成数据转移、或为在不同的Executor进程之间完成数据转移;如果数据在不同的Executor之间完成数据转移则称为Stage(迭代步骤),计算过程中数据在不同的Stage之间迁移和交互涉及到数据在处理进程之间的重新分配过程,通常数据的重新分配会产生网络IO操作,网络IO操作会为分布式计算带来附加的集群负载,这是所有分布式计算所具备的共同特征,也是分布式计算为什么仅适用于处理大数据集的一个根源所在。

  每个节点上的任务操作结束之后都会将计算结果反馈给Worker进程,Worker进程负责将任务计算完成之后的状态就汇报给Master进程,Master进程负责数据输入、计算、调度和数据输出的整个迭代过程。每个任务结束之后Master进程都会将其注销,同时根据输入数据集的分配以启动新的任务继续处理剩余的数据。待指定的数据集全部处理结束之后,Master节点将数据集的处理结果反馈给Spark客户端,同时关闭与Spark客户端的连接。

https://www.cnblogs.com/tgzhu/p/5818374.html

https://blog.csdn.net/yejingtao703/article/details/79438572

Spark框架详解的更多相关文章

  1. Spark2.1.0——内置Web框架详解

    Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...

  2. Spark2.1.0——内置RPC框架详解

    Spark2.1.0——内置RPC框架详解 在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通.用户文件与Jar包的上传.节点间的Shuffle过程.Block数据的复制与备份等 ...

  3. jQuery Validate验证框架详解

    转自:http://www.cnblogs.com/linjiqin/p/3431835.html jQuery校验官网地址:http://bassistance.de/jquery-plugins/ ...

  4. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  5. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

  6. [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解

    Core data 是 Cocoa 中处理数据,绑定数据的关键特性,其重要性不言而喻,但也比较复杂.Core Data 相关的类比较多,初学者往往不太容易弄懂.计划用三个教程来讲解这一部分: 框架详解 ...

  7. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  8. Quartz.NET作业调度框架详解

    Quartz.NET作业调度框架详解 http://www.cnblogs.com/lmule/archive/2010/08/28/1811042.html

  9. mapreduce框架详解

    hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感 ...

随机推荐

  1. box-shadow 画叮当猫

    值 描述 h-shadow 必需.水平阴影的位置.允许负值 v-shadow 必需.垂直阴影的位置.允许负值 blur 可选.模糊距离 spread 可选.阴影的尺寸 color 可选.阴影的颜色.请 ...

  2. Create and test an approval workflow with Microsoft Flow

    https://docs.microsoft.com/zh-cn/flow/getting-started https://docs.microsoft.com/en-us/flow/modern-a ...

  3. 大数据框架对比:Hadoop、Storm、Samza、Spark和Flink

    转自:https://www.cnblogs.com/reed/p/7730329.html 今天看到一篇讲得比较清晰的框架对比,这几个框架的选择对于初学分布式运算的人来说确实有点迷茫,相信看完这篇文 ...

  4. vue.js数据可以在页面上渲染成功却总是警告提示某个字段“undefined”未定义

    最近在开发公司的一个后端管理系统,用的是比较流行的vue框架.在开发过程中,总是出现各种各样的报错问题,有警告的,有接口不通的,有自己马虎造成的低级错误的等等,这些错误在一些老司机面前分分钟解决,但今 ...

  5. 做个流量站-聚茶吧, 汇聚"茶"的地方

    犹豫了好久,终于下定决心,做一回个人站长了,虽然没啥经验,但毕竟也是IT科班出身了,准备用一年的事件摸索一下内容站和SEO,看看能否积累点经验,赚点小钱. 推酷-靠爬虫起家的内容站 做内容站,站长们都 ...

  6. [LeetCode] Split Array into Fibonacci Sequence 分割数组成斐波那契序列

    Given a string S of digits, such as S = "123456579", we can split it into a Fibonacci-like ...

  7. Httpclient代码

    /// <summary> /// 显示 /// </summary> /// <returns></returns> public ActionRes ...

  8. FBOSS: Building Switch Software at Scale

    BOSS: 大规模环境下交换机软件构建 本文为SIGCOMM 2018 论文,由Facebook提供. 本文翻译了论文的关键内容. 摘要: 在网络设备(例如交换机和路由器)上运行的传统软件,通常是由供 ...

  9. kali linux学习笔记(四) : 网络端口大全介绍

    端口大全介绍 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发 ...

  10. Java提高篇(一):区分引用变量与对象

    我们有代码: New A=new New(); 下面是这个New的类: class New { public New() { System.out.println("这是New类当中的构造方 ...