目录
前言
又是很久没有连载,万分抱歉。今天(注:其实也包含昨天)需要盯着双11各个实时任务的运行,目前仍然无事发生,抽空来写几笔吧。
在前面的文章中,我们了解了块管理器BlockManager管理下的读写流程。并且已经知道,BlockManager读取块时,如果块在本地找不到,就会去集群内的远端节点去获取。同理,如果BlockManager写入块时需要复制,那么除了在本地写入之外,也要再写一份到远端节点。BlockManager与远端节点的交互就得依赖块传输服务BlockTransferService。但是BlockTransferService需要依赖之前偷懒没有讲过的RPC底层组件,所以现在得把这个坑填上,计划用3篇文章来填。
由于Spark 2.x的RPC环境是完全基于Netty搞的,所以如果看官对Netty有基本的了解的话,读起来会顺畅一点。
RPC底层概览
在系列的文章#8中,我们讲到了RPC环境——即NettyRpcEnv的构建和属性成员。来复习一下。
代码#B1.1 - o.a.s.rpc.netty.NettyRpcEnv中的部分属性成员
private[netty] val transportConf = SparkTransportConf.fromSparkConf(
conf.clone.set("spark.rpc.io.numConnectionsPerPeer", "1"),
"rpc",
conf.getInt("spark.rpc.io.threads", 0))
private val dispatcher: Dispatcher = new Dispatcher(this, numUsableCores)
private val streamManager = new NettyStreamManager(this)
private val transportContext = new TransportContext(transportConf,
new NettyRpcHandler(dispatcher, this, streamManager))
private val clientFactory = transportContext.createClientFactory(createClientBootstraps())
@volatile private var server: TransportServer = _
- TransportConf:传输配置,作用在RPC环境中类似于SparkConf,负责管理与RPC相关的各种配置。
- Dispatcher:调度器,或者叫分发器,用于将消息路由到正确的RPC端点,它的逻辑在文章#9中已经讲过,就不再提了。
- S