1. Hadoop-rpc框架
在hadoop中提供了一个rpc框架,通过这个rpc框架可以编写一个rpc服务端程序,然后发布出去供客户端调用。
1.1.服务端代码
其中服务端(example-hadoop-rpc-server),其中代码结果如下:
代码说明:
ClientNamenodeProtocal |
接口定义 |
NameNode |
接口的实现 |
ServerPublisher |
用于发布服务的类 |
若写服务端代码,需要一个服务端的接口,其中接口如下:
package cn.toto.rpc.protocal;
public interface ClientNamenodeProtocal {
//为了保证客户端和服务端的版本是一致的,如果没有定义将报错 public static final long versionID = 1L;
public String getMetaData(String path);
} |
接口的实现类是:
package cn.toto.rpc.server;
import cn.toto.rpc.protocal.ClientNamenodeProtocal;
public class NameNode implements ClientNamenodeProtocal {
@Override public String getMetaData(String path) { return path + " 2 {BLK1,BLK2} {BLK1:min1,mini2} {BLK2:mini4,mini5}"; }
} |
用于发布的接口类:
package cn.toto.rpc.server;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.Builder; import org.apache.hadoop.ipc.RPC.Server;
import cn.toto.rpc.protocal.ClientNamenodeProtocal;
public class ServerPublisher {
public static void main(String[] args) throws Exception, IOException {
Builder builder = new RPC.Builder(new Configuration());
//暴露的仅仅是ClientNamenodeProtocal.class中的new NameNode()实现的方法 builder.setBindAddress("localhost").setPort(8787) .setProtocol(ClientNamenodeProtocal.class) .setInstance(new NameNode());
//构建一个Server,并且启动一下 Server server = builder.build(); server.start(); } } |
1.2.客户端
写完客户端后,可以开始写客户端调用进行测试了。
客户端的代码如下:
代码说明:
ClientNamenodeProtocal |
和服务端一样的接口 |
HdfsClient |
用于调用的客户端代码 |
接口代码如下:
package cn.toto.rpc.protocal;
public interface ClientNamenodeProtocal {
//为了保证客户端和服务端的版本是一致的,如果没有定义将报错 public static final long versionID = 1L;
public String getMetaData(String path);
} |
客户端代码:
package cn.toto.rpc.client;
import java.io.IOException; import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC;
import cn.toto.rpc.protocal.ClientNamenodeProtocal;
public class HdfsClient {
/** * 在使用这个之前,需要先启动服务端 */ public static void main(String[] args) throws IOException { //通过这种方式获取到一个远程调用对象 ClientNamenodeProtocal nameNode = RPC.getProxy(ClientNamenodeProtocal.class, 1L, new InetSocketAddress("localhost",8787), new Configuration());
//调用服务端的接口,看看返回的结果 String metaData = nameNode.getMetaData("/a.doc"); System.out.println(metaData); } } |
输出的结果: