Spark~~Spark源码

本文详细解析了YARN集群环境下Spark应用的执行流程,包括环境准备(YARN-CLUSTER模式与client模式)、组件间的Socket通信、应用程序执行、Shuffle机制、内存管理等核心内容。

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

1. 环境准备(Yarn 集群)

YARN-CLUSTER模式

image-20211124002704832

Yarn-client模式

image-20211124002713881

Driver,Executor

1.SparkSubmit中的main->doSubmit->parseArguments

image-20211124002518085

 

  1. 注册AM,申请资源 ApplicationMaster->runDriver

image-20211124002757660

  1. 返回资源可用列表 ApplicationMaster->runDriver

    image-20211124002818594

  2. 处理可分配的容器
    ApplicationMaster->runDriver ->allocator.allocateResources() ->handleAllocatedContainers

image-20211124002826094image-20211124002826094

  1. 运行已经分配的容器(使用线程池启动)

  2. ApplicationMaster->runDriver->allocator.allocateResources()-> handleAllocatedContainers()->runAllocatedContainers(containersToUse: ArrayBuffer[Container])

    image-20211124002844068

  3. ApplicationMaster->runDriver->allocator.allocateResources()-> handleAllocatedContainers()->runAllocatedContainers(containersToUse: ArrayBuffer[Container])

image-20211124002903739

image-20211124002911467

10.ApplicationMaster->runDriver->allocator.allocateResources()-> handleAllocatedContainers()->runAllocatedContainers(containersToUse: ArrayBuffer[Container])->run()->startContainer->nmClient.startContainer(container.get, ctx)

image-20211124002926776

  1. nmClient.startContainer 中的ctx,需要设置准备的指令

image-20211124003001626

  1. prepareCommand() 方法内 启动Executor bin/java
    image-20211124003018800

  2. org.apache.spark.executor.YarnCoarseGrainedExecutorBackend->main->

    image-20211124003018800

image-20211124003104237

  1. YarnCoarseGrainedExecutorBackend->main->env.rpcEnv.setupEndpoint

    抽象的->NettyRpcEnv实现类->setupEndpont-> dispatcher.registerRpcEndpoint(name, endpoint)
    image-20211124003113963

    15.YarnCoarseGrainedExecutorBackend->main->onstart()

image-20211124003122211

  1. SparkContext->schedulerBackEnd 通信后台
    image-20211124003131351

  2. SparkContext->schedulerBackEnd(trait)->CoarseGrainedSchedulerBackend实现类->receiveAndReply

image-20211124003140757
image-20211124003150684

  1. YarnCoarseGrainedExecutorBackend->main->onstart()

    image-20211124003158579
    image-20211124003209353

2.组件通信(Socket)

  1. 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)]

  2. 创建Driver通信环境 SparkContext->createSparkEnv

image-20211124003322046

SparkContext->createSparkEnv->create

image-20211124003336131

  1. SparkContext->createSparkEnv->create->RpcEnv.create->Utils.startServiceOnPort-> nettyEnv.startServer(config.bindAddress, actualPort)->

    transportContext.createServer->new TransportServer->init(hostToBind, portToBind)->.channel(NettyUtils.getServerChannelClass(ioMode))->

    image-20211124003354439

image-20211124003420202

Driver => Executor

image-20211124003448297

3. 应用程序的执行

image-20211124003532249

  1. RDD 依赖

image-20211124003545102

  1. 阶段的划分

    Task数量为每个阶段最后一个RDD的分区数量之和

image-20211124003558330

  1. 任务的切分

  2. 任务的调度

    计算和数据存在不同的级别,这个级别称之为本地化级别

    进程本地化:数据和计算在同一个进程中

    节点本地化:数据和计算在同一个节点中

    机架本地化:数据和计算在同一个机架中

    image-20211124003607305

  3. 任务的执行

image-20211124003626603

4.Shuffle

(1) Shuffle 的原理和执行过程

DAGScheduler->ShuffleMapTask->runTask()-> dep.shuffleWriterProcessor

  • shuffleWriterProcessor(写处理器)

  • ShuffleManager: Hash(早期) & Sort(当前)

image-20211124003710053

(2)Shuffle 写磁盘

(3)Shuffle 读取磁盘

5.内存的管理

1.内存的分类

2.内存的配置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值