`
chenzehe
  • 浏览: 538177 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hadoop IPC RPC类中对请求的客户端缓存类ClientCache问题

 
阅读更多

        Hadoop IPC RPC类中对请求的客户端缓存类ClientCache,是一个用HashMap进行对象缓存的类,但是对缓存操作时都使用synchronized关键字来加锁,如果使用ConcurrentHashMap进行进行缓存,在存取时会有更好的性能。ConcurrentHashMap是基于分段的锁分离技术实现,而且使用JUC中的显示锁来保证同步,多线程方面性能比HashMap有明显的优势。

 

  /* Cache a client using its socket factory as the hash key */
  private class ClientCache {
    private Map<SocketFactory, Client> clients =
      new HashMap<SocketFactory, Client>();

    /**
     * Construct & cache an IPC client with the user-provided SocketFactory 
     * if no cached client exists.
     * 
     * @param conf Configuration
     * @return an IPC client
     */
    private synchronized Client getClient(Configuration conf,
        SocketFactory factory) {
      // Construct & cache client.  The configuration is only used for timeout,
      // and Clients have connection pools.  So we can either (a) lose some
      // connection pooling and leak sockets, or (b) use the same timeout for all
      // configurations.  Since the IPC is usually intended globally, not
      // per-job, we choose (a).
      Client client = clients.get(factory);
      if (client == null) {
        client = new Client(ObjectWritable.class, conf, factory);
        clients.put(factory, client);
      } else {
        client.incCount();
      }
      return client;
    }

    /**
     * Construct & cache an IPC client with the default SocketFactory 
     * if no cached client exists.
     * 
     * @param conf Configuration
     * @return an IPC client
     */
    private synchronized Client getClient(Configuration conf) {
      return getClient(conf, SocketFactory.getDefault());
    }

    /**
     * Stop a RPC client connection 
     * A RPC client is closed only when its reference count becomes zero.
     */
    private void stopClient(Client client) {
      synchronized (this) {
        client.decCount();
        if (client.isZeroReference()) {
          clients.remove(client.getSocketFactory());
        }
      }
      if (client.isZeroReference()) {
        client.stop();
      }
    }
  }

 

 上面代码同使用synchronized同步读写操作都是放到方法前,这样会对整个类实例加锁,而不只是对缓存对象加锁,对该Client的引用计数使用基本int类型进行++和--操作再使用synchronized关键字保证同步,不如使用原子操作类使用方便和有更好的性能。

private synchronized Client getClient(Configuration conf,
        SocketFactory factory) {
      // Construct & cache client.  The configuration is only used for timeout,
      // and Clients have connection pools.  So we can either (a) lose some
      // connection pooling and leak sockets, or (b) use the same timeout for all
      // configurations.  Since the IPC is usually intended globally, not
      // per-job, we choose (a).
      Client client = clients.get(factory);
      if (client == null) {
        client = new Client(ObjectWritable.class, conf, factory);
        clients.put(factory, client);
      } else {
        client.incCount();
      }
      return client;
}


Client类:
private int refCount = 1;
synchronized void incCount() {
    refCount++;
}

synchronized void decCount() {
    refCount--;
}

 

 

 
分享到:
评论

相关推荐

    Hadoop_RPC详细分析.doc

    Hadoop RPC Client 是 RPC 客户端的实现,它提供了对 RPC 服务端的访问接口。RPC Client 可以分为三个部分:Client 抽象、Client 实现和 Client.Request。 * Client 抽象:提供了对 RPC 服务端的访问接口。 * ...

    hadoop rpc实例

    在这个实例中,我们将深入探讨Hadoop RPC的工作原理、客户端(`hadoop_rcp_client`)与服务器端(`hadoop_rpc_server`)的角色以及它们之间的交互过程。 ### Hadoop RPC概述 Hadoop RPC是Hadoop框架中用于进程间...

    Hadoop RPC机制分析

    在`RPC.Server`中,可以看到对请求的接收、处理和响应的逻辑。 六、总结 Hadoop的RPC机制是其分布式系统中的重要组成部分,它简化了分布式环境下的通信,提高了效率。理解并掌握RPC的工作原理对于优化Hadoop集群...

    java操作hadoop的RPC,源码

    - `RPC.Client`:客户端的实现,用于建立连接并发送请求。 - `VersionedProtocol`:所有RPC服务需要实现的接口,包含了版本信息,用于兼容性检查。 5. **安全性**: - Hadoop RPC支持安全模式,可以通过Kerberos...

    hadoop中RPC协议的小测试例子(吴超老师)

    在IT行业中,分布式计算系统的重要性日益凸显,而Hadoop作为其中的佼佼者,其核心组件之一就是远程过程调用(RPC,Remote Procedure Call)。RPC允许一个程序在某个网络中的计算机上执行另一个计算机上的程序,而...

    Hadoop的RPC通信程序

    import org.apache.hadoop.ipc.RPC; /** * 定义RPC通讯Client端 */ public class SayRpcClient { private static Scanner sc; public static void main(String[] args) throws Exception { // 要连接服务端...

    Hadoop里的RPC机制过程

    在Hadoop中,远程过程调用(Remote Procedure Call, RPC)是一种重要的通信机制,它允许分布式系统中的组件之间进行高效且便捷的交互。Hadoop的RPC机制基于Java的客户端-服务器模型,允许客户端调用服务器上的方法,...

    Hadoop自己的Rpc框架使用Demo

    Hadoop RPC是Hadoop生态系统中的基础服务,使得不同模块如HDFS、MapReduce等可以高效地协同工作。本教程将通过一个简单的Demo来讲解如何在自己的项目中利用Hadoop的RPC框架。 首先,理解RPC的基本概念是非常必要的...

    Hadoop client server通讯分析

    在Hadoop中,客户端(Client)负责提交任务、读写数据,而服务器端则包括NameNode、DataNode和TaskTracker等组件,它们处理客户端请求,管理数据存储和任务调度。 二、HDFS通信 1. 客户端与NameNode交互: 当...

    hadoop 客户端权限问题

    在Hadoop环境中,客户端权限问题是常见的困扰用户的问题之一。这个特定的错误日志"org.apache.hadoop.security.AccessControlException: Permission denied: user=xudsa, access=WRITE, inode="/uploaddemo1.txt":...

    rpc架构与hadoop分享

    RPC框架主要解决分布式系统中不同节点间的通信问题。 #### RPC架构的关键组成部分包括: 1. **客户端**:负责向服务器发送请求。 2. **服务器**:处理来自客户端的请求,并返回结果。 3. **网络传输层**:用于在...

    java_RPC_hadoop.zip

    6. **性能优化**:Hadoop的RPC设计时考虑了性能,例如使用多线程处理并发请求,通过缓存减少重复序列化和反序列化操作,以及优化网络I/O以减少延迟。 7. **容错和恢复**:如果服务器端出现问题,客户端能够检测到并...

    Hadoop rpc源码

    Hadoop rpc源码是从Hadoop分离出的ipc,去掉了认证部分,附录使用文档.使用前请add lib包commons-logging-*.*.*.jar(我用的是1.0.4)和log4j-*.*.*.jar(我的1.2.13) 相关blog post: ...

    Hadoop服务器环境和谐配置文件及客户端测试代码

    内含Hadoop服务器环境和谐配置文件及客户端测试代码

    hadoop 分布式缓存源码

    Hadoop分布式缓存是Hadoop生态系统中的一个重要组成部分,它允许应用程序在执行MapReduce任务时共享和重用数据,从而提高整体性能。这份源码提供了深入理解Hadoop如何管理和利用分布式缓存的机会,对于想要优化...

    Hadoop Java接口+RPC代码实现

    1.java接口操作Hadoop文件系统(文件上传下载删除创建...可举一反三) 2.RPC远程过程调用的java代码实现,便于理解Hadoop的RPC协议,具体使用方法可参考我的博客...

    学习hadoop_源代码,RPC_部分

    Hadoop 的 `Server` 类基于 NIO(非阻塞 I/O)实现,主要负责接收和处理来自客户端的请求。具体来说: - **Listener 类** 负责监听 Socket 并创建任务交给处理器线程。 - **NIO** 是通过非阻塞方式处理 I/O 操作,...

    学习hadoop源代码,RPC部分.pdf

    Hadoop中的RPC机制是基于Java的IPC(Inter-Process Communication)实现的,它在设计时考虑了性能、效率和可控制性,因此与RMI(Remote Method Invocation)等其他RPC方案有所不同。 1. **RPC原理**: Hadoop的RPC...

    org.apache.hadoop.ipc.Client: Retrying connect to server

    NULL 博文链接:https://ouyida3.iteye.com/blog/1144326

Global site tag (gtag.js) - Google Analytics