现在我们将通过命令行与HDFS交互。HDFS还有很多其他接口,但命令行是最简单的,同时也是许多开发者最熟悉的。
在我们设置伪分布配置时,有两个属性需要进一步解释。首先是fs.default.name,设置为hdfs://localhost/,用来为Hadoop设置默认文件系统。文件系统是由URI指定的,这里我们已使用了一个hdfs URI 来配置HDFS为Hadoop的默认文件系统。HDFS的守护程序将通过这个属性来决定HDFS名称节点的宿主机和端口。我们将在localhost上运行,默认端口为8020。这样一来,HDFS用户将通过这个属性得知名称节点在哪里运行以便于连接到它。
第二个属性dfs.replication,我们设为1,这样一来,HDFS就不会按默认设置将文件系统块复制3份。在单独一个数据节点上运行时,HDFS无法将块复制到3个数据节点上,所以会持续警告块的副本不够。此设置可以解决这个问题。
基本文件系统操作
文件系统已经就绪,我们可以执行所有其他文件系统都有的操作,例如,读取文件,创建目录,移动文件,删除数据,列出索引目录,等等。输入hadoop fs -help命令即可看到所有命令详细的帮助文件。
首先将本地文件系统的一个文件复制到HDFS:
1. % hadoopfs -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中指定的那样。
1. % hadoop fs -copyFromLocal input/docs/quangle.
txt /user/tom/quangle.txt
也可以使用相对路径,并将文件复制到home目录,即/user/tom:
1. % hadoop fs -copyFromLocal input/docs/quangle.txt quangle.txt
我们把文件复制回本地文件系统,看看是否一样:
1. % hadoop fs -copyToLocal quangle.txt quangle.copy.txt
2. % md5 input/docs/quangle.txt quangle.copy.txt
3. MD5 (input/docs/quangle.txt) = a16f231da6b05e2ba7a339320e7dacd9
4. MD5 (quangle.copy.txt) = a16f231da6b05e2ba7a339320e7dacd9
MD5分析结果是一样的,表明这个文件在HDFS之旅中得以幸存并完整。
最后,我们看一下HDFS文件列表。我们创建一个目录来看看它在列表中如何显示:
1. % hadoop fs -mkdir books
2. % hadoop fs -ls .
3. Found 2 items
4. drwxr-xr-x - tom supergroup 0
2009-04-02 22:41 /user/tom/books
5. -rw-r--r-- 1 tom supergroup 118
2009-04-02 22:29 /user/tom/quangle.txt
返回的信息结果与Unix命令ls -l的输出非常相似,仅有细微差别。第一列显示的是文件格式。第二列是这个文件的副本数(这在Unix文件系统是没有的)。由于我们设置的默认副本数在网站范围内为1,所以这里显示的也都是1。这一列的开头目录栏是空的,因为副本的概念并没有应用-- 目录是作为元数据并存在名称节点中的,而非数据节点。第三列和第四列显示文件的所属用户和组别。第五列是文件的大小,以字节显示,目录大小为0。第六列和第七列是文件的最后修改日期与时间。最后的第八列是文件或目录的绝对路径。
HDFS中的文件许可
HDFS对于文件及目录有与POSIX非常相似的许可模式。
共有三种形式的许可:读取许可(r)、写入许可(w)和执行许可(x)。读取文件或列出目录内容时需要读取许可。写入一个文件,或是在一个目录上创建或删除文件或目录,需要写入许可。对于文件而言执行许可可以忽略因为HDFS中不能执行文件(与POSIX不同),但在访问一个目录的子项时是需要的。
每个文件和目录都有一个所属用户、所属组别和模式。这个模式是由所属用户的许可、组内其他成员的许可及其他用户的许可组成。
客户端的标识是通过它正在运行的进程的username(名称)和groups(组别)来确定的。由于客户端是远程的,任何人都可以简单地在远程系统上创建一个账户来进行访问。因此,许可只能在一个合作的团体中的用户中使用,作为共享文件系统资源和防止数据意外损失的机制,而不能在一个敌意的环境中保护资源。但是,除去这些缺点,为防止用户或自动工具及程序意外修改或删除文件系统的重要部分,使用许可还是值得的(这也是默认的配置,参见dfs.permissions属性)。
如果启用了许可检查,所属用户许可与组别许可都会被检查,以确认用户的用户名与所属用户许可是否相同,确认他是否属于此用户组的成员;若不符,则检查其他许可。
这里有一个超级用户的概念,超级用户是名称节点进程的标识。对于超级用户,系统不会执行任何许可检查。