RPC机制与hdfs下载源码剖析

来源:互联网 发布:黑马程序员零基础教程 编辑:程序博客网 时间:2024/05/18 22:45

这里没有贴出源码,有兴趣的可以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