设为首页 加入收藏

TOP

Spark学习—— (1) 原理介绍
2019-04-16 01:18:46 】 浏览:58
Tags:Spark 学习 原理 介绍

本文分为三个部分:

第一部分介绍Spark的概念,通过与Hadoop的对比,使得对Spark的定位有一个较清晰的理解。

第二部分通过介绍基本术语,了解Spark基本、简略的运行流程,对Spark的运行流程有一个初步概念。

第三部分以Standalone运行模式为例,稍微深入地介绍了Spark应用的运行流程,使得对Spark的运行流程的整个框架有一定理解。

目前正在入门Spark,本文基本为学习网上的博客加上个人理解所整理而成,若文中有错误,请大佬指正~

1. Spark是什么?

提到Spark的时候,通常都会提到Hadoop,以至于很容易简单地把Spark看做Hadoop的加强版。事实上,Spark和Hadoop确实关系密切,但不是简单的替代关系。这一部分,我们从Spark和Hadoop的概念上对两者进行区分,使得我们对Spark有更准确的理解。

1.1 概念定义

官网对于Spark的定义包括两个方面——

  1. Spark是一个速度快、通用的集群计算框架,提供Java、Scala、Python和R的API
  2. Spark提供了上层的一些工具,如处理SQL的Spark SQL、做机器学习的MLib、做图计算的GraphX、做实时数据流处理的Spark Streaming

而在我之前的笔记中,对Hadoop的定义为——

  1. Hadoop是一个分布式系统基础架构,可以使用户在不了解分布式系统底层细节的情况下开发分布式程序,充分利用集群进行高速存储和运算
  2. Hadoop最主要的三个核心模块分别是:负责数据存储的HDFS、负责数据处理运算的MapReduce、负责资源管理调度的YARN

1.2 区分Spark和Hadoop

  1. 从上述对Spark的定义来看,Spark是一个类似MapReduce的计算框架,并提供了基于这个框架的一些上层工具。因此,Spark对标于MapReduce,同时它提供了远胜于MapReduce的计算能力
  2. 相对于Hadoop,Spark并没有完整的技术栈,如数据存储模块等。因此,Spark是依赖于第三方的数据源的,而这使得Spark更加灵活,可以配合HBase、Hive、Mysql等做多种任务

因此,Spark应该说弥补了Hadoop中MapReduce计算性能上的不足,Spark不是Hadoop的替代或升级,而是Hadoop的补充,利用Spark可以使Hadoop更高效地完成任务。

1.3 Spark的优势

  1. 速度快

    • Spark计算的中间结果存储在内存中,而不是像MapReduce一样存储到磁盘中,大大减少了磁盘操作
    • Spark拥有先进的DAG调度器、查询优化器以及物理执行引擎从而高性能地实现批处理和流数据处理
  2. 易用性

    • 提供80个以上高级算子便于执行并行应用,并且可以使用Scala、Python、R以及SQL的shell端交互式运行Spark应用
    • 基于RDD的计算模型相比MapReduce模型更易于理解、更易于开发
  3. 通用性

    • Spark提供了Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX等技术组件,可以一站式地完成大数据领域的交互式查询、流式计算、机器学习、图计算等常见的任务
  4. 兼容性

    • Spark兼容于现有的Hadoop生态系统,可以作为Hadoop的补充,如Hadoop的HDFS、Hive、HBase负责存储,YARN负责资源调度,Spark复杂大数据计算

2. Spark基本运行过程

Spark的基本运行过程如下,本部分先简单介绍其中涉及到的概念和术语,再对该基本运行过程做简单的描述。

2.1 概念术语

集群上的节点分为master节点和worker节点,其中——

  1. master节点(主节点):运行master守护进程,负责控制、管理、监控集群中的worker节点,提交应用时也提交给master节点
  2. worker节点(从节点/计算节点):运行worker守护进程,与master节点通信,管理executor进程。在standalone模式下指的是slave文件配置的worker节点,在Spark on YARN模式中指的是NodeManager节点

一台机器可以同时作为master节点和worker节点,提交submit任务的节点也称为Client

  1. cluster manager,资源管理器,集群上获取资源的外部服务,可以是Spark原生的资源管理器standalone,由Master负责资源分配;也可以是第三方的资源管理器,如mesos或YARN,在YARN下由Resource Manager负责资源分配

  2. driver程序可以运行在master节点或worker节点上,负责——

    • 创建SparkContext,向资源管理器cluster manager(可以是mesos、yarn、standalone)申请spark应用所需的资源executor,资源管理器在各个worker上分配一定的executor
    • 将Spark应用的代码拆分为若干个stage,给每个stage创建一批tasks,即taskSet,将这些task分配到各个executor中
  3. executor程序运行在worker节点上,一个worker节点可以有多个executor。一个executor有一个线程池,其中每个线程可执行一个task,executor执行完task后将结果返回driver

2.2 运行流程

了解上述概念后,就可以比较清晰地理解Spark应用运行的流程了,如上图所示,运行过程为:

  • Client节点提交Spark应用至master,master选择一个节点(master/worker)运行Driver程序
  • Driver进程运行应用的main函数,并创建SparkContext,向资源管理器Cluster Manager申请spark应用所需的资源Executor
  • 资源管理器在各个worker上分配一定的Executor,Executor内部创建运行task的线程池
  • Driver进程将我们编写的spark应用代码拆分成多个stage,每个stage执行一部分代码片段,并为每个stage创建一批tasks,然后将这些tasks分配到各个Executor中执行

3. Spark on Standalone运行过程

上一部分为Spark应用运行的基本过程,在分配资源后,如何运行,上面只是简单地带过。

一个更完整的过程如下,为Standalone模式(即使用Spark原生资源管理器)下的运行过程,该模式下master节点即为Cluster Manager。

为了理解这一过程,我们同样先简单介绍涉及到的一些概念。

3.1 概念术语

  1. RDD,弹性分布式数据集,Spark的基本计算单元,可以通过一系列算子进行操作,可参考Reference.8

    • RDD可以在内存和磁盘存储之间手动或自动切换
    • RDD拥有Lineage(血统)信息,存储着父RDD等信息,当数据丢失时可以恢复,即具备容错性
    • Transformation操作是将现有的RDD转化为新的RDD,而Action操作是需要系统返回一个结果
    • Spark使用lazy eva luation,即执行Transformation操作时实际没有发生任何操作,而等到遇到Action操作时才从头执行一系列操作并返回结果。这一系列运算形成了有向无环图DAG
  2. Application,指用户编写的Spark应用程序,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。一个Application由一个或多个Job组成

  3. Job,指由一个或多个调度阶段(stage)组成的一次作业,通常由Action操作触发(遇到一个Action,则连同前面的操作合并为一个Job)

  4. Stage,指一个任务集对应的调度阶段(根据操作的宽依赖和窄依赖进行划分,窄依赖可以l流水线并行),为Stage的每个RDD分区创建一个Task,多个Task封装成TaskSet

    窄依赖: 指父RDD的每个分区只被子RDD的一个分区所使用,子RDD分区通常对应常数个父RDD分区

    宽依赖: 指父RDD的每个分区都可能被多个子RDD分区所使用,子RDD分区通常对应所有的父RDD分区

    如第7点处的图中,stage0和stage1都是窄依赖,stage2是宽依赖

  5. Task,被送到executor上执行的任务,是单个分区数据集上的最小处理流程单元

Application、Job、Stage、Task的关系如下图:

  1. DAG Scheduler,把Spark作业转换成Stage的DAG,根据宽窄依赖拆分成若干个stage,并以TaskSet的形式提交给Task Scheduler,一个SparkContext对应一个DAG Schduler
  2. Task Scheduler,将TaskSet提交给worker运行并获取运行结果

DAG Scheduler和Task Scheduler是SparkContext的一部分

3.2 运行流程

了解上述概念后,我们可以更加清晰地理解Spark应用运行的整体流程,如上图所示,运行过程为(前3步跟上面一样,即分配资源):

  • Client节点提交Spark应用至master,master选择一个节点(master/worker)运行Driver程序
  • Driver进程运行应用的main函数,并创建SparkContext对象,主要包括DAG Scheduler和Task Scheduler。SparkContext向资源管理器Cluster Manager申请spark应用所需的资源Executor
  • 资源管理器在各个worker上分配一定的Executor,Executor内部创建运行task的线程池,并把结果通知给Driver
  • DAG Scheduler把Spark作业转换成Stage的DAG,根据宽窄依赖拆分成若干个stage,并以TaskSet的形式提交给Task Scheduler
  • Task Scheduler维护所有TaskSet,分发Task给各个节点的Executor(根据数据本地化策略分发Task),监控task的运行状态,负责重试失败的task
  • 所有task完成后,SparkContext向Master注销,释放资源

4. 未完待续…

在学习Spark运行流程的过程中,看到了Spark有多种运行模式,包括上面提到的Standalone模式。每种运行模式的运行流程也会有相应的区别,本文中没有涉及,但对使用Spark很重要。为了更好的理解和使用Spark,有必要了解一下。

下一步会学习Spark运行模式相关的知识,再整理笔记~

Reference

  1. spark成长之路(1)spark究竟是什么?

  2. Hadoop学习——(1) 基础知识

  3. spark核心技术原理透视一(Spark运行原理)

  4. 大数据-Spark的介绍:前世今生

  5. Spark中文指南(入门篇)-Spark编程模型(一)

  6. 看了之后不再迷糊-Spark多种运行模式

  7. Spark中master、worker、executor和driver的关系

  8. Spark入门——什么是Hadoop,为什么是Spark

  9. Spark中的宽依赖和窄依赖

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spark精华问答 | 为什么要学Spark 下一篇1,Spark内核源码深度剖析

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目