Spark的Rpct模块的学习

Spark的Rpc模块是1.x重构出来可,以前的代码中大量使用了akka的类,为了把akka从项目的依赖中移除,所有添加了该模块。先看下该模块的几个主要的类


 
使用EA把该模块所有的类都添加进来了
 
要看懂该模块还是要先了解akka,  akka有Actor和ActorRef两个类,一个用于接收消息,一个用于发送消息。正好对应该模块的RpcEndpoint和RpcEndpointRef两个类。
下面大致介绍下这几个类,附带一些scala的特性
1:RpcAddress 
该类是一个case class, 用来表示主机名和端口号 ,  case class也可以添加方法,以前还以为不可以呢
它的伴生对象用于从URI,String等构造一个RpcAddress对象
 
2:RpcTimeout
表示一个超时时间,话说该类的职责有点乱,竟然还有下面的一个方法
    1. def awaitResult[T](awaitable:Awaitable[T]): T ={
    2. try{
    3. Await.result(awaitable, duration)
    4. }catch addMessageIfTimeout
    5. }
在规定时间内返回对象, Await是scala并发库中的一个对象,result在duration时间片内返回Awaitable的执行结果,ready表示duration时间片内Awaitable的状态变成complete,两个方法都是阻塞的,Awaitable相当java中的future,当然scala也有future类,正是继承该类。
它的伴生对象主要是配置文件中获取时间值然后生成该对象
 
3:RpcEnvFactory
该对象用于创建一个RpcEnv,在RpcEnv中可以看到如何使用该方法
    1. private def getRpcEnvFactory(conf:SparkConf):RpcEnvFactory={
    2. // Add more RpcEnv implementations here
    3. val rpcEnvNames =Map("akka"->"org.apache.spark.rpc.akka.AkkaRpcEnvFactory")
    4. val rpcEnvName = conf.get("spark.rpc","akka")
    5. val rpcEnvFactoryClassName = rpcEnvNames.getOrElse(rpcEnvName.toLowerCase, rpcEnvName)
    6. Utils.classForName(rpcEnvFactoryClassName).newInstance().asInstanceOf[RpcEnvFactory]
    7. }
目前spark.rpc只有akka的实现,如果觉得akka的性能不好也可以自己实现一个Rpc框架。
 
 
4: RpcEnv
 注解:这是一个RPC环境,所有的RpcEndpont需要注册到该对象中用于接收消息,注册时需要指定一个name, RpcEnv将会处理从RpcEndpontRef和远程节点发送过来的消息(接口里面看不到这块逻辑),然后发送给相应的Endpoint处理,对于接收到的异常使用RpcCallContext来处理。
 
看RpcEnv像akka中的ActorSystem对象,所有的actor和acotorred都属于它,同时有一个根地址,所有RpcEnv有注册RpcEndpoint的方法,也有一个address返回根地址的方法,RpcEnv有几个方法用于获取RpcEndpointRef ,  这里说下Endpoint注册名会成为RpcEndpoint的地址,可以看uriof方法,还有停止和关闭的方法。
RpcEnv的deserialize不明白具体用法,RpcEndpiontRef只能使用RpcEnv解码,当包含有RpcEndpointRef的对象解码时,解码代码将会被方法包装
 
5:RpcEnvConfig
用于构建RpcEnv的配置对象,一个RpcEnv需要host,port,name,附带sparkconf,securitymananger
host,port,name构造结构入下  akka://host:port/name  大致如此
 
 
6:RpcEndpoint
进程间调用的一个端点,当一个消息到来时,方法调用顺序为  onStart, receive, onStop
它的生命周期为constructor -> onStart -> receive* -> onStop  .当然还有一些其他方法,都是间触发方法
 
7:RpcEndpointRef
一个远程RpcEndpoint的引用,通过它可以给远程RpcEndpoint发送消息,可以是同步可以是异步,它映射一个地址 ,

Spark的Rpct模块的学习的更多相关文章

  1. python模块的学习

    # time 模块 import time print(time.time()) #当前的时间挫 #time.sleep(3) #休息3秒钟,这3秒cpu不工作的 print(time.gmtime( ...

  2. requsets模块的学习

    requests模块的学习 使用之前 pip install requests 发起get,post,请求获取响应 response = requests.get(url,headers) # 发起g ...

  3. retrying模块的学习

    retrying模块的学习 我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的 ...

  4. AngularJs HTML DOM、AngularJS 事件以及模块的学习(5)

    今天的基础就到了操作DOM,事件和模块的学习,其实我个人感觉学习起来AngularJS并没有想象中的那么的艰难,可能是因为这个太基础化吧,但是我们从初学开始就应该更加的自信一些,后来我可能会写一个小的 ...

  5. Python学习---重点模块的学习【all】

    time     [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...

  6. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎

    StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...

  7. Python模块——loguru日志模块简单学习

    Python loguru模块简单学习 首先安装模块:pip install logoru,然后引入模块: from loguru import logger 1.直接输出到console logge ...

  8. Request模块入门学习

    使用指令npm install --save request来安装模块,然后使用var request = require('request')完成引用. 对于GET请求,主要是获取目的url中数据. ...

  9. Spark的Streaming和Spark的SQL简单入门学习

    1.Spark Streaming是什么? a.Spark Streaming是什么? Spark Streaming类似于Apache Storm,用于流式数据的处理.根据其官方文档介绍,Spark ...

随机推荐

  1. Ajax图片异步上传并回显

    1.jsp页面 <td width="20%" class="pn-flabel pn-flabel-h"></td> <td w ...

  2. Tomcat添加管理员role

       最近朋友问我怎么在Tomcat里面使用 admin 登录,一般情况下登录后是提示xxx的,经过百度后,好不容易才找到答案:    原来添加一个role为admin:<role rolena ...

  3. JTAG-测试数据寄存器

    1.问题:JTAG中的数据寄存器的结构 JTAG标准规定了两个必须的数据寄存器: 1.旁通寄存器 2.边界扫描寄存器(已经在可测性设计-扫描通路中介绍了) 可选的的寄存器有: 1.器件标示寄存器(32 ...

  4. Testng 常用总结

    自动化测试过程中使用testng管理测试用例是常规的做法,我们需要对它的特性有一个深入的了解和认识: testng的原理: 参考:https://blog.csdn.net/dm_vincent/ar ...

  5. MySQL-查缺补漏

    MySQL show create table tablename #查看表设计代码数据 show create table tablename/G #同上 desc tablename # 查看表数 ...

  6. day 19 类的名称空间,组合,派生

    对象的属性: 不仅在__init__里面添加,还可以在其他方法或者类外面添加 class Game: def __init__(self,name,age): self.name = name sel ...

  7. es数组去重的简写

    console.log([...new Set([2, 2, 12, 1, 2, 1, 6, 12, 13, 6])])

  8. (IOS可自动播放)使用bxslider做了一个切换图片跟随播放MP3的功能

    代码: <!DOCTYPE html> <html lang="zh-Hans"> <head> <meta charset=" ...

  9. 线程 day40

    操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别 ...

  10. Vue-CLI3.x 高版本覆盖低版本Vue-CLI2.x 解决方法

    因为Vue-cli 3 和旧版使用了相同的vue命令,所以Vue CLI 2(vue-cli) 被覆盖了.如果你任然需要旧版本的 vue init 功能 ,你可以全局安装一个交接工具: npm ins ...