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

2019-03-28 13:53|来源: 网络

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

更多Hadoop相关信息见Hadoop 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=13

适合的读者?

当然是初学者。我自己本身也只是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. }  

相关问答

更多
  • 关于内核的书不在多,而是要精,强烈推荐 《Linux内核设计与实现》,英文名Linux Kernel Development,机械工业出版社,¥35, 美国Robert Love著,陈莉君译。 此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。对没怎么深入内核的人来说,这是强烈推荐的一本书。
  • 它们的区别在于copyToLocal的源路径只能是一个本地的文件。而put的源路径 可能是多个文件,也可能是标准输入。 当hadoop fs -put - hdfs://host:port/hadoop/hadoopfile时表示从标准输入接收数据,这个时候目标路径必须是一个文件。
  • 它们的区别在于copyToLocal的源路径只能是一个本地的文件。而put的源路径 可能是多个文件,也可能是标准输入。 当hadoop fs -put - hdfs://host:port/hadoop/hadoopfile时表示从标准输入接收数据,这个时候目标路径必须是一个文件。
  • copyFromLocal类似于put命令,除了源被限制为本地文件引用。 所以,基本上你可以用put来做,所有这些都用copyFromLocal ,但是反之亦然。 同样的, copyToLocal类似于get命令,除了目标被限制在本地文件引用之外。 因此,您可以使用get而不是copyToLocal ,但不能相反。 参考 : Hadoop的文档 。 更新 :截至2015年10月的最新消息,请看下面的答案。 copyFromLocal is similar to put command, except tha ...
  • 这是因为hdfs:///user/cloudera不存在。 运行hdfs dfs -ls可能会给你类似的错误。 没有指定的目标文件夹,它会查找. ,运行该命令的UNIX帐户的当前HDFS目录。 在当前的UNIX帐户可以使用HDFS之前,您必须先使用hdfs dfs -mkdir "/user/$(whoami)" ,或者您可以指定要复制的其他HDFS位置 It's happening because hdfs:///user/cloudera doesn't exist. Running hdfs dfs ...
  • 您也可以直接使用该选项 hadoop mfs -Dfs.mapr.trace=DEBUG -ls maprfs://maprfs.example.com/tmp/1GB.img You can also use the option directly hadoop mfs -Dfs.mapr.trace=DEBUG -ls maprfs://maprfs.example.com/tmp/1GB.img
  • 首先尝试这个命令。 hadoop fs -ls / 如果它列出了本地文件系统文件。(不是hdfs),那么试试 hadoop fs -ls hdfs://IP-ADDRESS-of your-machine/ 现在将您的文件复制到hdfs hadoop fs -copyFromLocal /Documents/file hdfs://Ip-addressofyourmachine/above result path first try this command. hadoop fs -ls / if ...
  • 我们聊聊谈论它,我有更多的时间向你解释这个。 如果您在代码中使用此代码段: FileSystem fs = FileSystem.get(conf); // stuff to create 然后重要的是conf对象内部的内容。 如果你没有放任何东西,返回的FileSystem总是本地的。 如果你把它放在你的conf中: conf.set("fs.default.name", "hdfs://localhost:54310"); 然后你应该通过“服务器”上的namenode连接到你的HDFS,你 ...
  • 根据您的输入,您的Hadoop安装似乎工作正常。 有什么问题, hadoop fs -copyFromLocal希望将目录HDFS目录作为目标目录,而不是Hadoop存储其块的本地目录。 所以在你的情况下,命令应该看起来像(例如): sara@ubuntu:/usr/lib/hadoop/hadoop-2.3.0/bin$ hdfs dfs -copyFromLocal /home/sara/Downloads/CA-GrQc.txt /sampleDir/ 其中sampleDir是您使用hadoop ...
  • 检查namenode进程是否在您的localhost和此端口54310上运行 Check whether namenode process is running on your localhost and on this port 54310