hadoop[6]-rpc
Posted wange
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop[6]-rpc相关的知识,希望对你有一定的参考价值。
Hadoop中各节点之间存在大量的远程过程调用,hadoop为此封装了一个RPC基础框架,使用方法如下:
服务端代码pom:
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.4.1</version> </dependency>
RCP通信的两端共同遵守的协议(本质上就是业务实现类的接口)
public interface NameNodeProtocal { //RPC通信双方一致的版本号 public static final long versionID = 1L; //业务方法签名 public String getMetaData(String path); }
实现类
public class NameNodeProtocalImpl implements NameNodeProtocal { @Override public String getMetaData(String path) { return "metadata"; } }
发布服务
import com.wange.service.NameNodeProtocal; import com.wange.service.impl.NameNodeProtocalImpl; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.*; import java.io.IOException; public class Application { public static void main(String[] args) throws Exception { //创建一个RPC服务builder Builder builder = new RPC.Builder(new Configuration()); //将要发布的服务的信息设置到builder中 builder.setBindAddress("hadoop-server-00").setPort(10000).setProtocol(NameNodeProtocal.class).setInstance(new NameNodeProtocalImpl()); //用builder构建出一个socket服务 Server server = builder.build(); //将服务启动,就可以等待客户端请求 server.start(); } }
将代码打成一个jar包,上传到hadoop-server-00服务器上,启动它:java -jar xxx.jar
客户端调用,pom引入依赖和服务端相同,将协议文件(NameNodeProtocal)拷贝过来,就可以开始调用了,代码如下:
import com.wange.service.NameNodeProtocal; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.*; import java.io.IOException; import java.net.InetSocketAddress; public class Application { public static void main(String[] args) throws IOException { System.setProperty("hadoop.home.dir", "E:/soft/hadoop-2.4.1"); //首先用RPC框架获得要调用的远端服务的引用(动态代理对象) NameNodeProtocal namenodeImpl = RPC.getProxy(NameNodeProtocal.class, 1L, new InetSocketAddress("hadoop-server-00", 10000), new Configuration()); //因为这个动态代理对象实现了业务类的接口,所以可以直接通过这个引用来调用业务类的实现方法(本质上,具体实现在远端,走的是socket通信请求) String metaData = namenodeImpl.getMetaData("/m1"); System.out.println(metaData); } }
这样就完成了,使用非常简单,这就是hadoop为我们封装好的rpc基础调用。
以上是关于hadoop[6]-rpc的主要内容,如果未能解决你的问题,请参考以下文章