我们在centos下打开JPS,看到有几个进程,如果我们设置断点了的话,是在jps看到进程里面有RPCClient的。这说明,namenode,datanode这些都是一个类!
在eclipse里面打开Ctrl+shift+T 可以查找类
找到namenode之后,我们开始关联源码,
在这里,我们先去搜索下载一个hadoop的源码【Java的源码之前说过了,在jdk里面有】
搜索hadoop2.2.0 src 发现有两种格式 ,一个是tar.jz格式,一个是zip格式
接下来,我们关联好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的值是“分布式文件系统”
之后,由于我们下载了源码,也连接了源码,接下来,我们看一眼这些个源码:
Ctrl+T 可以看到这个类的所属范围。比如,点FileSystem就可以看到超类型的结构,是谁谁的子类
之后,点FileSystem.get之类的,会给出说明
返回这个URI文件系统的计划和权威【翻译不准确,但大致理解这个意思】
下面这个是FileSystem.open的
参数是一个路径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进入许多方法对象里面去,但是我这边进入的和他不一样。源码打不开,不知道为什么】
【不懂的名词:懒汉/饿汉 多线程 】
这个是configuration的文件:四个xml文件。其实就是这里所说的conf,配置。core-default.xml是hadoop默认的配置文件
倘若想看这个core-default,那在左边的“引用的库” 找到hadoop-common-2.2.0.jar 再找到里面的core-default即可。
双击打开,可以看到,
这个版本是从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又可以得到服务端的代理对象,我得到这个代理对象之后,我要抓取块的信息。