RPC机制与hdfs下载源码剖析

这里没有贴出源码,有兴趣的可以debug跟踪然后根据我的源码描述,看懂hdfs是怎么下载文件的

1.RPC机制

接口代理:

public interface Businesable{

public static final long versionID= 10010;

public String sayHello(String name);

}

versionID :代表服务端的版本号,此时客户端调用服务端方法的时候,必须比对此版本号

服务端:

//创建一个服务,配置必要的设置:设置服务端的实例,遵循的协议(客户端要调用服务端的方法,需要得到服务端的代理对象,这里使用接口代理)、地址和端口

Server server = new RPC.Builder(new Configuration())

.setInstance(new RPCServer()).setProtocol(Businesable.class)

.setBindAddress("192.168.92.88").setPort(10000).build();

server.start();

客户端:

Businesable proxy = RPC.getProxy(Businesable.class,10010, new InetSocketAddress("192.168.92.88",10000), new Configuration());

String name = proxy.sayHello(args[0]);

System.out.print(name);

客户端可以打 jar 包。 windows 系统上可以运行 jar ,传入参数即可调用服务端

java-jar RPCClient.jartom:这里传入参数为tom,值得注意的是:在另一台主机调用时,jdk版本不得高于服务端。否则会出现高版本的jdk在低版本的jvm运行的异常

下载源码剖析

1.首先找到默认的hdfs配置文件,找到实现类DistributedFileSystem,利用反射初始化这个对象

,然后调用初始化方法(initailize),初始化其他对象,其中有一个对象为DFSClient,然后将其作为distributedFileSystem的成员变量,distributedFileSystem这样就持有了DFSClient的引用,在DFSClienthadoop使用RPC机制得到了服务端的一个代理对象,然后对其增强返回一个新的代理对象(原代理对象的增强:代理对象的代理对象),使用jdk的动态代理对方法增强,然后将这个增强后的代理对象作为DFSClient的引用,这样FileSystem就可以间接的获取服务端的代理对象的引用



2.客户端与服务端RPC通信,客户端将文件名传过去,服务端查找这个文件的元数据信息,然后返回给客户端,客户端得到元数据信息,作为流的成员变量,这个流持有了元数据,在任何机器上都可以去下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值