大数据基础-Hadoop RPC框架

本文深入解析RPC(远程过程调用)的工作原理及其在Hadoop中的应用实例。RPC简化了网络分布式多程序的开发,采用客户机/服务器模式,通过特定步骤实现跨网络的服务请求与响应。Hadoop通过RPC实现节点间高效通信,示例代码展示了如何定义接口、实现服务及客户端调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

什么是RPC

         RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

         RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

 

RPC原理

运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:

1.调用客户端句柄;执行传送参数

2.调用本地系统内核发送网络消息

3.消息传送到远程主机

4.服务器句柄得到消息并取得参数

5.执行远程过程

6.执行的过程将结果返回服务器句柄

7.服务器句柄返回结果,调用远程系统内核

8.消息传回本地主机

9.客户句柄由内核接收消息

10.客户接收句柄返回的数据

 

hadoopRPC演示

公共接口文件

public interface ClientNamenodeProtocol {
	public static final long versionID = 1L;

	public String getMetaData(String path);
}
public interface IUserLoginService {

	public static final long versionID = 100L;
	public String login(String name,String passwd);
	
}

 

服务器端:

业务代码:

public class MyNameNode implements ClientNamenodeProtocol{
	
	//模拟namenode的业务方法之一:查询元数据
	@Override
	public String getMetaData(String path){
		
		return path+": 3 - {BLK_1,BLK_2} ....";
		
	}
	

}
public class UserLoginServiceImpl implements IUserLoginService{

	@Override
	public String login(String name, String passwd) {
		
		return name + "logged in successfully...";
	}
	
}

发布服务 

public class PublishServiceUtil {

	public static void main(String[] args) throws Exception {
		Builder builder = new RPC.Builder(new Configuration());
		builder.setBindAddress("localhost").setPort(8888).setProtocol(ClientNamenodeProtocol.class)
				.setInstance(new MyNameNode());

		Server server = builder.build();
		server.start();

		Builder builder2 = new RPC.Builder(new Configuration());
		builder2.setBindAddress("localhost").setPort(9999).setProtocol(IUserLoginService.class)
				.setInstance(new UserLoginServiceImpl());

		Server server2 = builder2.build();
		server2.start();

	}

}

客户端代码:

public class UserLoginAction {
	public static void main(String[] args) throws Exception {
		IUserLoginService userLoginService = RPC.getProxy(IUserLoginService.class, 100L, new InetSocketAddress("localhost", 9999), new Configuration());
		String login = userLoginService.login("angelababy", "1314520");
		System.out.println(login);
		
	}
}
public class MyHdfsClient {
	public static void main(String[] args) throws Exception {
		ClientNamenodeProtocol namenode = RPC.getProxy(ClientNamenodeProtocol.class, 1L,
				new InetSocketAddress("localhost", 8888), new Configuration());
		String metaData = namenode.getMetaData("/angela.mygirl");
		System.out.println(metaData);
	}
}

两个业务版本号可以不同,但一定有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值