命令行接口
现在我们通过命令行交互来进一步认识HDFS。HDFS还有很多其他接口,但命令行是最简单的,同时也是许多开发者最熟悉的。
在我们设置伪分布配置时,有两个属性项需要进一步解释。第一项是 fs.default.name,设置为 hdfs://localhost/,用于设置 Hadoop 的默认文件系统。文件系统是由URI指定的,这里我们已使用hdfs URI来配置HDFS为 Hadoop的默认文件系统。HDFS的守护程序将通过该属性项来确定HDFS namenode的主机及端口。我们将在localhost默认端口8020上运行namenode。 这样一来,HDFS客户端可以通过该属性得知namenode在哪里运行进而连接到它。
第二个属性dfs.replication我们设为1,这样一来,HDFS就不会按默认设置将文件系统块复本设为3。在单独一个datanode上运行时,HDFS无法将块复制到3个datanode上,因此它会持续给出块复本不足的警告。设置这个属性之后,就不会再有问题了。
基本文件系统操作
至此,文件系统已经可以使用了,我们可以执行所有常用的文件系统操作,例如,读取文件,创建目录,移动文件,删除数据,列出目录,等等。可以输入hadoop fs -help命令获取所有命令的详细帮助文件。
首先从本地文件系统将一个文件复制到HDFS:
% hadoop fs -copyFromLocal input/docs/quangle.txt hdfs://localhost/user/tom/quangle.txt
该命令调用Hadoop文件系统的shell命令fs,该命令提供了一系列子命令,在这里的例子中,我们执行的是-copyFromLocal。本地文件quangle.txt被复制到 运行在localhost上的HDFS实例中,路径为/user/tom/quangle.txt。事实上,我们可以简化命令格式以省略主机的URI并使用默认设置,即省略 hdfs: //localhost,因为该项已在 core-site.xml 中指定。
% hadoop fs -copyFromLocal input/docs/quangle.txt /user/tom/quangle.txt
我们把文件复制回本地文件系统,并检査是否一致:
% hadoop fs -copyToLocal quangle.txt quangle.copy.txt % md5 input/docs/quangle.txt quangle.copy.txt MD5 (input/docs/quangle.txt) = al6f231da6b05e2ba7a3B9320e7dacd9 MD5 (quangle.copy.txt) = al6f231da6b05e2ba7a3B9320e7dacd9
由于MD5键值相同,表明这个文件在HDFS之旅中得以幸存并保存完整。
最后,我们看一下HDFS文件列表。我们首先创建一个目录看它在列表中是如何显示的:
返回的结果信息与Unix命令ls -1的输出结果非常相似,仅有细微差别。第1列显示的是文件模式。第2列是这个文件的备份数(这在传统Unix文件系统是没有的)。由于我们在整个文件系统范围内设置的默认复本数为1,所以这里显示的也都是1。这一列的开头目录为空,因为本例中没有使用复本的概念——目录作为元数据保存在namenode中,而非datanode中。第3列和第4列显示文件的所属用户和组别。第5列是文件的大小,以字节为单位显示,目录大小为0。第6列和第7列是文件的最后修改日期与时间。最后,第8列是文件或目录的绝对路径。