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. Geoserver发布Image Mossaic图层

    1数据准备:请事先在arcgis desktop软件中将栅格数据拼接完毕,并为每一幅影像生成一个prj文件,坐标系一定是要有的,不然Mossaic图层发布不了. 2."数据存储“->& ...

  2. python自动化测试之mysql5.0版本数据库查询数据时出现乱码问题分析

    1.确保数据库编码是utf8编码.若不是,请将my.ini的client,mysql,mysqld三个字段下面添加default-character-set = utf8,这样可以永久改变在新建数据库 ...

  3. SQL Server 2012完全备份、差异备份、事务日志备份和还原操作;

    SQL Server 2012完全备份.差异备份.事务日志备份和还原操作: 1.首先,建立一个测试数据库,TestA:添加一张表,录入二条数据:备份操作这里我就不详细截图和讲解了.相信大家都会备份,我 ...

  4. 【需要重新维护】Redis笔记20170811视频

    很多内容都是抄的,个人记录 1.windows下初见 安装 进入目录 修改配置文件(暂时使用默认,未配置环境变量) 目录下:redis-server.exe启动服务 新建命令提示符,目录下,redis ...

  5. php __autoload 在有命名空间的时候失效(使用的局限性)

    如果要使用__autoload方法,则不能再之前使用namespace,    使用命名空间,则至少php5.3不再调用__autoload方法    因此如果需要使用__autoload和命名空间, ...

  6. Go语言学习——channel的死锁其实没那么复杂

    1 为什么会有信道 协程(goroutine)算是Go的一大新特性,也正是这个大杀器让Go为很多路人驻足欣赏,让信徒们为之欢呼津津乐道. 协程的使用也很简单,在Go中使用关键字“go“后面跟上要执行的 ...

  7. Linux文件系统目录结构详解

    在我们初学嵌入式Linux时,首先学习的就是Linux的最小根文件系统:下面我将为初学者们详细的阐述一下Linux的最小根文件系统. 根目录在Linux中即为“/”,要进入根目录,命令“cd  /”即 ...

  8. python爬虫之快速对js内容进行破解

    python爬虫之快速对js内容进行破解 今天介绍下数据被js加密后的破解方法.距离上次发文已经过去半个多月了,我写文章的主要目的是把从其它地方学到的东西做个记录顺便分享给大家,我承认自己是个懒猪.不 ...

  9. JavaScript 常见的六种继承方式

    JavaScript 常见的六种继承方式 前言 面向对象编程很重要的一个方面,就是对象的继承.A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 大部分 ...

  10. decimal.ToString()问题

    decimal dt = 1.00M;            decimal dt1 = 1M;                         bool d = dt == dt1;         ...