1. 环境准备(Yarn 集群)
YARN-CLUSTER模式
Yarn-client模式
Driver,Executor
1.SparkSubmit中的main->doSubmit->parseArguments
- 注册AM,申请资源 ApplicationMaster->runDriver
-
返回资源可用列表 ApplicationMaster->runDriver
-
处理可分配的容器
ApplicationMaster->runDriver ->allocator.allocateResources() ->handleAllocatedContainers
-
运行已经分配的容器(使用线程池启动)
-
ApplicationMaster->runDriver->allocator.allocateResources()-> handleAllocatedContainers()->runAllocatedContainers(containersToUse: ArrayBuffer[Container])
-
ApplicationMaster->runDriver->allocator.allocateResources()-> handleAllocatedContainers()->runAllocatedContainers(containersToUse: ArrayBuffer[Container])
10.ApplicationMaster->runDriver->allocator.allocateResources()-> handleAllocatedContainers()->runAllocatedContainers(containersToUse: ArrayBuffer[Container])->run()->startContainer->nmClient.startContainer(container.get, ctx)
- nmClient.startContainer 中的ctx,需要设置准备的指令
-
prepareCommand() 方法内 启动Executor bin/java
-
org.apache.spark.executor.YarnCoarseGrainedExecutorBackend->main->
-
YarnCoarseGrainedExecutorBackend->main->env.rpcEnv.setupEndpoint
抽象的->NettyRpcEnv实现类->setupEndpont-> dispatcher.registerRpcEndpoint(name, endpoint)
15.YarnCoarseGrainedExecutorBackend->main->onstart()
-
SparkContext->schedulerBackEnd 通信后台
-
SparkContext->schedulerBackEnd(trait)->CoarseGrainedSchedulerBackend实现类->receiveAndReply
-
YarnCoarseGrainedExecutorBackend->main->onstart()
2.组件通信(Socket)
-
rpcEnv->NettyRpcEnvFactory()
Netty 通信框架 AIO
BIO :阻塞式IO
NIO:非阻塞式IO
AIO:异步非阻塞式IO
Linux对AIO支持不够好,Windows支持AIO Linux采用Epoll方式模仿AIO操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71Nev2ai-1658337634786)(C:\Users\gcc\AppData\Roaming\Typora\typora-user-images\image-20211124003312012.png)]
-
创建Driver通信环境 SparkContext->createSparkEnv
SparkContext->createSparkEnv->create
-
SparkContext->createSparkEnv->create->RpcEnv.create->Utils.startServiceOnPort-> nettyEnv.startServer(config.bindAddress, actualPort)->
transportContext.createServer->new TransportServer->init(hostToBind, portToBind)->.channel(NettyUtils.getServerChannelClass(ioMode))->
Driver => Executor
3. 应用程序的执行
- RDD 依赖
-
阶段的划分
Task数量为每个阶段最后一个RDD的分区数量之和
-
任务的切分
-
任务的调度
计算和数据存在不同的级别,这个级别称之为本地化级别
进程本地化:数据和计算在同一个进程中
节点本地化:数据和计算在同一个节点中
机架本地化:数据和计算在同一个机架中
-
任务的执行
4.Shuffle
(1) Shuffle 的原理和执行过程
DAGScheduler->ShuffleMapTask->runTask()-> dep.shuffleWriterProcessor
-
shuffleWriterProcessor(写处理器)
-
ShuffleManager: Hash(早期) & Sort(当前)
(2)Shuffle 写磁盘
(3)Shuffle 读取磁盘
5.内存的管理
1.内存的分类
2.内存的配置