【2-6】HDFS读取数据的过程

我们在centos下打开JPS,看到有几个进程,如果我们设置断点了的话,是在jps看到进程里面有RPCClient的。这说明,namenode,datanode这些都是一个类!

在eclipse里面打开Ctrl+shift+T 可以查找类

找到namenode之后,我们开始关联源码,

在这里,我们先去搜索下载一个hadoop的源码【Java的源码之前说过了,在jdk里面有】

搜索hadoop2.2.0 src  发现有两种格式 ,一个是tar.jz格式,一个是zip格式

这里复制以下二者的区别,其实Windows也可以打开tar.gz的

tar.gz与zip的区别

这几天开始看有关J2EE得书,并试着做上面的小项目,在做项目之前必要的是下载自己需要的相关软件和框架。在下载东西的时候总是碰见后缀是.tar.gz和.zip的问题,搞不清楚是怎么回事,不晓得下载哪个文件才是对自己有用的。后来才知道,其实这两个压缩文件里面包含的内容是一样的,只是压缩格式不一样,tar.gz格式的文件比zip文件要小不少。tar.gz压缩格式用于unix的操作系统,而zip用于windows的操作系统,但在windows系统中WinRar工具同样可以解压缩tar.gz格式的。这下好了,不用再对下载那个文件而迟疑了。


接下来,我们关联好hadoop的源码【也就是在未连接源码那里点连接,外部——文件夹,然后点上hadoop src那个文件夹就好】

之后在其中搜索namenode,Ctrl+shift+T 是能找到namenode的。包是org-阿帕奇-hadoop-

打开这个namenode.class,里面能找到main方法【1300+行左右】


先讲下载,下载比较简单

下载是在HDFSDemo里面写的,


我打开那个下载的代码,在

public static void main(String[] args) throws Exception{
		// TODO 自动生成的方法存根
			FileSystem fs = FileSystem.get(new URI("hdfs://itcast01:9000"),new Configuration());
			InputStream in =  fs.open(new Path("/test.jar"));
			OutputStream out = new FileOutputStream("c://test.jar111");
			IOUtils.copyBytes(in, out, 4096, true);
			
	}
四行代码,分别在第一行和第二行的位置处打两个断点。

第一次运行在第一行开头,再点继续,运行到第二行开头时,给出的变量fs的值是“分布式文件系统”

【2-6】HDFS读取数据的过程_第1张图片

之后,由于我们下载了源码,也连接了源码,接下来,我们看一眼这些个源码:

Ctrl+T 可以看到这个类的所属范围。比如,点FileSystem就可以看到超类型的结构,是谁谁的子类

【2-6】HDFS读取数据的过程_第2张图片


之后,点FileSystem.get之类的,会给出说明

【2-6】HDFS读取数据的过程_第3张图片

返回这个URI文件系统的计划和权威【翻译不准确,但大致理解这个意思】


下面这个是FileSystem.open的

【2-6】HDFS读取数据的过程_第4张图片

参数是一个路径path,是打开那个文件的地址。


好了,说回来,我们继续。现在打了两个断点,全部运行完成之后,在c盘出现了test.jar111这个文件

之后,再一次main右键,调试方式——然后进入调试,在上面有 单步跳入F5  单步跳过F6 单步返回F7

我此时的断点在第一行

FileSystem fs = FileSystem.get(new URI("hdfs://itcast01:9000"),new Configuration());

这里,此时我如果想进入这个方法,摁F5或者上面的单步跳入键都可以,此时,它首先load URI这个类,然后进入URI的new构造方法,然后这个new完之后,要把configuration也load到里面,然后再进入到get方法里。

【在实际操作中,我并没有进入get方法里面,

如果想直接走过,摁F6

如果想从这个方法跳出去 F7

【程序员一定要会debug,打断点很重要!!!明天讲远程debug,可以让我能看到server的运行状况】

以后,namenode那个类是不可控的,如果我也想打断点,用远程debug。

【ASK:这时候他可以用F5进入许多方法对象里面去,但是我这边进入的和他不一样。源码打不开,不知道为什么】

【不懂的名词:懒汉/饿汉 多线程 】

【2-6】HDFS读取数据的过程_第5张图片 hdfs-default,和hdfs-site.xml

这个是configuration的文件:四个xml文件。其实就是这里所说的conf,配置。core-default.xml是hadoop默认的配置文件

倘若想看这个core-default,那在左边的“引用的库” 找到hadoop-common-2.2.0.jar 再找到里面的core-default即可。


双击打开,可以看到,

【2-6】HDFS读取数据的过程_第6张图片

这个版本是从0.23.0版本发展过来的。别的信息也可以看到,不过在这里没有讲。

同理,在hdfs2.2.0里面可以找到hdfs-default.xml文件,在这个文件中,可以查找【暂时还不知道哪个快捷键是查找】blocksize,可以看到默认的块的大小是134217728,即128M,搜索replication,可以看到默认的dfs.replication是复制3份。

-default一般是默认的配置,-site是可以让用户再自定义的


大体来说。。。源码是根据它的一些配置信息得到一些具体的实现类,实现类叫distributed FileSystem。


首先,我们先用FileSystem工具类,.get,进入get只完成一件事:根据你的文件类型找到你的实现类,实现类叫distributed FileSystem

我们看源码只看一些重要的步骤。。源码有20W+行....我只看方法(这个方法有没有返回值,有返回值的话,类型是什么,在哪儿new的,把什么东西这个里了)

【此处没听懂。。通过反射得到它的class类型,然后可以new它的instance




最开始我得到一个工具类FileSystem,我通过工具类FileSystem的get方法(读取配置信息,通过反射)来得到一个distributedFileSystem对象。构建出来之后,调用initialize()方法来初始化,在initialize里面构建了DFSClient,并将DFSClient作为它的成员变量。DFSClient里面通过HADOOP的RPC机制得到了一个服务端的代理对象$Proxy

这个代理对象它不满意,又使用JDK动态代理又进行了一次代理。


现在,我可以通过FileSystem得到distributedFileSystem,distributedFileSystem又可以得到DFSClient,DFSClient又可以得到服务端的代理对象,我得到这个代理对象之后,我要抓取块的信息。





你可能感兴趣的:(【2-6】HDFS读取数据的过程)