rpc源码解析

  • 1 rpc设计和实现逻辑说明
  • 1.1 设计
  • 1.2 实现
  • 2 调试
  • 3 总结
  • 4 后续安排



  如前所述,rpc是hadoop节藕各个功能模块的重要工具,相当于神经系统,串联各部分,使用频次最高,因此可以预见,rpc的设计和实现必然简单高效,不然容易出问题.

1 rpc设计和实现逻辑说明

1.1 设计

  Rpc的设计采用常规远程调用的模式,通过socket和tcp协议,在网络间传输.其独有的特点为使用protocol接口来规定服务端提供的方法,并使用谷歌的protobuf来生成相应的类,这么做可视为把整个流程的复杂度降到了最低.

1.2 实现

  实现上分为三大类,首先是客户端,客户端获取服务端的代理来直接调用其服务.第二类为protocol类,此类定义了服务端所提供的方法,而且每次客户端只能获取到服务端的一个protocol代理.第三类为服务端,服务端每次也只能实例化一个protocol,供客户端调用.
  客户端发送请求到服务端,服务端启动listener监听请求,然后把请求放入本地队列,由handler从队列中取走请求来处理,处理的结果由responder发送回客户端.服务端和客户端都采用nio的模式,都有超时和重试的配置,和一般的rpc没有本质的区别.
  从设计到实现都把整个流程的复杂度降到了最低,可以说rpc是hadoop各个功能中从设计到实现都是最简单的.

2 调试

  这里的调试根据源码中已有的实现类来设置断点,该类在common中的ipc测试中,如下所示

pomolo 首次rpc慢_pomolo 首次rpc慢


  如上所示,在ping2方法上打上断点,主要是为了简单期间,也可以在上面的testProtoBufRpc()方法里打断点,效果是一样的.

  进入后,可以看到起了很多线程,如上所述,有listener类,有handler类,等等.

pomolo 首次rpc慢_hadoop_02

  可以按照其各个方法调用的顺序一步步进入,因为比较简单,这里就省去了这些方法调用树以及重要方法的分析,读者可以自行查看.

3 总结

  Rpc作为hadoop中使用频次最高的功能,其设计和实现必定简单.这里从整体上给出了其设计思路和实现流程,具体的代码比较简单,这里不再详述.
  还有mapreduce没有分析,主要是考虑到这个目前使用的场景已不是很多,多数已被spark所代替.即使编写mr的代码,也比较简单,计算出错的概率极低,可以忽略mr在计算时的问题,因为其设计本身就是用时间换空间.
  Yarn和ha没有分析的原因也给出了,因为在我这里调试难度太大,所以暂不考虑.

4 后续安排

  Hadoop的源码分析到此基本到尾声了,接下来会分析与其关系最为密切的hbase,其次是比mr运算更快的spark,最后是kafka,若有时间会再看看flink.