<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Spark on 飞乐</title><link>https://www.feilewu.cn/tags/spark/</link><description>Recent content in Spark on 飞乐</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 27 Sep 2024 19:10:53 +0800</lastBuildDate><atom:link href="https://www.feilewu.cn/tags/spark/index.xml" rel="self" type="application/rss+xml"/><item><title>Spark在Standalone运行架构中的运行流程</title><link>https://www.feilewu.cn/posts/halo-posts/spark%E5%9C%A8standalone%E8%BF%90%E8%A1%8C%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B/</link><pubDate>Fri, 27 Sep 2024 19:10:53 +0800</pubDate><guid>https://www.feilewu.cn/posts/halo-posts/spark%E5%9C%A8standalone%E8%BF%90%E8%A1%8C%E6%9E%B6%E6%9E%84%E4%B8%AD%E7%9A%84%E8%BF%90%E8%A1%8C%E6%B5%81%E7%A8%8B/</guid><description>&lt;h2 id="standalone"&gt;Standalone&lt;/h2&gt;
&lt;p&gt;Standalone模式是Spark实现的资源调度框架，其主要的节点有Client节点、Master节点和Worker节点。其中Driver既可以运行在Master节点上中， 也可以运行在本地Client端。当用spark-shell交互式工具提交Spark的Job时，Driver在Master节点上运行； 当使用spark-submit工具提交Job或者在Eclips、IDEA等开发平台上使用”new SparkConf().setMaster(“spark://master:7077”)”方式运行Spark任务时， Driver是运行在本地Client端上的。&lt;/p&gt;
&lt;h3 id="具体流程"&gt;具体流程&lt;/h3&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://pic.feilewu.cn/uploads/2024/09/30/13c6323e-901a-456e-9c45-f1b29f30ac6e.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们提交一个任务，任务就叫Application&lt;/li&gt;
&lt;li&gt;初始化程序的入口SparkContext&lt;/li&gt;
&lt;li&gt;初始化DAG Scheduler&lt;/li&gt;
&lt;li&gt;初始化Task Scheduler&lt;/li&gt;
&lt;li&gt;Task Scheduler向master去进行注册并申请资源（CPU Core和Memory）&lt;/li&gt;
&lt;li&gt;Master根据SparkContext的资源申请要求和Worker心跳周期内报告的信息决定在哪个Worker上分配资源，然后在该Worker上获取资源，然后启动StandaloneExecutorBackend；顺便初始化好了一个线程池&lt;/li&gt;
&lt;li&gt;StandaloneExecutorBackend向Driver(SparkContext)注册,这样Driver就知道哪些Executor为他进行服务了。 到这个时候其实我们的初始化过程基本完成了，我们开始执行transform、ation的代码，但是代码并不会真正的运行，直到我们遇到一个action操作。先生产一个job任务，进行stage的划分。&lt;/li&gt;
&lt;li&gt;SparkContext将Applicaiton代码发送给StandaloneExecutorBackend；并且SparkContext解析Applicaiton代码，构建DAG图，并提交给DAG Scheduler分解成Stage（当碰到Action操作时，就会催生Job；每个Job中含有1个或多个Stage，Stage一般在获取外部数据和shuffle之前产生）。&lt;/li&gt;
&lt;li&gt;将Stage（或者称为TaskSet）提交给Task Scheduler。Task Scheduler负责将Task分配到相应的Worker，最后提交给StandaloneExecutorBackend执行；&lt;/li&gt;
&lt;li&gt;对task进行序列化，并根据task的分配算法，分配task&lt;/li&gt;
&lt;li&gt;对接收过来的task进行反序列化，把task封装成一个线程&lt;/li&gt;
&lt;li&gt;开始执行Task，并向SparkContext报告，直至Task完成。&lt;/li&gt;
&lt;li&gt;资源注销&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>