spark内核架构剖析--Application执行过程

本文深入探讨Spark在standalone模式下的内核架构,包括Application、spark-submit、Driver、SparkContext等核心概念,详细阐述了从提交作业到Executor执行Task的全过程,涉及DAGScheduler、TaskScheduler和Master、Worker的角色互动。

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

以standalone模式(基于spark的Master—Worker)解析spark内核架构,先罗列spark内核中的几个概念再详解程序的执行流程。

一、常用名词

1、Application
2、spark-submit
3、Driver
4、SparkContext
5、Master
6、Worker
7、Executor
8、Job
9、DAGScheduler
10、TaskScheduler

11、ShuffleMapTask and ResultTask

二、架构详解

1、在客户端机器上用spark-submit来提交我们的程序,以standload模式来提交作业

2、spark会通过反射的方式,创建和构造一个DriverActor进程(Driver进程的作用是执行我们的Application,就是我们的代码)

3、从代码中可以看出,每次都是先构造SparkConf,在构造SparkContext或SparkSession

4、sparkContext在初始化时,做的最重要两件事就是构造DAGScheduler和TaskScheduler(它有自己的后台进程)

5、TaskSchedule实际上,负责通过后台进程去连接Master,向Master注册Application

6、Master接收到Application注册请求后,会使用自己的资源调度算法,在spark集群的worker上,为这个Application启动多个Executor

7、Master会连接Worker,通知worker为Application启动一个或多个Executor(进程)

8、Executor启动后,第一件事情是到反向注册到TaskScheduler上,这样TaskScheduler就知道服务于自己的Application的Executor有哪些

9、所有的Executor注册到TaskScheduler后,Driver就完成了sparkContext或sparkSession的初始化,

10、继续执行代码 ,每执行到一个Action就会创建一个job

11、job会被提交给DAGScheduler,DAGScheduler会调用stage划分算法,将job划分为多个stage,每个stage创建一个stageSet

12、DAGScheduler会把stageSet给到TaskScheduler,TaskScheduler会把每个TaskSet里每个task提交到executor上执行(task分配算法

13、executor中有个重要的组件--线程池。Executor每接收到一个task,都会用TaskRunner来封装task,然后从线程池里取出一个线程来执行这个task

14、TaskRunner的作用是将我们编写的代码,也就是要执行的算子和函数,拷贝、反序列化,然后执行task

15、Task有两种:ShuffleMapTask和ResultTask,只有最后一个stage是ResultTask,其他都是ShuffleMapTask

16、所以,最后整个spark应用程序的执行,就是stage分批次作为taskSet提交到executor执行,每个task针对RDD的一个partition,执行我们定义的算子和函数。以此类推,直到所有操作执行结束



<think>嗯,用户遇到了两个问题:虚拟机保存数据时进程被杀死,以及Spark提交命令的参数配置疑问。我需要先分别分析这两个问题的可能原因,然后给出解决方案。 首先,虚拟机保存数据时进程被杀,这可能和内存不足有关。Linux系统在内存不足时会触发OOM Killer,终止占用内存多的进程。用户需要检查系统日志,比如/var/log/messages或dmesg,看看是否有OOM的记录。解决方案可能包括增加虚拟机的内存,或者调整应用程序的内存使用,比如优化代码减少内存占用,或者使用更高效的数据结构。 另外,用户提到Spark提交命令的参数配置。Spark任务在集群模式下运行时,Driver和Executor的内存设置很关键。如果配置不当,可能导致任务失败。例如,driver-memory和executor-memory需要根据集群资源合理分配。此外,Spark的动态资源分配和并行度设置也会影响性能。用户可能需要调整这些参数,避免内存溢出或资源不足的问题。 引用中提到Spark standalone模式的区别,以及PermGen内存溢出的解决方法。这可能和用户的问题相关,比如在Spark-submit中配置额外的Java参数来增加PermGen的大小,或者关闭内存检查以避免任务被终止。另外,Sqoop任务找不到驱动的问题提醒用户要确保依赖的库正确放置在集群的各个节点上,尤其是HDFS的相关路径。 总结下来,用户的问题主要集中在内存管理和Spark参数配置上。需要指导用户如何检查系统日志,调整内存参数,优化代码,以及正确配置Spark-submit的各个选项,比如executor内存、cores,动态资源分配等。同时,引用中的案例可以作为参考,比如增加PermSize,处理驱动依赖等。</think>### 虚拟机保存数据时进程被杀死的原因及解决方案 #### 原因分析 1. **内存不足** - **系统OOM Killer机制**:当物理内存和交换空间(Swap)不足时,Linux内核会通过OOM Killer终止占用内存最多的进程[^1]。 - **Spark任务内存溢出**:若运行Spark任务时未合理配置内存参数(如`spark.driver.memory`或`spark.executor.memory`),可能导致内存溢出触发进程终止[^2][^3]。 2. **磁盘空间不足** - 虚拟机存储路径或HDFS存储空间不足时,数据保存操作会失败。 3. **权限问题** - 用户对目标存储路径(如HDFS目录)无写入权限。 --- #### 解决方案 1. **调整内存配置** - **增加虚拟机内存**:在虚拟机管理工具(如VMware、VirtualBox)中调整内存分配。 - **优化Spark参数**:在`spark-submit`命令中合理配置以下参数: ```bash spark-submit \ --driver-memory 4g \ # Driver进程内存 --executor-memory 8g \ # Executor进程内存 --conf spark.driver.extraJavaOptions="-XX:PermSize=256M -XX:MaxPermSize=512M" \ # 避免PermGen溢出[^2] --conf spark.memory.fraction=0.8 \ # 调整内存分配比例 --conf spark.memory.storageFraction=0.3 \ --class Main your_application.jar ``` - **关闭内存检查**:通过`--conf spark.yarn.executor.memoryOverhead=2048`避免资源限制导致任务终止[^3]。 2. **释放磁盘空间** - 清理虚拟机临时文件或扩展磁盘容量。 - 检查HDFS空间使用:`hdfs dfs -df -h`。 3. **检查权限** - 确保用户对目标路径有写入权限:`hdfs dfs -chmod 755 /your/path`。 --- ### Spark-submit 命令参数配置指南 1. **核心参数** - `--master`:指定集群模式,如`yarn`、`spark://host:port`。 - `--deploy-mode`:选择`client`或`cluster`模式(Driver运行位置)。 - `--num-executors`:设置Executor数量。 2. **内存与CPU优化** - **Executor配置**: ```bash --executor-memory 8g \ # 单Executor内存 --executor-cores 4 \ # 单Executor CPU核心数 ``` - **动态资源分配**:启用`spark.dynamicAllocation.enabled=true`提高资源利用率。 3. **依赖与日志** - `--jars`:附加依赖的JAR包。 - `--files`:上传配置文件(如`log4j.properties`)。 --- ### 示例命令 ```bash spark-submit \ --master yarn \ --deploy-mode cluster \ --driver-memory 4g \ --executor-memory 8g \ --executor-cores 4 \ --num-executors 10 \ --conf spark.dynamicAllocation.enabled=true \ --conf spark.driver.extraJavaOptions="-XX:MaxPermSize=512M" \ --class com.example.Main \ your_application.jar ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值