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. Android native进程间通信实例-binder篇之——简单的单工通信

    网上找了很多binder相关文章,大部分都是在跟踪binder实现源代码,然后再把框架代码贴出来,看着实在费力. 这篇文章从实际出发,直接用一个案例下手,后续想了解binder相关原理的话,可以参考& ...

  2. AI行为树的工作原理

    很久没写博客了,最近在项目刚部署到测试服,需要进行压测,老大相当专业的用了行为树来组织压测机器人的代码,这段时间陆陆续续在网上看了不少关于行为树的文章,其中有一篇我觉得写得非常到位,它原文是英文,链接 ...

  3. Java中初始化的相关问题

    目录 局部变量的初始化 成员变量的初始化 构造器初始化 静态数据的初始化 总结 已经快半个月没写博客了,这周在看 Thinking in Java 这本书,准备将书中的第五章和第七章的内容整合一下,写 ...

  4. Spring Cloud全链路追踪实现(Sleuth+Zipkin+RabbitMQ+ES+Kibana)

    简介 在微服务架构下存在多个服务之间的相互调用,当某个请求变慢或不可用时,我们如何快速定位服务故障点呢?链路追踪的实现就是为了解决这一问题,本文采用Sleuth+Zipkin+RabbitMQ+ES+ ...

  5. 大白话5分钟带你走进人工智能-第30节集成学习之Boosting方式和Adaboost

    目录 1.前述: 2.Bosting方式介绍: 3.Adaboost例子: 4.adaboost整体流程: 5.待解决问题: 6.解决第一个问题:如何获得不同的g(x): 6.1 我们看下权重与函数的 ...

  6. 获取Spring中的Bean

    1.Utils工具类 package com.xxx.common.helper; import org.springframework.beans.BeansException; import or ...

  7. IIS下网站对options请求直接返回404

    什么是options请求 options请求为发送非简单跨域请求前的预检请求,若该请求未正常返回,浏览器会阻止后续的请求发送. 一般情况下,有三种方式会导致浏览器发起预检请求 1.请求的方法不是GET ...

  8. java 获取客户端的ip地址

    import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHo ...

  9. Jsoup配合 htmlunit 爬取异步加载的网页

    加入 jsoup 和 htmlunit 的依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId&g ...

  10. linux查看文件内容命令tail、cat、tac、head、echo

    1.tail tail -f test.log 你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, linux 如何显示一个文件的某几行(中间几行) 从第3000行开始,显示100 ...