Spark源代码::Spark多线程::NettyRpcEnv.ask解读

背景

Spark中有很多异步处理的例子,每一个地方都值得好好去审视一番,对辅助理解spark的机理以及为自己写出优雅的代码都会有很大的帮助。

NettyRpcEnv.ask解读

RpcEnv作用

NettyRpcEnvRpcEnv的在spark中的唯一一个实现。RpcEnv是什么呢,可以先看一下它的class头信息

/**
 * An RPC environment. [[RpcEndpoint]]s need to register itself with a name to [[RpcEnv]] to
 * receives messages. Then [[RpcEnv]] will process messages sent from [[RpcEndpointRef]] or remote
 * nodes, and deliver them to corresponding [[RpcEndpoint]]s. For uncaught exceptions caught by
 * [[RpcEnv]], [[RpcEnv]] will use [[RpcCallContext.sendFailure]] to send exceptions back to the
 * sender, or logging them if no such sender or `NotSerializableException`.
 *
 * [[RpcEnv]] also provides some methods to retrieve [[RpcEndpointRef]]s given name or uri.
 */

就是一句话,RPC的环境。在这里,最重要的2个操作莫过于

  • 可以去注册RpcEndpoint
  • 可以去异步获取RpcEndpointRef

RpcEndpointRpcEndpointRef是什么呢,在这里不做详细赘述,其他的文章中会详细说明,简单来讲一下

简单回顾RpcEndpointRpcEndpointRef

RpcEndpoint

  • RpcEndpoint

    众所周知,spark内部会有executordriver等角色,他们之间的通信都采用利用Netty,在executor或者driver上并不是只启动1个Netty的服务,针对不同的功能会有多个Netty的RPC服务开启,利用不同的端口号进行区分。服务间通信后,通的“信”被很多种逻辑单元来处理,如Inbox,如EventLoop等,这些都是工具级别的单元,而被抽象出来作为可插拔可扩展的大的逻辑功能模块在Spark中就叫做RpcEndpoint,它是用来处理从其他client端发送或者server端返回过来的message的模块。RpcEndpoint本身是一个trait,它可以有多种的实现

RpcEndpointRef

  • RpcEndpointRef

    spark之前的网络通信都是采用akka,改版后采用的是Netty,在akka中,如果一个两个节点间的通信是利用目的方的actorRef来进行的通信的,即AActor 希望发送消息到 BActor,需要BActorRef来发送消息。Spark的网络通信升级到Netty后,Endpoint就可以间接理解成原来的Actor,那么发送消息到另一个Actor的话,也需要RpcEndpoint的Ref,即RpcEndpointRef。这个概念乍一看有点懵,试想,从A发送消息到B,能发送的前提是A先拥有了一个B的”引用“,这在普通的Http服务中貌似很不能被理解,我想访问某一台机器按说只需要知道对方的IP和Port不就OK了,现在还需要对方的一个“替身”?这是什么鬼?带着问题我们可以持续往下看即可,这里你只需要这样意识即可:

    • 用来访问B machine的RpcEndpointRef你理解成就是B machine的IP和Port的一个被包装后的实例即可

图解RpcEndpointRpcEndpointRef

  • 图解一下

    A machine可以是物理机可以是虚拟机,B machine可以是和A同一台物理机、虚拟机(端口号不同),也可以是不同的(在spark中甚至于有自己发给自己的msg,后续会讲)。那么从A发送消息到B的话,使用的是B的RpcEndpointRef,通过它发送消息到B machine

    • 【图1】要如何访问

image.png
* 【图2】内部的原理

image.png
* 【图3】B machine的RpcEndpointRef的实例是啥(简化版)

image.png

简单回顾Driver和Executor

Ask,顾名思义——问。可能是打个招呼,看看在不在,询问一下,等等。这个就是NettyRpcEnv.ask的作用所在。为了讲NettyRpcEnv.ask的作用,还需要简单的串一下一下概念和流程

Driver线程和Executor进程

首先,需要明确两个事情,在yarn环境下

  • Driver是在ApplicatioMaster进程中执行的一个线程

    严格来说,其实这个说法也不太正确,因为Driver其实是在用户的class的时候,在形成sparkContext上下文环境的一个产物,本身执行的其实是用户class线程,在这个线程中建立了SparkEnv以及RpcEnv等等,并且建立了Driver的Netty的Service等等,与Executor相互通信

  • Executor则是一个个的进程,通过java命令在每一个节点上启动的

Yarn系列以及 ApplicatioMaster是什么这里不做赘述,其他文章中会细讲。

其次,在这里只需要了解到,Driver本身是一个协调调度节点,它可以去分配任务给Executor,并且掌握着Executor的情况,分配就是把Task发送给

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值