RPC的原理可以参考之前的博客自定义rpc的实现,本文做的仅仅是hadooprpc的简单调用来模拟实现namenode元数据的业务查询。
一、protocol约定(接口规范)
ClientNamenodeProtocol.java
package HadoopRpc.protocol;
/**
* Created by tianjun on 2017/3/16 0016.
*/
public interface ClientNamenodeProtocol {
public static final long versionID = 1L;
public String getMetaData(String path);
}
二、服务器端
1、具体业务的实现:
MyNameNode.java
package HadoopRpc.service;
import HadoopRpc.protocol.ClientNamenodeProtocol;
/**
*
* Created by tianjun on 2017/3/16 0016.
*/
public class MyNameNode implements ClientNamenodeProtocol{
// 模拟namenode的业务方法之一:查询元数据
@Override
public String getMetaData(String path){
return path + ": 3 - {BLK_1,BLK_2} dn3...";
}
}
2、服务端的启动:
PublishServiceUtil.java
package HadoopRpc.service;
import HadoopRpc.protocol.ClientNamenodeProtocol;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;
import java.io.IOException;
/**
* 发布服务
* Created by tianjun on 2017/3/16 0016.
*/
public class PublishServiceUtil {
public static void main(String[] args) throws IOException {
RPC.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 HadoopRpc.client;
import HadoopRpc.protocol.ClientNamenodeProtocol;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.io.IOException;
import java.net.InetSocketAddress;
/**
* Created by tianjun on 2017/3/16 0016.
*/
public class MyHdfsClient {
public static void main(String[] args) throws IOException {
ClientNamenodeProtocol namenode = RPC.getProxy(ClientNamenodeProtocol.class, 1L, new InetSocketAddress("localhost", 8888), new Configuration());
String metaDate = namenode.getMetaData("/tianjun");
System.out.println(metaDate);
}
}
四、结果
先启动服务器端,在启动客户端,在客户端可以看到元数据的具体信息如下:
/tianjun: 3 - {BLK_1,BLK_2} dn3...
当然这仅仅是模拟,真正的元数据的管理是在hadoop的FSNamesystem.java这个类中。
hadoopRPC框架是在hadoop的dadoop-common的jar中。
本文通过自定义Hadoop RPC框架,模拟实现了NameNode元数据查询功能。主要包括接口规范定义、服务器端业务逻辑实现及服务发布、客户端调用流程等。
956

被折叠的 条评论
为什么被折叠?



