这里没有贴出源码,有兴趣的可以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();
客户端:
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的引用,在DFSClient中hadoop使用RPC机制得到了服务端的一个代理对象,然后对其增强返回一个新的代理对象(原代理对象的增强:代理对象的代理对象),使用jdk的动态代理对方法增强,然后将这个增强后的代理对象作为DFSClient的引用,这样FileSystem就可以间接的获取服务端的代理对象的引用
2.客户端与服务端RPC通信,客户端将文件名传过去,服务端查找这个文件的元数据信息,然后返回给客户端,客户端得到元数据信息,作为流的成员变量,这个流持有了元数据,在任何机器上都可以去下载