Hadoop中的RPC实现——客户端通信组件

2019-03-28 14:01|来源: 网络

Hadoop中为了方便集群中各个组件之间的通信,它采用了RPC,当然为了提高组件之间的通信效率以及考虑到组件自身的负载等情况,Hadoop在其内部实现了一个基于IPC模型的RPC。关于这个RPC组件的整体情况我已经介绍过了,相关阅读:http://www.linuxidc.com/search.aspx?Where=Nkey&Keyword=Hadoop 。而在本文,我将结合源代码详细地介绍它在客户端的实现。

 

    先来看看与RPC客户端相关联的一些类吧!



1.Client类

[java]
  1. private Hashtable<ConnectionId, Connection> connections = new Hashtable<ConnectionId, Connection>();  //与远程服务器连接的缓存池   
  2.   
  3. private Class<? extends Writable> valueClass;   //远程方法调用发回后返回值解析器     
  4.     
  5. final private int maxIdleTime;  //连接的最大空闲时间   
  6. final private int maxRetries;   //Socket连接时,最大Retry次数   
  7. private boolean tcpNoDelay;     //设置TCP连接是否延迟   
  8. private int pingInterval;   //ping服务端的间隔  
    在Client中,因为与服务器的每一次连接不仅会产生网络延迟,而且也会占用大量的系统资源,所以在Client内部设计了一个连接池,用来缓存与不同服务端的连接,通过对象ConnectionId来表示每一连接。当然,每一个连接有一个最大空闲期maxIdleTime,如果一个连接在时间maxIdleTime没有被使用的话,该连接将自动关闭与Server的连接,以此来释放该连接在服务器端和客户端的系统资源。这个最大空闲期maxIdleTime的值可以通过客户端的配置文件来设置,对应的配置项为:ipc.client.connection.maxidletime。同时为了维护该连接的有效性,该连接设置了基于TCP的Socket的网络超时时间,当该连接发生SocketTimeoutException时,会自动的向服务器端发送ping包,来测试当前客户端与服务器端的连接是否正常,这个超时时间的值为pingInterval,该值的默认大小是60000ms,不过也可以通过 客户端的配置文件来配置,对应的配置项为:ipc.ping.interva l。另外,当该连接向服务器发起连接请求失败的时候,可以不断的重新尝试,尝试的次数由maxRetries决定,当尝试的次数超过该值时,就将该连接视为彻底的失败,客户端的这一次RPC也就失败了。maxRetries默认的值为10,但也可以客户端的配置文件来配置,对应的配置选项为:ipc.client.connect.max.retries。底层的基于TCP的Socket网络连接还可以通过配置文件来设置是否延迟,对应的配置项为:ipc.client.tcpnodelay。其实,对于上面Client内部的四个参数,我们可以根据具体的应用场景来设置适当的值,已达到提高Hadoop集群性能的目的。当一个RPC成果返回之后,Client还需要把此次调用的返回结果解析成用户真正需要的数据类型(毕竟,网络返回的都是0/1序列),所以Cleint在其内部还需要一个解析器,该解析器的类型为valuesClass,在hadoop的0.20.2.0版本中,这个解析器的类型为ObjectWritable。但是令人不解的是,每一次RPC调用返回之后,都会利用JDK的反射机制来创建该类的一个实例,然后利用这个解析器实例来解析返回结果,这样做的后果想必熟悉JDK反射机制的人都很清除了。

相关问答

更多