<转>Spark执行模式解析

本文介绍了Apache Spark的不同执行模式,包括local、Standalone client/cluster、YARN client/cluster等,并详细解释了每种模式下的应用执行流程及提交脚本示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        摘要:本文主要讲了Spark几种不同的执行模式以及其原理

一、执行模式

提交脚本常见的语法:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. ./bin/spark-submit \  
  2. --class <main-class>  
  3. --master <master-url> \  
  4. --deploy-mode <deploy-mode> \  
  5. --conf <key>=<value> \  
  6. ... # other options  
  7. <application-jar> \  
  8. [application-arguments]  

脚本说明:

(1)—-class: 主类,即main函数所有的类
(2)—- master : master的URL,见下面的详细说明。
(3)—-deploy-mode:client和cluster2种模式
(4)—-conf:指定key=value形式的配置

下面对各种模式做一个说明:

1、local

    本地跑程序,一般用来测试。可以指定线程数

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # Run application locally on 8 cores  
  2. ./bin/spark-submit \  
  3. --class org.apache.spark.examples.SparkPi \  
  4. --master local[8] \  
  5. /path/to/examples.jar \  
  6. 100  

2、Standalone client

该方式应用执行流程:

(1)用户启动客户端,之后客户端运行用户程序,启动Driver进程。在Driver中启动或实例化DAGScheduler等组件。 客户端的Driver向Master注册。
(2)Worker向Master注册,Master命令Worker启动Exeuctor。Worker通过创建ExecutorRunner线程,在ExecutorRunner线程内部启动ExecutorBackend进程。
(3)ExecutorBackend启动后,向客户端Driver进程内的SchedulerBackend注册,这样Driver进程就能找到计算资源。Driver的DAGScheduler解析应用中的RDD DAG并生成相应的Stage,每个Stage包含的TaskSet通过TaskScheduler分配给Executor。 在Executor内部启动线程池并行化执行Task。

示例脚本:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # Run on a Spark Standalone cluster in client deploy mode  
  2. ./bin/spark-submit \  
  3. --class org.apache.spark.examples.SparkPi \  
  4. --master spark://207.184.161.138:7077 \  
  5. --executor-memory 20G \  
  6. --total-executor-cores 100 \  
  7. /path/to/examples.jar \  
  8. 1000  

3、standalone cluster

该方式应用执行流程:

(1)用户启动客户端,客户端提交应用程序给Master。
(2)Master调度应用,针对每个应用分发给指定的一个Worker启动Driver,即Scheduler-Backend。 Worker接收到Master命令后创建DriverRunner线程,在DriverRunner线程内创建SchedulerBackend进程。Driver充当整个作业的主控进程。Master会指定其他Worker启动Exeuctor,即ExecutorBackend进程,提供计算资源。流程和上面很相似,(3)Worker创建ExecutorRunner线程,ExecutorRunner会启动ExecutorBackend进程。
(4)ExecutorBackend启动后,向Driver的SchedulerBackend注册,这样Driver获取了计算资源就可以调度和将任务分发到计算节点执行。SchedulerBackend进程中包含DAGScheduler,它会根据RDD的DAG切分Stage,生成TaskSet,并调度和分发Task到Executor。对于每个Stage的TaskSet,都会被存放到TaskScheduler中。TaskScheduler将任务分发到Executor,执行多线程并行任务。


示例脚本:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # Run on a Spark Standalone cluster in cluster deploy mode with supervise  
  2. ./bin/spark-submit \  
  3. --class org.apache.spark.examples.SparkPi \  
  4. --master spark://207.184.161.138:7077 \  
  5. --deploy-mode cluster  
  6. --supervise  
  7. --executor-memory 20G \  
  8. --total-executor-cores 100 \  
  9. /path/to/examples.jar \  
  10. 1000  

4、yarn-client

         在yarn-client模式下,Driver运行在Client上,通过ApplicationMaster向RM获取资源。本地Driver负责与所有的executor Container进行交互,并将最后的结果汇总。结束掉终端,相当于kill掉这个spark应用。一般来说,如果运行的结果仅仅返回到terminal上时需要配置这个。

客户端的Driver将应用提交给Yarn后,Yarn会先后启动ApplicationMaster和executor,另外ApplicationMaster和executor都 是装载在container里运行,container默认的内存是1G,ApplicationMaster分配的内存是driver- memory,executor分配的内存是executor-memory。同时,因为Driver在客户端,所以程序的运行结果可以在客户端显 示,Driver以进程名为SparkSubmit的形式存在。

Yarn-client模式下作业执行流程:
1. 客户端生成作业信息提交给ResourceManager(RM)
2. RM在本地NodeManager启动container并将Application Master(AM)分配给该NodeManager(NM)
3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
5. Executor向本地启动的Application Master注册汇报并完成相应的任务

示例脚本:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # Run on a YARN client  
  2. export HADOOP_CONF_DIR=XXX  
  3. ./bin/spark-submit \  
  4. --class org.apache.spark.examples.SparkPi \  
  5. --master yarn-client \  
  6. --executor-memory 20G \  
  7. --num-executors 50 \  
  8. /path/to/examples.jar \  
  9. 1000  

5、Yarn-cluster

Spark Driver首先作为一个ApplicationMaster在YARN集群中启动,客户端提交给ResourceManager的每一个job都会在集群的worker节点上分配一个唯一的ApplicationMaster,由该ApplicationMaster管理全生命周期的应用。因为Driver程序在YARN中运行,所以事先不用启动Spark Master/Client,应用的运行结果不能在客户端显示(可以在history server中查看),所以最好将结果保存在HDFS而非stdout输出,客户端的终端显示的是作为YARN的job的简单运行状况


Yarn-cluster模式下作业执行流程:
1. 客户端生成作业信息提交给ResourceManager(RM)
2. RM在某一个NodeManager(由Yarn决定)启动container并将Application Master(AM)分配给该NodeManager(NM)
3. NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
4. Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
5. Executor向NM上的Application Master注册汇报并完成相应的任务

示例脚本:

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. # Run on a YARN cluster  
  2. export HADOOP_CONF_DIR=XXX  
  3. ./bin/spark-submit \  
  4. --class org.apache.spark.examples.SparkPi \  
  5. --master yarn-cluster \   
  6. --executor-memory 20G \  
  7. --num-executors 50 \  
  8. /path/to/examples.jar \  
  9. 1000  

二、执行注意事项

1、关于jar包

hadoop和spark的配置会被自动加载到SparkContext,因此,提交application时只需要提交用户的代码以及其它依赖包,这有2种做法:

(1)将用户代码打包成jar,然后在提交application时使用—-jar来添加依赖jar包(推荐使用这种方法)
(2)将用户代码与依赖一起打包成一个大包 assembly jar (打一个jar包,有可能整个jar打出来上百M,打包和发布过程慢)

2、调试模式

Spark  Standlong模式:

只支持FIFO

Spark On Mesos模式:有两种调度模式

1) 粗粒度模式(Coarse-grained Mode)
2) 细粒度模式(Fine-grained Mode)
Spark On YARN模式:

目前仅支持粗粒度模式(Coarse-grained Mode)

3、读取配置优先级

在代码中的SparkConf中的配置参数具有最高优先级,其次是传送spark-submit脚本的参数,最后是配置文件(conf/spark-defaults.conf)中的参数。
如果不清楚配置参数从何而来,可以使用spark-submit的—verbose选项来打印出细粒度的调度信息。


参考文章:

https://spark.apache.org/docs/latest/submitting-applications.html

http://www.cnblogs.com/lujinhong2/p/4666748.html

http://www.jianshu.com/p/20d5ae9631da

http://www.cnblogs.com/MOBIN/p/5857314.html


<think>好的,我现在需要回答用户关于默认端口9083是什么服务的问题,特别是和Spark相关的情况。用户提到在Spark的hive-site.xml文件中有一个配置项指向thrift://node1:9083。首先,我需要确认这个端口对应的服务是什么。 首先,我记得Hive Metastore通常使用Thrift服务来提供元数据访问。Hive Metastore默认的Thrift端口是9083,这可能是用户提到的端口。接下来,需要确认Spark如何与Hive Metastore交互。当Spark需要访问Hive的元数据时,比如在使用Spark SQL查询Hive表时,会通过hive-site.xml配置文件中的hive.metastore.uris属性连接到Hive Metastore服务。这个属性指定了Metastore服务的位置,这里用的是thrift协议,节点是node1,端口9083,所以应该就是Hive Metastore服务在node1节点上监听9083端口。 另外,可能需要解释一下Hive Metastore的作用,即存储表结构、分区信息等元数据,使得Spark或其他计算引擎可以访问这些元数据。同时,用户可能想知道如何验证这个服务是否正常运行,比如检查端口监听状态或者查看服务日志。还需要注意配置的正确性,比如主机名node1是否正确解析,防火墙是否开放9083端口等潜在问题。 最后,确保回答结构清晰,分点说明,使用用户提到的配置示例,并保持语言口语化,避免技术术语堆砌,让用户容易理解。同时,按照系统指令使用中文,正确使用LaTeX格式,虽然在这个问题中可能用不上数学公式,但如果有变量或代码部分,需要正确应用格式。</think>在Spark的Hive集成配置中,**端口9083**通常对应的是 **Hive Metastore服务的默认Thrift端口**。以下是关键信息分步说明: --- ### 1. **服务归属** - **Hive Metastore**:这是Hive的核心元数据管理服务,负责存储表结构、数据库信息、分区信息、文件路径等元数据。 - **通信协议**:通过**Thrift RPC协议**(跨语言服务通信框架)对外提供服务,默认端口为**9083**。 --- ### 2. **Spark与Hive Metastore的关系** Spark本身不管理元数据,当需要访问Hive表时,需通过以下配置连接到Hive Metastore: ```xml <!-- hive-site.xml配置示例 --> <property> <name>hive.metastore.uris</name> <value>thrift://node1:9083</value> </property> ``` - **作用**:告知Spark从`node1:9083`获取Hive元数据。 - **典型场景**:在Spark SQL中执行`SHOW DATABASES`或`SELECT * FROM hive_table`时,Spark会通过此端口查询Hive Metastore获取表信息。 --- ### 3. **验证服务状态** #### 方法1:检查端口监听 在服务器`node1`上执行: ```bash netstat -tuln | grep 9083 ``` 若输出包含`LISTEN`状态,则服务正常运行: ``` tcp6 0 0 :::9083 :::* LISTEN ``` #### 方法2:查看Hive Metastore日志 日志路径通常为`/var/log/hive/hive-metastore.log`,检查是否有启动成功记录: ``` INFO [main] metastore.HiveMetaStore: Started MetaStore Server on port 9083 ``` --- ### 4. **常见问题排查** - **连接失败**:检查`node1`主机名/IP是否正确,防火墙是否开放9083端口。 - **版本兼容性**:确保Spark与Hive Metastore的版本兼容(例如Spark 3.x通常需Hive 2.3+)。 - **多实例配置**:高可用场景下可能配置多个Metastore地址: ```xml <value>thrift://node1:9083,thrift://node2:9083</value> ``` --- ### 5. **扩展知识** - **元数据存储后端**:Hive Metastore的元数据实际存储在关系型数据库(如MySQL、PostgreSQL)中, Metastore服务仅提供访问接口。 - **Spark独立元数据库**:若不依赖Hive,Spark也可使用内置的Derby数据库,但仅限于单机模式。 --- 总结:端口9083是**Hive Metastore的Thrift服务端口**,Spark通过`hive.metastore.uris`配置与其通信,从而实现Hive元数据查询功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值