运用Hadoop的RPC框架来进行数据交互
Hadoop中自己提供了一个RPC的框架。集群中各节点的通讯都使用了那个框架,挺有意思的。我们自己来使用一下看看
目录结构
服务端
业务接口
首先定义业务方法的接口:ClientNamenodeProtocol
ClientNamenodeProtocol.java
package com.lyz.bigdata.hadooprpc.protocol;
/**
*@Author:[email protected] Lyz
*@Date: 2019/1/23 15:43
*@Description:
**/
public interface ClientNamenodeProtocol {
//协议版本
public static final long versionID =1L;
public String getMetaData (String path);
}
业务实现类
package com.lyz.bigdata.hadooprpc.servvice;
import com.lyz.bigdata.hadooprpc.protocol.ClientNamenodeProtocol;
/**
*@Author:[email protected] Lyz
*@Date: 2019/1/23 15:36
*@Description:
**/
public class MyNameNode implements ClientNamenodeProtocol {
// 模拟namenode的业务方法之一:查询元数据
@Override
public String getMetaData(String path) {
return path+": 3 - {BLK_1,BLK_2 } ....";
}
}
服务端代码
使用下面的代码可以把业务类发布为一个服务。
PublishServiceUtil.java
package com.lyz.bigdata.hadooprpc.servvice;
import com.lyz.bigdata.hadooprpc.protocol.ClientNamenodeProtocol;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.Server;
/**
*@Author:[email protected] Lyz
*@Date: 2019/1/23 15:50
*@Description:
**/
public class PublishServiceUtil {
public static void main(String[] args) throws Exception {
Builder builder = new Builder(new Configuration());
builder.setBindAddress("localhost")
.setPort(8888)
.setProtocol(ClientNamenodeProtocol.class)
.setInstance(new MyNameNode());
Server service = builder.build();
service.start();
}
}
客户端
需要注意的是客户端使用的接口的完整签名必须跟服务端使用的一致。
这里我为了方便,直接在一个项目中写客户端了。如果服务端跟客户端项目不同,一定要记得这一点。
MyHdfsClient.java
package com.lyz.bigdata.hadooprpc.client;
import com.lyz.bigdata.hadooprpc.protocol.ClientNamenodeProtocol;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import java.net.InetSocketAddress;
/**
*@Author:[email protected] Lyz
*@Date: 2019/1/23 16:07
*@Description:
**/
public class MyHdfsClient {
public static void main(String[] args) throws Exception{
ClientNamenodeProtocol namenode = RPC.getProxy(ClientNamenodeProtocol.class,1L,new InetSocketAddress("localhost",8888),new Configuration());
String metaData = namenode.getMetaData("/rhm.love");
System.out.println(metaData);
}
}
运行结果