hadoop RPC(三)

RPC

远程过程调用(RPC):hadoop的节点之间的进程通信(类与类之间),以及与客户端的通信.心跳也是通过RPC完成的
为什么datanode定期会向Namenode汇报block信息

RPC的现实技术:动态代理,反射,socker通信生成RPC客户端

serveice
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package cn.itcast.hadoop.hdfs;
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;
publci class ServiceStart{
public static void main(String[] args)
throws HadoopIllegalArgumentException, IOException {
Builder builder = new RPC.Builder(new Configuration());
builder.setBindAddress("cluster1").setPort(10000)
.setProtocol(LoginInter.class).setInstance(new LoginServer());
Server server = builder.build();
server.start();
// 多个业务逻辑处理
}
}
1
2
3
4
5
6
7
8
package cn.itcast.hadoop.hdfs;
public class LoginServer implements LoginInter {
@Override
public String login(String username, String passwd) {
return username + "success!!";
}
}
client
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package cn.itcast.hadoop.hdfs;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class LoginControl {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
LoginInter proxy = RPC.getProxy(LoginInter.class, 1L,
new InetSocketAddress("192.168.1.222",10000), new Configuration());
String r = proxy.login("femn", "femn");
System.out.println(r);
// 当增加服务器提供服务时,客户端能够感知服务端.
// 在不改变的情况下,知道去调用新服务器的服务
// 服务调用动态转发和负载均衡的实现,使用zookeeper可以很容易的实现
}
}
service and client
1
2
3
4
5
6
package cn.itcast.hadoop.hdfs;
public interface LoginInter {
public static final long versionId=1L;
public String login(String username,String passwd);
}
RPC实现机制 zookeeper实现:服务调用动态转发和负载均衡的实现
Share Comments