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 Client 是 RPC 客户端的实现,它提供了对 RPC 服务端的访问接口。RPC Client 可以分为三个部分:Client 抽象、Client 实现和 Client.Request。 * Client 抽象:提供了对 RPC 服务端的访问接口。 * ...
在这个实例中,我们将深入探讨Hadoop RPC的工作原理、客户端(`hadoop_rcp_client`)与服务器端(`hadoop_rpc_server`)的角色以及它们之间的交互过程。 ### Hadoop RPC概述 Hadoop RPC是Hadoop框架中用于进程间...
在`RPC.Server`中,可以看到对请求的接收、处理和响应的逻辑。 六、总结 Hadoop的RPC机制是其分布式系统中的重要组成部分,它简化了分布式环境下的通信,提高了效率。理解并掌握RPC的工作原理对于优化Hadoop集群...
- `RPC.Client`:客户端的实现,用于建立连接并发送请求。 - `VersionedProtocol`:所有RPC服务需要实现的接口,包含了版本信息,用于兼容性检查。 5. **安全性**: - Hadoop RPC支持安全模式,可以通过Kerberos...
在IT行业中,分布式计算系统的重要性日益凸显,而Hadoop作为其中的佼佼者,其核心组件之一就是远程过程调用(RPC,Remote Procedure Call)。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中,远程过程调用(Remote Procedure Call, RPC)是一种重要的通信机制,它允许分布式系统中的组件之间进行高效且便捷的交互。Hadoop的RPC机制基于Java的客户端-服务器模型,允许客户端调用服务器上的方法,...
Hadoop RPC是Hadoop生态系统中的基础服务,使得不同模块如HDFS、MapReduce等可以高效地协同工作。本教程将通过一个简单的Demo来讲解如何在自己的项目中利用Hadoop的RPC框架。 首先,理解RPC的基本概念是非常必要的...
在Hadoop中,客户端(Client)负责提交任务、读写数据,而服务器端则包括NameNode、DataNode和TaskTracker等组件,它们处理客户端请求,管理数据存储和任务调度。 二、HDFS通信 1. 客户端与NameNode交互: 当...
在Hadoop环境中,客户端权限问题是常见的困扰用户的问题之一。这个特定的错误日志"org.apache.hadoop.security.AccessControlException: Permission denied: user=xudsa, access=WRITE, inode="/uploaddemo1.txt":...
RPC框架主要解决分布式系统中不同节点间的通信问题。 #### RPC架构的关键组成部分包括: 1. **客户端**:负责向服务器发送请求。 2. **服务器**:处理来自客户端的请求,并返回结果。 3. **网络传输层**:用于在...
6. **性能优化**:Hadoop的RPC设计时考虑了性能,例如使用多线程处理并发请求,通过缓存减少重复序列化和反序列化操作,以及优化网络I/O以减少延迟。 7. **容错和恢复**:如果服务器端出现问题,客户端能够检测到并...
Hadoop rpc源码是从Hadoop分离出的ipc,去掉了认证部分,附录使用文档.使用前请add lib包commons-logging-*.*.*.jar(我用的是1.0.4)和log4j-*.*.*.jar(我的1.2.13) 相关blog post: ...
内含Hadoop服务器环境和谐配置文件及客户端测试代码
Hadoop分布式缓存是Hadoop生态系统中的一个重要组成部分,它允许应用程序在执行MapReduce任务时共享和重用数据,从而提高整体性能。这份源码提供了深入理解Hadoop如何管理和利用分布式缓存的机会,对于想要优化...
1.java接口操作Hadoop文件系统(文件上传下载删除创建...可举一反三) 2.RPC远程过程调用的java代码实现,便于理解Hadoop的RPC协议,具体使用方法可参考我的博客...
Hadoop 的 `Server` 类基于 NIO(非阻塞 I/O)实现,主要负责接收和处理来自客户端的请求。具体来说: - **Listener 类** 负责监听 Socket 并创建任务交给处理器线程。 - **NIO** 是通过非阻塞方式处理 I/O 操作,...
Hadoop中的RPC机制是基于Java的IPC(Inter-Process Communication)实现的,它在设计时考虑了性能、效率和可控制性,因此与RMI(Remote Method Invocation)等其他RPC方案有所不同。 1. **RPC原理**: Hadoop的RPC...
NULL 博文链接:https://ouyida3.iteye.com/blog/1144326