StreamManager

StreamManager类说明

StreamManager 官方说明如下:

The StreamManager is used to fetch individual chunks from a stream. This is used in TransportRequestHandler in order to respond to fetchChunk() requests. Creation of the stream is outside the scope of the transport layer, but a given stream is guaranteed to be read by only one client connection, meaning that getChunk() for a particular stream will be called serially and that once the connection associated with the stream is closed, that stream will never be used again.
 
即StreamManager用于从流中获取单个块。这在TransportRequestHandler中用于响应fetchChunk()请求。流的创建超出了传输层的范围,但是保证给定流只能由一个客户端连接读取,这意味着特定流的getChunk()将被串行调用,并且一旦与流关联的连接关闭后,该流将永远不会再次使用。

StreamManager两个子类实现

它有两个子类:

可以看到它有两个实现,一个实现是OneForOneStreamManager,也就是说的getChunk 方法被串行调用,一旦关闭不再使用。其关键方法 getChunk 如下:

其中,sream 维护了 streamId 和 StreamState 的映射关系。

StreamState 的类结构如下:

appId 是TransportClient 的 id 号;

associatedChannel 表示 与之关联的 channel 对象;

buffer 是 一个 迭代的 ManagedBuffer 对象,其中ManagedBuffer是一个不可变的byte数组的抽象;

chunksBeingTransferred保存了正在传输的chunk number;

curChunk 保存了已经完成的chunk 的 下标索引。

另一个实现是NettyStreamManager是用于支持管理器注册资源的,主要被SparkContext 使用,它不支持getChunk 这个关键的方法。

个人观点,这个类不应该继承StreamManager 了,因为它的关键功能 getChunk 都不能用了。

RpcHandler

NettyRpcHandler继承了RpcHandler,并实现了 logging trait。

超类RpcHandler

其官方解释如下:

Handler for sendRPC() messages sent by TransportClients.

即它是处理 TransportClient 发送的 rpc 消息的handler。也就是说,这是在server 端使用的

其类结构如下:

其关键方法解释如下:
1. receiveStream 方法:接收单个RPC消息,其中包括要作为流接收的数据。在此方法中抛出的任何异常将以字符串形式作为标准RPC故障发送回客户端。对于单个TransportClient(即通道),不会并行调用此方法和receive方法。从流中读取数据时出错(org.apache.spark.network.client.StreamCallback.onData(String,ByteBuffer))将导致整个通道失败。在org.apache.spark.network.client.StreamCallback.onComplete(String)中对流进行“后处理”失败将导致rpcFailure,但该通道将保持活动状态。
2. receive 方法:接收单个RPC消息,其中包括要作为流接收的数据。在此方法中抛出的任何异常将以字符串形式作为标准RPC故障发送回客户端。对于单个TransportClient(即通道),不会并行调用此方法和#receive。从流中读取数据时出错(org.apache.spark.network.client.StreamCallback.onData(String,ByteBuffer))将导致整个通道失败。在org.apache.spark.network.client.StreamCallback.onComplete(String)中对流进行“后处理”失败将导致rpcFailure,但该通道将保持活动状态。
有两个重载的 receive 方法,其关系如下:

ONE_WAY_CALLBACK 方法是一个默认的OneWayCallback 实现,主要是用于打印日志track。

NettyRpcHandler

子类NettyRpcHandler 的官方说明如下:

Dispatches incoming RPCs to registered endpoints. The handler keeps track of all client instances that communicate with it, so that the RpcEnv knows which TransportClient instance to use when sending RPCs to a client endpoint (i.e., one that is not listening for incoming connections, but rather needs to be contacted via the client socket). Events are sent on a per-connection basis, so if a client opens multiple connections to the RpcEnv, multiple connection / disconnection events will be created for that client (albeit with different RpcAddress information).

即,它是负责将传入的RPC调度到已注册的端点上的handler。它跟踪与之通信的所有客户端实例,以便RpcEnv知道在将RPC发送到客户端端点时使用哪个TransportClient实例(即,一个不监听传入连接,但需要通过客户端套接字)。事件是基于每个连接发送的,因此如果客户端打开与RpcEnv的多个连接,将为该客户端创建多个连接/断开连接事件(尽管具有不同的RpcAddress信息)。

其关键方法如下:

首先它会根据传进来的TransportClient的channel获取到 remoteAddress 的信息,然后和ByteBuffer 类型的message 进一步封装成RequestMessage然后将接收进来的事件post给Dispatcher对象,Dispatcher再做进一步分发。

spark 源码分析之九--Spark RPC剖析之StreamManager和RpcHandler的更多相关文章

  1. spark 源码分析之十一--Spark RPC剖析之TransportClient、TransportServer剖析

    TransportClient类说明 先来看,官方文档给出的说明: Client for fetching consecutive chunks of a pre-negotiated stream. ...

  2. spark 源码分析之十--Spark RPC剖析之TransportResponseHandler、TransportRequestHandler和TransportChannelHandler剖析

    spark 源码分析之十--Spark RPC剖析之TransportResponseHandler.TransportRequestHandler和TransportChannelHandler剖析 ...

  3. Spark源码分析之九:内存管理模型

    Spark是现在很流行的一个基于内存的分布式计算框架,既然是基于内存,那么自然而然的,内存的管理就是Spark存储管理的重中之重了.那么,Spark究竟采用什么样的内存管理模型呢?本文就为大家揭开Sp ...

  4. spark 源码分析之十七 -- Spark磁盘存储剖析

    上篇文章 spark 源码分析之十六 -- Spark内存存储剖析 主要剖析了Spark 的内存存储.本篇文章主要剖析磁盘存储. 总述 磁盘存储相对比较简单,相关的类关系图如下: 我们先从依赖类 Di ...

  5. spark 源码分析之十二 -- Spark内置RPC机制剖析之八Spark RPC总结

    在spark 源码分析之五 -- Spark内置RPC机制剖析之一创建NettyRpcEnv中,剖析了NettyRpcEnv的创建过程. Dispatcher.NettyStreamManager.T ...

  6. Spark 源码分析系列

    如下,是 spark 源码分析系列的一些文章汇总,持续更新中...... Spark RPC spark 源码分析之五--Spark RPC剖析之创建NettyRpcEnv spark 源码分析之六- ...

  7. Spark源码分析之八:Task运行(二)

    在<Spark源码分析之七:Task运行(一)>一文中,我们详细叙述了Task运行的整体流程,最终Task被传输到Executor上,启动一个对应的TaskRunner线程,并且在线程池中 ...

  8. spark 源码分析之十八 -- Spark存储体系剖析

    本篇文章主要剖析BlockManager相关的类以及总结Spark底层存储体系. 总述 先看 BlockManager相关类之间的关系如下: 我们从NettyRpcEnv 开始,做一下简单说明. Ne ...

  9. Spark源码分析 – 汇总索引

    http://jerryshao.me/categories.html#architecture-ref http://blog.csdn.net/pelick/article/details/172 ...

随机推荐

  1. Linux基础(二)

    网卡的启动与关闭 ipup ens33 启动网卡 ifdown 关闭网卡 普通用户没有该权限 root用户,管理员,普通用户的权限 root 至高无上的 root用户所在的组是root组 ​ 管理员 ...

  2. js&jq遇到的问题(不断更新中)

    1.普通事件和事件绑定: 代码: 普通事件: var btn=document.getElementById('btn'); btn.onclick=function(){ alert("c ...

  3. log4net插入access自定义字段

    1.创建表格 2.创建log4net.xml,并设置属性始终复制,关键属性 <bufferSize value="1" /> <conversionPattern ...

  4. CSS中浮动的使用

    CSS有两个性质 第一个是 :继承性 第二个是:层叠性: 选择器的一种选择能力,谁的权重大就选谁 { 里面分两种情况: 分别是 选中和没选中. 1.选不中的情况下,走继承性,(font,color,t ...

  5. Python操作ElasticSearch

    Python批量向ElasticSearch插入数据 Python 2的多进程不能序列化类方法, 所以改为函数的形式. 直接上代码: #!/usr/bin/python # -*- coding:ut ...

  6. umeditor 上传图片 相对路径的设置和保存

    此篇文章仅献给已实现百度富文本编辑器,想要设置相对路径并保存到数据库,方便以后项目迁移. 使用的版本为1.2.3,适用图片上传中点击以及拖拽功能. //保存图片相对地址的设置        //1.请 ...

  7. 谷歌地球 Google Earth v7.3.2.5495 专业版

    谷歌地球(Google Earth,GE)是一款谷歌公司开发的虚拟地球软件,它把卫星照片.航空照相和GIS布置在一个地球的三维模型上.谷歌地球于2005年向全球推出,被<PC 世界杂志>评 ...

  8. Node.js热部署代码,实现修改代码后自动重启服务方便实时调试

    写PHP等脚本语言的时候,已经习惯了修改完代码直接打开浏览器去查看最新的效果.而Node.js 只有在第一次引用时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,这种设计虽然有利于提高性能,却 ...

  9. css单位中px和em,rem的区别

    css单位中分为相对长度单位.绝对长度单位. 今天我们主要讲解rem.em.px这些常用单位的区别和用法. px(绝对长度单位) 相信对于前端来说px这个单位是大家并不陌生,px这个单位,兼容性可以说 ...

  10. xfs 文件系统修复

    pvcreate /dev/sdb1 pvcreate /dev/sdc1 pvcreate /dev/sdd1 vgcreate vg_bricks /dev/sdb1 vgcreate vg_br ...