spark2.1源码分析4:spark-network-common模块的设计原理
来源:互联网 发布:2017大数据的发展现状 编辑:程序博客网 时间:2024/04/26 16:38
spark-network-common模块底层使用netty作为通讯框架,可以实现rpc消息、数据块和数据流的传输。
Message类图:
所有request消息都是RequestMessage的子类
所有response消息都是ResponseMessage的子类
TransportClient主要提供了三个方法:
//通过给定的streamId,获取远端数据流
public void stream(final String streamId, final StreamCallback callback);
//发送一份不透明的消息到远端
public long sendRpc(ByteBuffer message, final RpcResponseCallback callback);
//通过给定的streamId,获取远端的数据块
public void fetchChunk(long streamId,final int chunkIndex,final ChunkReceivedCallback callback);
Channel Pipeline:
通过TransportClientFactory的createClient方法追踪ChannelInitializer设置,最后在TransportContext的initializePipeline方法中可以看到具体的Handler的配置:
channel.pipeline() .addLast("encoder", encoder) .addLast(TransportFrameDecoder.HANDLER_NAME, NettyUtils.createFrameDecoder()) .addLast("decoder", decoder) .addLast("idleStateHandler", new IdleStateHandler(0, 0, conf.connectionTimeoutMs() / 1000)) .addLast("handler", channelHandler);
此处得到的handler链为:
MessageEncoder-->TransportFrameDecoder-->MessageDecoder-->IdleStateHandler-->TransportChannelHandler
MessageEncoder:负责将消息转换为netty框架中的ByteBuf
MessageDecoder:负责网络传输的的ByteBuf转换为具体的消息
TransportFrameDecoder:负责接收网络传输的ByteBuf,解析为一个指定大小的ByteBuf交予MessageDecoder,或者交给StreamInterceptor处理
IdleStateHandler:心跳检测
TransportChannelHandler:负责消息的具体处理
发送端发送消息的流程:
- 通过TransportClient的实例发送RequestMessage消息
MessageEncoder把消息转换为ByteBuf
所有RequestMessage的子类都继承了AbstractMessage,而AbstractMessage有一个叫body的filed,该字段在RpcRequest中被用来存储具体的请求内容(不止RpcRequest)。当body为空时该消息直接转换为ByteBuf;不为null时,MessageEncoder将消息转换为MessageWithHeader,MessageWithHeader继承了AbstractReferenceCounted ,实现了FileRegion ,最后消息仍会转换为ByteBuf。注意:MessageWithHeader提供了发送文件的能力。MessageWithHeader类:
class MessageWithHeader extends AbstractReferenceCounted implements FileRegion- ByteBuf被发送到网络(ByteBuf中包含这个消息的总长度、字段长度、具体内容等信息)
接收端接收消息并响应:
- TransportFrameDecoder负责拼接一个RequestMessage所需的完整ByteBuf
- MessageDecoder将消息解析为一个RequestMessage消息
- TransportChannelHandler将消息交给TransportRequestHandler具体处理
- TransportRequestHandler将ResponseMessage消息传递给MessageEncoder
- MessageEncoder把消息转换为ByteBuf(同上)
发送端接收响应消息:
- TransportFrameDecoder负责拼接一个消息所需的完整ByteBuf,如果是StreamResponse消息并且body是一个FileRegion,那么先拼接这个消息的ByteBuf(注意:StreamResponse消息最终传输到网络上时本身不包含FileRegion的ByteBuf)
- MessageDecoder将消息解析为一个ResponseMessage消息
- TransportChannelHandler将消息交给TransportResponseHandler具体处理
- 如果StreamResponse是一个包含FileRegion的消息,TransportResponseHandler在Channel Pipeline中添加一个handler:StreamInterceptor。TransportFrameDecoder将使用StreamInterceptor处理后续的FileRegion的ByteBuf。
- spark2.1源码分析4:spark-network-common模块的设计原理
- spark-deploy-模块源码分析
- spark-storage模块源码分析
- Spark2.2 job触发流程原理剖析与源码分析
- Spark2.2 TaskScheduler原理剖析与源码分析
- Spark2.2 Executor原理剖析及源码分析
- Spark2.2 Task原理分析及源码解析
- spark2.1源码分析1:Win10下IDEA源码阅读环境的搭建
- spark2.1源码分析2:从SparkPi分析一个job的执行
- Spark源码分析之cahce原理分析
- Spark源码分析之-scheduler模块
- Spark源码分析之-deploy模块
- Spark源码分析之-scheduler模块
- Spark源码分析——deploy模块
- Spark SQL Columnar模块源码分析
- Spark源码分析之-scheduler模块
- Spark源码分析之-deploy模块
- Spark源码分析之-Storage模块
- 设计模式-建造者模式
- 关于Linux之curses.h文件
- 工厂模式(C++)
- strcpy、memcpy
- spring quartz:Checking for available updated version of Quartz
- spark2.1源码分析4:spark-network-common模块的设计原理
- ububtu16.04安装Opencv3.1 包含contrib部分
- 对于rhel 6.6 内核2.6.32-504.el6安装asmlib问题
- 阿里免费教你学习前端开发CSS基础
- 项目A 引入到项目B 在maven中引入另一个项目 项目A 的方法引入到项目B
- html2canvas库使用中出现的问题及解决方案
- 【Qt】Qt程序编译成功,执行时报错:程序异常结束,crashed
- 回顾大一·C语言编程3.4(4)
- 笔记:关于Gradle error Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m的解决方案