本篇内容主要讲解“Spark的核心原理及架构”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spark的核心原理及架构”吧!
RDD(Resilient Distributed Datasets),弹性分布式数据集,它是对分布式数据集的一种内存抽象,通过受限的共享内存方式来提供容错性,同时这种内存模型使得计算比传统的数据流模型要高效。RDD具有5个重要的特性,如下图所示:
1.一组分区,数据集的基本组成单位。
2.计算每一个数据分区的函数。
3.对parent RDD的依赖,这个依赖描述了RDD之间的lineage(血统)。
4.可选,对于键值对RDD,有一个Partitioner(通常是HashPartitioner,RangePartitioner)。
5.可选,一组Preferred location信息(例如,HDFS文件的Block所在location信息)。
用户在提交任务给Spark处理时,以下两个参数共同决定了Spark的运行方式。 · –master MASTER_URL :决定了Spark任务提交给哪种集群处理。 · –deploy-mode DEPLOY_MODE:决定了Driver的运行方式,可选值为Client或者Cluster。
Spark 运行架构的特点
每个Application获取专属的executor进程,该进程在Application期间一直驻留,并以多线程方式运行Tasks。这种Application隔离机制有其优势的,无论是从调度角度看(每个Driver调度它自己的任务),还是从运行角度看(来自不同Application的Task运行在不同的JVM中)。当然,这也意味着Spark Application不能跨应用程序共享数据,除非将数据写入到外部存储系统。
Spark与资源管理器无关,只要能够获取Executor进程,并能够保持相互通信就可以了。
提交SparkContext的Client应该靠近Worker节点(运行Executor的节点),最好是在同一个机架里,因为Spark Application运行过程中SparkContext和Executor之间有大量的信息交换;如果想在远程集群中运行,最好使用RPC将SparkContext提交给集群,不要远离Worker运行SparkContext。
专属名称:
Application:每一个Spark程序,称之为一个Application。
Driver:每个Spark程序运行一个Driver进程,用来协调,统计任务进度。
Worker:每个Spark程序运行多个Worker进程,可以运行在一个节点或多个节点上,包含多个Executor子进程。
Executor:每个Spark程序运行多个Executor进程,具体承担计算任务。
Standalone 运行模式
Spark Standalone模式,即独立模式,自带完整的服务,可单独部署到一个集群中,无需依赖其他资源管理系统(资源管理+资源调度)。在该模式下,用户可以通过手动启动Master和Worker来启动一个独立的集群。其中,Master充当了资源管理的角色,Workder充当了计算节点的角色。在该模式下,Spark Driver程序在客户端Client运行,而Executor则在Worker节点上运行。
Standalone 组件分析 整个集群分为Master节点和Worker节点,其中Driver程序运行在客户端。
.Master节点负责为任务分配Worker节点上的计算资源,两者会通过相互通信来同步资源状态,见途中红色双向箭头。
.客户端启动任务后会运行Driver程序,Driver程序中会完成SparkContext对象的初始化,并向Master进行注册。
.每个Workder节点上会存在一个或者多个ExecutorBackend进程。每个进程包含一个Executor对象,该对象持有一个线程池,每个线程池可以执行一个任务task。ExecutorBackend进程还负责跟客户端节点上的Driver程序进行通信,上报任务状态。
Spark Standalone任务运行过程
上面的过程反映了Spark在standalone模式下,整体上客户端、Master和Workder节点之间的交互。对于一个任务的具体运行过程需要更细致的分解,分解运行过程见图中的小字。
1.用户通过bin/spark-submit部署工具或者bin/spark-class启动应用程序的Driver进程,Driver进程会初始化SparkContext对象,并向Master节点进行注册。
2.Master节点接受Driver程序的注册,检查它所管理的Worker节点,为该Driver程序分配需要的计算资源Executor。Worker节点完成Executor的分配后,向Master报告Executor的状态。
3.Worker节点上的ExecutorBackend进程启动后,向Driver进程注册。
4.Driver进程内部通过DAG Schaduler,Stage Schaduler,Task Schaduler等过程完成任务的划分后,向Worker节点上的ExecutorBackend分配TASK。
5.ExecutorBackend进行TASK计算,并向Driver报告TASK状态,直至结束。
6.Driver进程在所有TASK都处理完成后,向Master注销。
Spark Standalone 模式总结
Spark能够以standalone模式运行,这是Spark自身提供的运行模式,用户可以通过手动启动master和worker进程来启动一个独立的集群,也可以在一台机器上运行这些守护进程进行测试。standalone模式可以用在生产环境,它有效的降低了用户学习、测试Spark框架的成本。
standalone模式目前只支持跨应用程序的简单FIFO调度。然而,为了允许多个并发用户,你可以控制每个应用使用的资源的最大数。默认情况下,它会请求使用集群的全部CPU内核。
缺省情况下,standalone任务调度允许worker的失败(在这种情况下它可以将失败的任务转移给其他的worker)。但是,调度器使用master来做调度,这会产生一个单点问题:如果master崩溃,新的应用不会被创建。为了解决这个问题,可以zookeeper的选举机制在集群中启动多个master,也可以使用本地文件实现单节点恢复。
Spark Cluster模式任务运行过程
1.用户通过bin/spark-submit部署工具或者bin/spark-class向Yarn集群提交应用程序。
2.Yarn集群的Resource Manager为提交的应用程序选择一个Node Manager节点并分配第一个container,并在该节点的container上启动SparkContext对象。
3.SparkContext对象向Yarn集群的Resource Manager申请资源以运行Executor。
.Yarn集群的Resource Manager分配container给SparkContext对象,SparkContext和相关的Node Manager通讯,在获得的container上启动ExecutorBackend守护进程,ExecutorBackend启动后开始向SparkContext注册并申请Task。
5.SparkContext分配Task给ExecutorBackend执行。
6.ExecutorBackend开始执行Task,并及时向SparkContext汇报运行状况。
7.Task运行完毕,SparkContext归还资源给Node Manager,并注销退。
Spark Cluster 模式总结
Spark能够以集群的方式运行,这里的可选集群有Yarn和Mesos。在集群模式下,Spark的Driver程序可能被调度到任何一个节点,任务执行完成后,集群分配的资源将被回收。
到此,相信大家对“Spark的核心原理及架构”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。