在HDFS实现过程中DataNode class中有一个成员变量namenode,其类型是DatanodeProtocol。namenode可以看作是远程NameNode服务器的一个代理,因为NameNode本身也是DatanodeProtocol接口的具体实现;DataNode通过调用namenode对象的方法与远程NameNode进行交互。
下面看一下namenode变量在DataNode当中是如何初始化的:
首先DataNode通过调用RPC.waiForProxy方法完成namenode的初始化过程,具体实现看下面的代码:
this.namenode = (DatanodeProtocol) RPC.waitForProxy(DatanodeProtocol.class,DatanodeProtocol.versionID,nameNodeAddr,conf);
通过上面的代码可以看出,具体namenode是如何与远程的NameNode进行连接的需要通过查阅RPC.waitForProxy(...)来查看。waitForProxy通过RPC内部的一系列方法调用,最终通过下面的getProxy方法来实现:
public static VersionedProtocol getProxy(
Class<? extends VersionedProtocol> protocol,
long clientVersion,
InetSocketAddress addr,
UserGroupInformation ticket,
Configuration conf,
SocketFactory factory,
int rpcTimeout)throws IOException {
if (UserGroupInformation.isSecurityEnabled()) {
SaslRpcServer.init(conf);
}
VersionedProtocol proxy = (VersionedProtocol) Proxy.newProxyInstance(
protocol.getClassLoader(),
new Class[] { protocol },
new Invoker(protocol, addr, ticket, conf, factory, rpcTimeout));
long serverVersion = proxy.getProtocolVersion(protocol.getName(),
clientVersion);
if (serverVersion == clientVersion) {
return proxy;
} else
{
throw new VersionMismatch(protocol.getName(), clientVersion,
serverVersion);
}
}
上面标注为红色的代码是proxy获取的关键(目前对Java Proxy的具体作用不是很了解。但是据猜测作用应该是这样的,Proxy产生了一个protocol的一个具体对象,但是对该对象所有方法的调用都是通过Invoker中的invoke方法来进行调用,也就是其最终的方法调用是通过Invoker的invoke方法进行实现的),其中Invoker是该方法的关键,我们看一下Invoker的具体实现:
Invoker是InvocationHandler接口的具体实现(Invoker implements InvocationHandler),其中必须实现的方法是:
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
final boolean logDebug = LOG.isDebugEnabled();
long startTime = 0;
if (logDebug) {
startTime = System.currentTimeMillis();
}
ObjectWritable value = (ObjectWritable) client.call(new Invocation(
method, args), remoteId);
if (logDebug) {
long callTime = System.currentTimeMillis() - startTime;
LOG.debug("Call: " + method.getName() + " " + callTime);
}
return value.get();
}
invoke方法通过调用client.call方法完成与远程服务器的调用,client是RPC Client的一个实例。RPC Client具体完成与远程服务器通过socket进行交互的功能。
分享到:
相关推荐
在这个部署中,我们将使用 Hadoop 2.0 在两个 Ubuntu 服务器上部署双 Namenode 双 Datanode 集群。 Namenode 的作用 Namenode 是 Hadoop 集群中的主节点,负责管理文件系统的命名空间和数据块的分布。它维护着...
Hadoop RPC广泛应用于Hadoop生态系统中的各种组件,如HDFS的NameNode与DataNode之间的通信、YARN的ResourceManager与NodeManager之间的交互,以及MapReduce作业的提交和执行等。 总结来说,Hadoop RPC是Hadoop...
在Hadoop中,RPC被广泛用于NameNode、DataNode、TaskTracker等组件之间的通信,实现了服务端与客户端的透明交互。 二、Hadoop RPC架构 Hadoop的RPC基于Java的Socket通信,主要由以下组件构成: 1. **Protocol**: ...
### Hadoop Namenode性能诊断及优化 #### 一、Namenode简介与性能挑战 Hadoop作为大数据处理领域的核心技术之一,其分布式文件系统HDFS(Hadoop Distributed File System)是整个框架的重要组成部分。HDFS主要由两...
Hadoop作为一个开源的大数据处理框架,其RPC机制是实现各个组件如NameNode、DataNode、TaskTracker等之间通信的核心。以下是对这个主题的详细讲解: 1. **RPC基础概念**: - RPC是一种进程间通信(IPC)方式,它...
- **8020**:`fs.defaultFS`,这是NameNode的RPC端口,客户端通过此端口与NameNode进行交互,获取元数据信息。 - **JournalNode** - **8485**:`dfs.journalnode.rpc-address`,JournalNode的RPC服务端口,用于HA...
- **数据冗余与容错**:默认情况下,HDFS会为每个文件块创建三个副本,分布在不同的DataNode上,以提高数据的可靠性和可用性。 - **MapReduce工作流程**:分为Map阶段和Reduce阶段,通过将任务分解成多个子任务并行...
在Hadoop中,RPC主要用于NameNode、DataNode、TaskTracker等组件之间的通信。客户端通过RPC接口与服务端建立连接,发送请求,服务端处理请求后返回结果。整个过程涉及以下几个关键步骤: 1. **协议定义**:首先,...
Hadoop使用远程过程调用(RPC)来实现NameNode和DataNode之间的通信,以及客户端与NameNode的交互。 - **3.2.1 Client类** 客户端API包含在`org.apache.hadoop.ipc`包下,主要负责发起RPC请求,如打开文件、关闭...
在Hadoop中,RPC被用于NameNode和DataNode之间的通信,TaskTracker和JobTracker之间的通信,以及其他各种组件之间的交互。 1. **Java实现RPC**:Java中的RPC实现通常基于Socket编程,包括创建服务器端Socket监听...
《Hadoop技术内幕:深入解析HADOOP COMMON和HDFS架构设计与实现原理》这本书是Hadoop技术领域的一本深入解析之作,它详尽地探讨了Hadoop的两大核心组件——HADOOP COMMON和HDFS(Hadoop Distributed File System)的...
本节课程主要介绍 HDFS 的概念、HDFS 存储架构和数据读写流程、HDFS 的 Shell 命令、Java 程序操作 HDFS、Hadoop 序列化、Hadoop 小文件处理、通信机制 RPC 等知识点。 HDFS 概念 HDFS(Hadoop Distributed File ...
3. DistributedFileSystem 向客户端返回一个负责处理 DataNode 和 Namenode 间通信的 FSDataOutputStream 对象。 4. DFSOutputStream 将文件分成一个个数据包,并写入到数据队列中。 5. DataStreamer 处理数据队列,...
以下是我根据自身经验总结的Hadoop HA安装流程,这个流程已经在实际工作中得到验证,可以确保稳定运行。 一、环境准备 1. 操作系统:通常选择CentOS或Ubuntu等Linux发行版,确保系统稳定可靠。 2. 软件依赖:安装...
《Hadoop技术内幕:深入解析HADOOP COMMON和HDFS架构设计与实现原理》这本书是IT领域的经典之作,专门探讨了Hadoop的核心组件——Hadoop Common和HDFS(Hadoop Distributed File System)的设计理念、架构及其背后的...
这个调用会向NameNode发起远程过程调用(RPC),请求在文件系统的命名空间中创建一个新文件,但此时文件还没有关联任何数据块。NameNode会检查文件是否已存在,以及客户端是否有权限创建文件。如果检查通过,...
《Hadoop 2.X HDFS源码剖析》以Hadoop 2.6.0源码为基础,深入剖析了HDFS 2.X中各个模块的实现细节,包括RPC框架实现、Namenode实现、Datanode实现以及HDFS客户端实现等。《Hadoop 2.X HDFS源码剖析》一共有5章,其中...
每当DataNode向NameNode发送心跳信息时,它会报告其存储的块信息,NameNode据此可以检测到故障并进行恢复。 在文件读写过程中,Hadoop使用了一种叫做BlockCopy的机制。当客户端写入文件时,数据会被分割成多个块,...
DataNode会在启动后向NameNode注册,并上报自身状态信息,以便NameNode能够监控整个集群的状态。 ### HDFS数据操作 #### 文件读取流程 客户端读取HDFS中的数据时,会先向NameNode查询所需数据块的位置信息,然后...