Hadoop源码情景小析(1)fs -copyFromLocal

第一次读比较大型的源码。有看到列一大幅类图的,一看头就大。有看到简要分析主要数据结构的,因为源码这么多,总不能事无具细地全讲一遍吧。但少了程序运行的脉络,总让人疑惑系统到底怎么运转起来的。我想,对于初学者,还是从程序运行的线索入手,按功能弄清每个模块的代码,然后连点成线,成面,最终从宏观再整理清整个系统架构,这样还能顺便学习一下大型系统的实现。当然,对于架构大牛,或者java大牛,可能就不需要这么细的去看,毕竟其中起粘合剂的部分对于大多数系统来说都是相似的。看一下宏观的架构分析就行了。

适合的读者?

当然是初学者。我自己本身也只是java菜鸟,对面向对象还是有一点点体会的。毕竟hadoop是用java写的,至少也要有一点java基础什么的才能看得懂吧,虽然要求也不高。

分析过程也只能抓重点,不可能每一行代码都去深究。版本是hadoop 0.20.203 。好吧,我们从命令

  1. hadoop fs -copyFromLocal xx xx  
开始。hadoop支持多种文件系统,当然,这里我们关心的是hdfs。

hdfs 的shell命令是由类FsShell去执行的。

  1. public static void main(String argv[]) throws Exception {  
  2.   FsShell shell = new FsShell();  
  3.   int res;  
  4.   try {  
  5.     res = ToolRunner.run(shell, argv);  
  6.   } finally {  
  7.     shell.close();  
  8.   }  
  9.   System.exit(res);  
  10. }  
既然是命令行,需要一些命令解析的操作,所以由ToolRunner来协助。具体的功能就是由FsShell的成员函数来提供的。
  1. void copyFromLocal(Path[] srcs, String dstf) throws IOException {  
  2.     Path dstPath = new Path(dstf);  
  3.     FileSystem dstFs = dstPath.getFileSystem(getConf());  
  4.     if (srcs.length == 1 && srcs[0].toString().equals("-"))  
  5.       copyFromStdin(dstPath, dstFs);  
  6.     else  
  7.       dstFs.copyFromLocalFile(falsefalse, srcs, dstPath);  
  8.   }  
dstFS.copyFromLocalFile 是FileSystem提供的。注意这里的FileSystem是从Path get的,因为要支持多种文件系统。
  1. public void copyFromLocalFile(boolean delSrc, boolean overwrite,  
  2.                               Path[] srcs, Path dst)  
  3.   throws IOException {  
  4.   Configuration conf = getConf();  
  5.   FileUtil.copy(getLocal(conf), srcs, this, dst, delSrc, overwrite, conf);  
  6. }  

相关推荐