Hadoop中自己提供了一个RPC的框架。集群中各节点的通讯都使用了那个框架,挺有意思的。我们自己来使用一下看看。
示例代码已经上传到http://download.csdn.net/detail/mrbcy/9760207
服务端
业务接口
首先定义业务方法的接口:ClientNamenodeProtocol
ClientNamenodeProtocol.java
package tech.mrbcy.hadooprpc.protocol;
public interface ClientNamenodeProtocol {
// 协议版本
public static final long versionID = 1L;
public String getMetaData(String path);
}
业务实现类
package tech.mrbcy.hadooprpc.service;
import tech.mrbcy.hadooprpc.protocol.ClientNamenodeProtocol;
public class MyNameNode implements ClientNamenodeProtocol{
//模拟NameNode的业务方法,获取元数据
@Override
public String getMetaData(String path){
return path+": 3 - {BLK_1,BLK_2} ...";
}
}
服务端代码
使用下面的代码可以把业务类发布为一个服务。
PublishServiceUtil.java
package tech.mrbcy.hadooprpc.service;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.Server;
import tech.mrbcy.hadooprpc.protocol.ClientNamenodeProtocol;
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();
}
}
客户端
需要注意的是客户端使用的接口的完整签名必须跟服务端使用的一致。
这里我为了方便,直接在一个项目中写客户端了。如果服务端跟客户端项目不同,一定要记得这一点。
MyHdfsClient.java
package tech.mrbcy.hadooprpc.client;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import tech.mrbcy.hadooprpc.protocol.ClientNamenodeProtocol;
public class MyHdfsClient {
public static void main(String[] args) throws Exception {
ClientNamenodeProtocol namenode = RPC.getProxy(ClientNamenodeProtocol.class,
1L, // 这里指定的协议版本号要跟接口中的versionID的值保持一致
new InetSocketAddress("localhost", 8888), new Configuration());
String metaData = namenode.getMetaData("testRpc.log");
System.out.println(metaData);
}
}
我们也可以在自己的项目中使用Hadoop的RPC框架,把Hadoop的Common包导入进来就可以了。