RPC调用;

RPC(remote procedure call)远程过程调用;

不同java进程间的对象方法的调用。

一方称作服务端(server),一方称为客户端(client);

server端提供对象,共客户端调用的, 被调用的对象的执行发生在server端。

RPC是hadoop框架运行的基础(hadoop是建立在RPC机制之上的,建立c/s模式上的);

使用hadoop的RPC做一个小例子,理解hadoop体系结构运行的原理:

先运行 MyServer 在运行MyClient

package rpc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;

public class MyServer {
	public static final String SERVER_ADDRESS = "localhost";
	public static final int SERVER_PROT = 12345;

	//Server端提供对象的方法供客户端运行的,
	public static void main(String[] args) throws Exception {
		/**
		 * 构造  an RPC server.
		 * @param instance 实例中的方法会被客户端调用,特点:要实现VersionedProtocol接口,还必须是一个接口
		 * 在客户端 要调用的方法必须在我们这个对象的接口中
		 * @param bindAddress 绑定的这个地址用语监听连接的到来
		 * @param port 绑定的这个端口用语监听连接的到来
		 * @param conf the configuration to use
		 */
		Server server = RPC.getServer(new MyBiz(), SERVER_ADDRESS, SERVER_PROT, new Configuration());
		server.start();
	}
}
package rpc;

import java.net.InetSocketAddress;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;

public class MyClient {
	public static void main(String[] args) throws Exception {
		/**构造一个客户端的代理对象,这个代理对象实现了一个指定的协议,
		*这个协议可以和指定地址的服务端通信的
		* Construct a client-side proxy object that implements the named protocol,
		* talking to a server at the named address. */
		MyBizable proxy = (MyBizable) RPC.waitForProxy(MyBizable.class, MyBizable.VERSION, new InetSocketAddress(MyServer.SERVER_ADDRESS, MyServer.SERVER_PROT), new Configuration());
		String result = proxy.hello(" world!");
		System.out.println("客户端调用的结果:" + result);
		RPC.stopProxy(proxy);
	}
}
package rpc;

import org.apache.hadoop.ipc.VersionedProtocol;

public interface MyBizable extends VersionedProtocol{
	public static final long VERSION=12312322L;
	public abstract String hello(String name);

}
package rpc;

import java.io.IOException;

public class MyBiz implements MyBizable{
	/* (non-Javadoc)
	 * @see rpc.MyBizable#hello(java.lang.String)
	 */
	@Override
	public String hello(String name){
		//却换的Server短输出台查看是否打印这句,说明是在server执行的
		System.out.println("我被调用了");
		return "hello"+name;
	}

	@Override
	public long getProtocolVersion(String protocol, long clientVersion) throws IOException {
		return MyBizable.VERSION;
	}

}

通过例子获得的认识:

   服务端提供的对象必须是一个接口,接口extends VersionedProtocol接口,为什么?因为JDK反射代理要求必须是一个接口。

   客户端能够调用的对象中的方法必须位于对象的接口中;

这个就是RPC通信;

使用cmd jps可以查看到MyServer,说明hadoop start-all.sh里面的五个java进程指的是RPC的服务端(可以通过查看源码NameNode的mian方法点去看);

我们观察 NameNode 的源代码,可以看到 NameNode 确实创建了RPC 的服务端。

具体步骤:

NameNode的main方法→createNameNode→

new NameNode→initialize→ 如下图

    // create rpc server
    InetSocketAddress dnSocketAddr = getServiceRpcServerAddress(conf);
    if (dnSocketAddr != null) {
      int serviceHandlerCount =
        conf.getInt(DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_KEY,
                    DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_DEFAULT);
      this.serviceRpcServer = RPC.getServer(this, dnSocketAddr.getHostName(),
          dnSocketAddr.getPort(), serviceHandlerCount,
          false, conf, namesystem.getDelegationTokenSecretManager());
      this.serviceRPCAddress = this.serviceRpcServer.getListenerAddress();
      setRpcServiceServerAddress(conf);
    }
    this.server = RPC.getServer(this, socAddr.getHostName(),
        socAddr.getPort(), handlerCount, false, conf, namesystem
        .getDelegationTokenSecretManager());

    // The rpc-server port can be ephemeral... ensure we have the correct info
    this.serverAddress = this.server.getListenerAddress();
    FileSystem.setDefaultUri(conf, getUri(serverAddress));
    LOG.info("Namenode up at: " + this.serverAddress);

Hadoop的RPC通信原理的更多相关文章

  1. Hadoop的RPC工作原理

    RPC远程过程调用: Hadoop的远程过程调用(Remote Procedure Call,RPC)是Hadoop中核心通信机制,RPC主要通过所有Hadoop的组件元数据交换,如MapReduce ...

  2. RPC通信原理(未完,先睡觉)

    一 背景 OpenStack 各组件之间是通过 REST 接口进行相互通信,比如Nova.Cinder.Neutron.Glance直间的通信都是通过keystone获取目标的endpoint,即ap ...

  3. hadoop的RPC通信

    RPC(remote procedure call)远程调用 不同的Java进程间的对象方法调用 一方称作服务端(server),一方称作客户端(client) server端提供对象,供客户端调用, ...

  4. RPC通信原理

    什么是 RPCRPC(Remote Procedure Call Protocol)远程过程调用协议.通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算上的某个过程或函数,就像调用本地应 ...

  5. Hadoop之RPC

           Hadoop的RPC主要是通过Java的动态代理(Dynamic Proxy)与反射(Reflect)实现,代理类是由java.lang.reflect.Proxy类在运行期时根据接口, ...

  6. Hadoop中RPC协议小例子报错java.lang.reflect.UndeclaredThrowableException解决方法

    最近在学习传智播客吴超老师的Hadoop视频,里面他在讲解RPC通信原理的过程中给了一个RPC的小例子,但是自己编写的过程中遇到一个小错误,整理如下: log4j:WARN No appenders ...

  7. Hadoop源码解析之 rpc通信 client到server通信

    rpc是Hadoop分布式底层通信的基础,无论是client和namenode,namenode和datanode,以及yarn新框架之间的通信模式等等都是采用的rpc方式. 下面我们来概要分析一下H ...

  8. HDFS(二) 底层通信原理——RPC 及 动态代理

    一.RPC(Remote Procedure Call  ) :远程过程调用 1.RPC是远程过程调用协议,实现调用者和被调用者二地之间的连接和通信.其基本通信模型是基于client/server进程 ...

  9. 吴裕雄--天生自然HADOOP操作实验学习笔记:分布式及RPC通信简介

    实验目的 掌握GOF设计模式的代理模式 了解掌握socket编程.java反射.动态代理 了解NIO.多线程 掌握hadoop的RPC框架使用API 实验原理 1.什么是RPC 在hadoop出现以前 ...

随机推荐

  1. MySQL-分组查询(GROUP BY)及二次筛选(HAVING)

    为了测试GROUP BY 语句,我们创建两张表,并往表中添加数据 -- 创建部门表 CREATE TABLE IF NOT EXISTS department( id TINYINT UNSIGNED ...

  2. mysql之查询

    #数据准备drop table if exists class;create table class(    class_no int(2) unsigned zerofill primary key ...

  3. python day two,while

    一.运算符号 算数运算符:+ .-.*././/(取整除).%(去余).** 比较运算符:>.< .>=.<=.== 赋值运算符:=.+=.-=./=.%=.**= 逻辑预算符 ...

  4. java制作验证码(java验证码小程序)

    手动制作java的验证码 Web应用验证码的组成: (1)输入框 (2)显示验证码的图片 验证码的制作流程: 生成验证码的容器使用 j2ee的servlet 生成图片需要的类: (1) Buffere ...

  5. [BZOJ 4361]isn

    Description 题库链接 给出一个长度为 \(n\) 的序列 \(A\) .如果序列 \(A\) 不是非降的,你必须从中删去一个数,这一操作,直到 \(A\) 非降为止.求有多少种不同的操作方 ...

  6. 计蒜客NOIP模拟赛(2)D1T3 深黑幻想

    [问题描述]    凡终于发愤图强,决定专心搞OI,不再玩纸牌和坑钱了!没过多久就飘飘然了,总是陷入自己进了集训队的深黑幻想之中.    样听说了之后,决定考一考凡欧拉回路怎么写.样:“我给你出一道题 ...

  7. [HNOI2012]永无乡

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  8. Codeforces Round #460 E. Congruence Equation

    Description 题面 \(n*a^n≡b (\mod P),1<=n<=x\) Solution 令 \(n=(P-1)*i+j\) \([(P-1)*i+j]*a^{[(P-1) ...

  9. c++读写MySQL

    看过很多C或是C++操作MySQL数据库的文章,大部分太吃力了,甚至有一部分根本没有很好的组织文字,初学者比较难以接受,即使是C++或是C高手也是比较难看懂.写这篇文章的目的不是别的,就一个,告诉您用 ...

  10. 手机上的ROM与RAM

    ROM:read only memory翻译为只读存储器. RAM:read access memory翻译为随机存储器. 下面是一张手机的配置参数表. 简单来说,RAM就是真正意义上的内存,而ROM ...