Spark学习(1)-架构原理

Spark是什么

Spark是基于HDFS等分布式存储之上的数据处理分析框架,它擅长批量数据处理,处理流工作负载,交互式查询,机器学习等;它可以通过standalone模式,yarn-client或者yarn-cluster等模式在hadoop集群中运行;而依托在spark数据处理之上的有Spark Sql,Spark Stream,MLlib,Graphx等组件;
其具体架构示意图如下:


Spark示意图.png

上图中最上层最组件说明如下:

  • Spark Sql:通过提供Apache Hive的sql查询语句变体HiveQL来与Spark进行交互的API库,每个数据库表都是一个RDD对象,Spark sql查询都将转化为Spark的操作;
  • Spark Streaming:能够提供实时数据流的处理和控制,Spark Streaming允许程序像处理普通RDD对象那样处理实时数据流;
  • MLlib(Machine Learning):机器学习的一些算法库,算法通过Spark 对RDD的操作处理来实现,该库包括可扩展的学习算法,如回归,分类等需要对大数据集进行迭代的算法;
  • GraphX:控制图和并行图操作和计算的算法和工具的集合;

接下来说下Spark架构,Spark架构组成图如下:


Spark组成.png

如上图,在Spark架构中有以下几个组成:

  • Driver Pragram:Application的driver程序,用来运行Application的main函数以及创建SparkContext进程来准备Application的运行环境;
  • SparkContext:SparkContext在Spark中用来和ClusterManager进行通信,申请资源,分配和监控任务;
  • ClusterManager:负责集群资源的管理和分配的节点,它会通过心跳的方式来监控workerNode,在Standalone模式中,它就是Master,在Yarn模式中,它就是Resource Manager;
  • WorkNode:集群中的从节点,用来负责计算和控制的节点,可以启动Exector或者Driver;
  • Executor:Application的Executor程序,ClusterManager会为Application的每个Executor分配一个进程,采用线程池分配的方式来执行TaskSet;
  • Task:Executor上执行任务的基本单位;多个Task可以构成一个Stage;

Spark怎么运行

Spark运行流程图如下:


Spark运行.png

流程讲解如下:

    1. Application程序启动Driver程序,创建SparkContext;
  • 2.SparkContext向资源管理器申请运行Executor节点资源,Executor节点启动SatandaloneExectuorBackend,Exectuor会定期向资源管理器上报资源使用情况;
    1. Executor节点向SparkContext申请Task,然后SparkContext将Application中的Executor程序发送给Executor;
  • 4.SparkContext会将RDD objects构建成DAG(有向无环图),然后发送给DAG Scheduler;
    1. DAG Scheduler会将DAT拆分为多个Stage,每个Stage都是由多个Task组成;然后将TaskSet发送给TaskScheduler;
    1. TaskScheduler会将TaskSet中的Task提交给Exectutor运行,Executor将采用线程池的方式运行这些Tasks;Executor会在Tasks运行完成后会释放所有资源;

流程术语如下:

  • Application:用户编写的Spark应用程序,包括一个Driver程序和多个Executor程序;

  • Driver:Driver是运行Driver程序的一个节点,它会运行Application的main函数,创建SparkContext,SparkContext用来准备Application的运行环境,它可以和ResourceManager通信,申请资源,分配和监控任务;当Executor执行完最后的任务时,Driver同时负责将SparkContext关闭,一般情况下Diver可以理解为SparkContext;

  • Executor: Executor是运行Application中Executor程序的一个进程,该进程会和SparkContext保持通信,并负责某些Task的处理,然后将数据保存到内存或者磁盘;在Spark on Yarn模式中,该进程名为CoarseGrainedExecutor Backend,CoarseGrainedExecutorBackend只有一个Executor对象,通过将task包装秤TaskRunner,然后交给线程池中某个线程来执行,这样Executor能并行执行的task数就与分配给它的cpu数有关;

  • Worker:在Spark集群中能够运行Application程序的节点,Standalone模式下是通过slave文件配置的节点;而在Yarn模式下则指的是NodeManager;

  • ClusterManager: 集群资源管理,负责集群资源的管理和监控,在不同运行模式下有不同的类型:

    • Standalone模式:Spark原生的资源管理器,由Master来负责资源的管理和分配;
    • Apache Mesos模式下:Apache Mesos是一种与Hadoop结合很好的资源调度框架;
    • Yarn模式:指的是ResourceManager;
  • job:是包含多个task的并行计算,由Spark Action触发,一个Application会产生多个job;

  • task: 是由Executor负责执行的工作单元,和HadoopMR中的MapTask和ReduceTask概念一致,由TaskScheduler负责调度和分配,多个task可以组成一个stage;

  • stage:每个job都可以划分成多组Task,作为一个taskSet,叫做stage;stage由DAGScheduler进行拆分和调度,拆分的依据是根据RDD Object之间的依赖关系找出开销最小的方法;stage分为非最终stage(shuffle Map stage)和最终stage(Result stage),这两种stage的边界就是发生shuffle的地方;

  • DAGScheduler:DAGScheduler是Driver中根据job构建成stage的调度器,然后将构建后的stage交给TaskScheduler;

  • TaskScheduler:TaskScheduler是Driver中用来向Executor分配Task和维护所有taskset的调度器,当Executor向Driver发送心跳时,TaskScheduler会根据资源剩余情况向Executor分配的任务;同时TaskScheduler还维护每个TaskSet的运行标签,包括失败和重试的次数;在不同模式下TaskScheduler名称不一样:

    • Spark on Standalone:名称为TaskScheduler;
    • yarn-client模式下为: YarnClientClusterScheduler;
    • yarn-cluster模式下为:YarnClusterScheduler;

将流程术语串起来就得到了Spark 运行层次图如下:


Spark运行.png

一个spark可以有多个stage,每个stage由同种task构成,task可以分为shuffleMapTask和ResultTask,其中
Dependency也分为ShuffleDependency和NarrowDependency;

Spark运行模式有哪些

Spark运行模式比较丰富,运行在单机上可以有:本地模式和伪分布式模式;运行在分布式环境下,根据结合的资源调度框架又有不同的划分,本文就介绍:Spark内建的Standalone模式和Yarn-client模式和Yarn-cluster模式

Standalone模式(独立模式)

Standalone模式是Spark内建的一种资源调度框架,它采用Master/Slave模式,通过zookeeper来保证Master的高可用,其框架图如下:(参考https://www.cnblogs.com/cxxjohnson/p/8909578.html)

Standalone模式架构.png

该模式中有Master节点,slave节点,worker节点,其中Driver既可以运行在Master节点上也可以运行在本地客户端,如果通过spark-shell提交job,则Diver运行在master节点上,如果通过spark-submit提交job或者在Eclips、IDEA等开发平台上使用”new SparkConf.setManager(“spark://master:7077”)”方式运行Spark任务时,Driver是运行在本地Client端上的;
具体运行过程如下:

Standalone.png

运行说明如下:

    1. Client运行Application的Driver,创建SparkContext,SparkContext会注册到Master上,并向Master申请cpu,memory资源;
    1. Master根据SparkContext申请的资源信息和通过心跳获取的Worker节点信息,选择一个Worker节点获取相应的资源,同时在该节点上启动StandaloneExecutorBackend进程;
    1. StandaloneExecutorBackend向SparkContext注册;
    1. SparkContext会将Application程序发送给StandaloneExecutorBackend,同时解析Application代码,获取DAG有向无环图,然后将DAG交给DAGScheduler构建成Stages(每当Action动作时,就会催生Job,每个Job可以包含多个Stage,每个Stage会有多个Task,Stage会在获取外部数据和shuffle之前产生),之后DAGScheduler会将Stage交给TaskScheduler,TaskScheduler会根据Worker节点资源剩余情况向Worker分配相应的任务,最后提交给StandaloneExecutorBackend进行执行;
  • 5.StandaloneExecutorBackend进程会根据Application程序创建一个Executor线程池,来执行每个任务,同时会将任务执行情况发送给SparkContext;
  • 6.SparkContext监听到最后一个Task完成时,向Master注销,并释放所有资源;

yarn-client模式

Spark on yarn运行模式根据Driver运行位置可以分为:yarn-client模式和yarn-cluster模式(也就是Yarn-standalone模式)
其yarn-client模式是因为Driver运行在本地,所以client可以和Spark Application进行交互,通过WebUI进行访问;
yarn-client运行过程图如下:


Yarn-client.png

过程说明如下:

    1. Spark Yarn Client运行Application的Driver程序创建SparkContext,SparkContext会向Yarn ResourceManager申请运行AppMaster节点,同时会初始化DAGScheduler和TaskScheduler,由于是yarn-client模式,所以会选择YarnClientClusterScheduler和YarnClientClusterBackend;
    1. ResourceManager在收到请求后,会找到一个NodeManager,为该Application运行一个Container作为ApplicationMaster,该ApplicationMaster不运行SparkContext,但会和client保持联系进行资源分配;
    1. SparkContext在初始化完成后,会和ApplicationMaster通信,ApplicationMaster会根据任务信息向ResourceManager申请资源;
    1. ApplicationMaster申请到资源后,会联系指定的NodeManager,要求在分配的container中启动CoarseGrainedExecutorBackend进程,该进程启动后会向Client注册并申请task;
    1. Client中的SparkContext会根据CoarseGrainedExecutorBackend的资源信息然后分配相应的task,CoarseGrainedExecutorBackend在执行task时会向Driver汇报任务执行情况,这样Client可以根据任务执行情况决定是否重启任务;
  • 6.SparkContext在执行完最后一个任务后,会向ResourceManager注销并释放掉所有资源;

Yarn-cluster模式

客户端通过向Yarn cluster提交应用程序的方式来执行数据处理,那么Yarn会将该Application作为两个步骤来完成:

  • 1.第一个步骤是把Application的Driver程序当做ApplicationMaster来在集群中运行;
  • 2.第二个步骤是ApplicationMaster创建SparkContext,并向ResourceManager申请Executor资源,然后在申请到的资源上执行任务,并监控任务执行情况直到任务结束;

其具体执行流程如下图:


Yarn-cluster.png

流程说明如下:

  • 1.Client会向ResourceManager提交Application申请;
  • 2.ResourceManager在收到Application申请后,会找到一个NodeManager,该NodeManager会分配一个Container作为ApplicationMaster,用来执行Driver程序,创建SparkContext,并初始化DAGScheduler和TaskScheduler,因为运行模式是Yarn-cluster,所以程序会选择YarnClusterScheduler来包装TaskScheduler;
    1. ApplicationMaster在SparkContext初始化后,会向ResourceManager申请资源来执行任务;
  • 4.ResourceManager会根据任务信息分配一个或者多个NodeManager,ApplicationMaster在得到分配资源后,会和NodeManager建立联系,要求其启动CoarseGrainedExecutorBackend进程; CoarseGrainedExecutorBackend进程启动后会向ApplicationMaster中的SparkContext注册并申请Task,这一点和standalone模式很像,只是SparkContext会在SparkApplication初始化时使用CoarseGrainedExecutorBackend配合YarnClusterScheduler来进行任务调度;
  • 5.SparkContext会根据CoarseGrainedExecutionBackend资源信息分配相应的任务,同时会监控CoarseGrainedExecutionBackend任务执行情况知道结束;
  • 6.ApplicationMaster会在所有任务都完成的情况下,向ResourceManager注销掉自己并释放所有资源;

Yarn-client和Yarn-cluster模式区别:
Yarn-client和Yarn-cluster模式最大区别在于是否有ApplicationMaster运行Driver,在Yarn-client中由Client运行Driver,而ApplicationMaster主要用来向ResourceManager申请Containers来作Executor,之后由Client和相应的Executor所在Container进行通信,这样用户可以直接查看程序进行情况,比较适合交互式任务执行;
而在Yarn-cluster中,Driver是运行在ApplicationMaster中,ApplicationMaster不仅要和ResourceManager保持联系,并申请资源,同时还需要和containers保持联系,并下发任务和监视任务执行情况;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容