zoukankan      html  css  js  c++  java
  • Hadoop源代码分析(六)

     

      既然是RPC,自然就有客户端和服务器,当然,org.apache.hadoop.rpc也就有了类Client和类Server。在这里我们来仔细考察org.apache.hadoop.rpc.Client。下面的图包含了org.apache.hadoop.rpc.Client中的关键类和关键方法。

      由于Client可能和多个Server通信,典型的一次HDFS读,需要和NameNode打交道,也需要和某个/某些DataNode通信。这就意味着某一个Client需要维护多个连接。同时,为了减少不必要的连接,现在Client的做法是拿ConnectionId(图中最右侧)来做为ConnectionIDConnectionId包括一个InetSocketAddressIP地址+端口号或主机名+端口号)对象和一个用户信息对象。这就是说,同一个用户到同一个InetSocketAddress的通信将共享同一个连接。

     

      连接被封装在类Client.Connection中,所有的RPC调用,都是通过Connection,进行通信。一个RPC调用,自然有输入参数,输出参数和可能的异常,同时,为了区分在同一个Connection上的不同调用,每个调用都有唯一的id。调用是否结束也需要一个标记,所有的这些都体现在对象Client.Call中。Connection对象通过一个Hash表,维护在这个连接上的所有Call

    Java代码:

    1 private Hashtable<Integer, Call> calls = new Hashtable<Integer, Call>(); 

     

      一个RPC调用通过addCall,把请求加到Connection里。为了能够在这个框架上传输Java的基本类型,StringWritable接口的实现类,以及元素为以上类型的数组,我们一般把Call需要的参数打包成为ObjectWritable对象。

      Client.Connection会通过socket连接服务器,连接成功后回校验客户端/服务器的版本号(Client.ConnectionwriteHeader()方法),校验成功后就可以通过Writable对象来进行请求的发送/应答了。注意,每个Client.Connection会起一个线程,不断去读取socket,并将收到的结果解包,找出对应的Call,设置Call并通知结果已经获取。

      Call使用Obejctwaitnotify,把RPC上的异步消息交互转成同步调用。

      还有一点需要注意,一个Client会有多个Client.Connection,这是一个很自然的结果。

  • 相关阅读:
    任务1 Kittenblock应用初步设置,第14章 图形化编程与代码对照解读
    第13章Arduino编程参考
    任务12 Arduino感温亮灯
    性能优化------内存优化1
    安卓OOM和Bitmap图片二级缓存机制(二)
    安卓OOM和Bitmap图片二级缓存机制
    通过BitmapFactory.decodeByteArray把byte[]转成Bitmap出现的OOM的解决方法
    理解Android Java垃圾回收机制
    java设计模式----代理模式
    通过代理Activity模式,以移花接木的方式,加载sd卡目录下的apk界面
  • 原文地址:https://www.cnblogs.com/94julia/p/2992954.html
Copyright © 2011-2022 走看看