目录
1.什么是Hadoop的RPC
Remote Procedure Call(简称:RPC):远程过程调用协议。
RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC协议假定某些传输协议的存在,如TCP或UDP, 为通信程序之间携带信息数据。
在OSI网络通信模型中,RPC跨越了传输层和应用层。
RPC使得开发包括网络分布式程序在内的应用程序更加容易。
2.创建一个客户端Client机
在关机状态下,左键Hadoop01虚拟机-管理-克隆-下一步-下一步-选择创建完整克隆,下一步
-完成
3.Client虚拟机配置
打开Client虚拟机,打开命令行
su
输入密码
进行主机名的修改
vi /etc/sysconfig/network
改为
NETWORKING=yes
HOSTNAME=client
进行网卡的设置:
右键右上角网络连接图表-Edit Conections-选中Auto eth1-Edit
-Apply,输入密码进行授权
检查配置网卡是否成功
ping 192.168.100.10
reboot
进行重启
4.进行RPC实验
4.1在服务器端(NameNode节点)创建一个协议接口
在一号机命令行中:
su
输入密码
cd /usr/eclipse/
./eclipse
选择此路径下的Workspace:/root/workspace
可看到之前创建的Hadoop项目(见上篇文章)
右键hadoop项目-New-Interface
Package包名填为rpc
Name填为ClientProtocol
点Finish
在其中写入:
package rpc;
public interface ClientProtocol {
public final static long versionID = 123123l;
public String findMetaDataByName(String filename);
}
4.2创建一个通信服务端
将1号虚拟机,即NameNode节点作为服务端,声明一个RPCServer_NameNode类
该类需要实现ClientProtocol接口中的方法
右键rpc包-New-Class
Name填RPCServer_NameNode
勾选main方法,点Add,添加自己建的rpc的类
-OK-Finish
写入:
package rpc;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
public class RPCServer_NameNode implements ClientProtocol {
@Override
public String findMetaDataByName(String filename) {
// TODO Auto-generated method stub
System.out.println("正在从内存中找"+filename+"的元数据信息");
// return到客户端Client
return filename+"找到后元数据信息";
}
public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
// TODO Auto-generated method stub
Server server = new RPC.Builder(new Configuration())
.setInstance(new RPCServer_NameNode()).setProtocol(ClientProtocol.class).setBindAddress("192.168.100.10")
.setPort(9123).build();
server.start();
}
}
4.3创建一个通信客户端
进入Client端虚拟机命令行:
su
输入密码
cd /usr/eclipse/
./eclipse
选择此路径下的Workspace:/root/workspace
可看到之前创建的Hadoop项目
右键hadoop项目-New-Interface
Package包名填为rpc
Name填为RPCClient_HDFSClient
勾选main方法
点Finish
回到服务器端(一号机):
su
输入密码
将服务器端的 接口类ClientProtocol 发送给客户端的rpc工程:
cd
scp /root/workspace/hadoop/src/rpc/ClientProtocol.java root@192.168.100.14:/root/workspace/hadoop/src/rpc/
再回到客户端(Client):
刷新项目可看到传输过来了接口类ClientProtocol
在RPCClient_HDFSClient.java中写入:
package rpc;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class RPCClient_HDFSClient {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ClientProtocol cp = RPC.getProxy(ClientProtocol.class, 123123,
new InetSocketAddress("192.168.100.10",9123),new Configuration());
String msg = cp.findMetaDataByName("/words.txt");
System.out.println(msg);
RPC.stopProxy(cp);
}
}
5.进行测试
开启服务器端,开启服务器端的监听进程,等待客户端发消息
回到服务器端(一号机):
鼠标点到main方法中
Run As-1 Java Application
保持启动状态
回到客户端Client:
鼠标点到main方法中
Run As-1 Java Application
可看到控制台显示服务器端返回的信息
服务器端调用成功
返回的信息是因为服务器端的此语句:
// return到客户端Client
return filename+"找到后元数据信息";
这就是通过网络做了一个CS结构的远程过程调用
分布式系统都是基于RPC通信的机制来进行消息的传输(远程方法的调用)
回到服务器端(一号机):
可看到控制台显示信息
实验结束,点红色按钮关闭服务器端
便可以关闭虚拟机