2.3 HDFS命令行操作详解
以上是对HDFS读取和存储过程的介绍,相信读者已经对其文件的读写过程有了一个基本的了解。下面我们开始学习HDFS中基本文件操作的方法。
首先是命令行操作。为了符合大多数用户对文件进行操作的习惯,HDFS 提供了一系列的命令行接口去执行文件的操作。
小提示:所有的命令行命令都是由Hadoop脚本触发的,如果未按指定要求运行,例如缺少指定参数等,会自动在屏幕上打印所有的命令描述。
2.3.1 HDFS中4个通用的命令行操作
HDFS 内置了一套对整体环境进行处理的命令行操作,因为篇幅的关系,这里只列出最常用的几个命令行操作并注明使用方法和示例。
1.archive
使用方法:hadoop archive –archibeName NAME <src>* <dest>
说明:创建一个hadoop档案文件。
示例:hadoop archive –archibeName sample.txt /user/file.txt /user/sample.txt
2.distp
使用方法:hadoop distcp <src1> <src2>
说明:在相同的文件系统中并行地复制文件。
示例:hadoop distcp hdfs://host/user/file1 hdfs://host/user/file2
3.fs
使用方法:hadoop fs [COMMAND_OPTIONS]
说明:运行一个常规的文件基本命令。
示例:参考2.3.2节。
4.jar
使用方法:hadoop jar <jar> [mainClass] args
说明:运行一个内含Hadoop运行代码的jar文件。
示例:hadoop jar Sample.jar mainMethod args
2.3.2 HDFS文件18个基本命令行的操作
从上节可以看到,对于HDFS来说,fs是启动命令行动作,该命令用于提供一系列子命令,一般形式为“hadoop fs -cmd <args> ”,“cmd”是子命令,而“args”是具体的命令操作。例如对于帮助文件的获取,采用如下命令行来获取帮助。
$ hadoop fs –help
HDFS常用的文件操作命令如下:
1.-cat
使用方法:hadoop fs -cat URI
说明:将路径指定的文件输出到屏幕。
示例:hadoop fs -cat hdfs://host1:port1/file
hadoop fs -cat file:///file3
2.-copyFromLocal
使用方法:hadoop fs -copyFromLocal <localsrc>URI
说明:将本地文件复制到HDFS中。
3.copyToLocal
使用方法:hadoop fs -copyToLocal <localsrc>URI
说明:将一个文件从HDFS系统中复制到本地文件。
4.-cp
使用方法:hadoop fs -cp URI
说明:将文件从源路径复制到目标路径。这个命令可以复制多个源路径,但是目标路径必须是一个目录。
示例:hadoop fs -cp /user/file /uesr/files
Hadoop fs -cp /user/file1 /user/files /user/dir
5.-du
使用方法:hadoop fs -du URI
说明:显示目录中所有文件大小,或者指定一个文件时,显示此文件大小。
示例:hadoop fs -du /user/dir1
Hadoop fs -du hdfs://host:port/user/file
6.-dus
使用方法:hadoop fs -dus <ars>
说明:显示目标文件大小。
7.-expunge
使用方法:hadoop fs -expunge
说明:用于清空回收站。
8.-get
使用方法:hadoop fs -get <locaodst>
说明:复制文件到本地文件系统。
示例:hadoop fs -get /user/file localfile
Hadoop fs -get hdfs://host:port/file localfile
9.-ls
使用方法:hadoop fs -ls <arg>
说明:浏览本地文件,并按如下格式返回文件信息。
文件名<副本数> 文件大小 修改日期 权限 用户ID/组ID
如果浏览的是一个目录,则返回其子文件的一个列表,信息如下:
目录名<dir> 修改日期 修改时间 权限 用户ID/组ID
示例:hadoop fs -ls /user/file
Hadoop fs -ls hdfs://host:port/user/dir
10.-lsr
使用方法:hadoop fs -lsr
说明: 递归地查阅文件内容。
11.-mkdir
使用方法:hadoop fs -mkdir<path>
说明:创建对应的文件目录,并直接创建相应的父目录。
示例:hadoop fs -mkdir /user/dir1/dir2/dir3/file
Hadoop fs -mkdir hdfs://host:port/user/dir
12.-mv
使用方法:hadoop fs -mv URI <dest>
说明:将源文件移动到目标路径,目标路径可以有多个,但不允许在不同文件系统中移动。
示例:hadoop fs -mv /user/file1 /user/file2
Hadoop fs -mv hdfs://host:port/file1 hdfs://host:prot/file2
13.-put
使用方法:hadoop fs -put<localsrc> <dst>
说明:从本地文件系统复制单个或多个源路径到目标文件系统。
示例:hadoop fs -put localfile /user/file
hadoop fs -put localfile hdfs://host:port/user/file
14.-rm
使用方法:hadoop fs -rm URI
说明:删除指定的文件,且要求非空的目录和文件。
示例:hadoop fs -rm hdfs://host:port/file
15.-rmr
使用方法:hadoop fs -rmr URI
说明:递归地删除指定文件中的空目录。
16.-Setrep
使用方法:hadoop fs -setrep [R] <path>
说明:改变一个副本的复制份数。
示例:hadoop fs -setrep -w 3 -R /user/file
17.-Test
使用方法:hadoop fs -test -[ezd] URI
说明:使用ezd对文件进行检查。
-e检查文件是否存在,若存在返回值为0;
-z检查文件是否为0字节,如果是,则返回0;
-d检查路径是否为目录,如果是,则返回1,否则返回0
18.-text
使用方法:hadoop fs -text <src>
说明:将源文件输出为文本格式,运行的格式是zip以及Text类
以上是HDFS中使用命令行对文件进行操作,使用方法与一般操作命令类似。例如,使用者如果将某一个文件从本地的文件系统复制到HDFS中,可以通过执行以下命令进行操作:
$ hadoop fs -copyFromLocal /user/localFile.txt sample.txt
此部分代码通过调用命令fs,指定执行脚本命令-copyFromLocal,将本地文件localFile.txt复制到运行在localhost上的HDFS文件系统中。
小提示:细心的读者可能注意到,这里使用的命令行与上文介绍的命令行有所不同,在文件具体上传路径上并没有写绝对路径,而是对相对路径进行了简化,绝对路径前的地址在搭建HDFS系统时已经通过core-site.xml进行了指定,这里只需要简化执行即可。
2.3.3 HDFS文件访问权限详解
对于传统的文件读写与访问来说,设置文件的权限是非常重要的,操作系统可以根据其用户级别区分可以执行的操作。HDFS 中访问权限的设置基于传统的文件权限设置,目前分为以下四类。
● 只读权限-r:最基本的文件权限设置,应用于所有可进入系统的用户,任意一个用户读取文件或列出目录内容时只需要只读权限。
● 写入权限-w:用户使用命令行或者 API接口对文件或文件目录进行生成以及删除等操作的时候需要写入权限。
● 读写权限-rw:同时具备上述两种权限功能的一种更加高级的权限设置。
● 执行权限-x:一种特殊的文件设置,HDFS目前没有可执行文件,因此一般不对此进行设置,但是可将此权限用于对某个目录的权限设置以对用户群体加以区分。
相信读者在阅读到此的时候已经运行了部分命令行代码,其中最常用的是“-ls”命令,用于浏览整个文件目录。如果单独运行此命令,那么一般结果如图2-5所示。
图2-5 输入–ls命令结果
请读者首先查看图2-5的左边部分,该部分是对文件权限的说明,标注了当前用户具有所有权限。
小提示:读者可能会感到奇怪,为什么这里分别有“-rw”、“-r”和“-r”三个权限标注,这分别对应后面的文件夹数目,标注当前用户对文件夹的操作权限。
阿拉伯数字代表文件被保存的副本数目,其后紧接的是文件的所属用户及用户的组别。针对HDFS使用者来说,大多数操作都是基于远程访问的。任何具有读写权限的用户都可以使用自己的用户名来创建一个用户对文件进行访问,并且可以将文件的权限分享给同组别的用户使用。在图中可以看到,文件对归属用户、所属组别作了规定。
最后是文件大小、创建时间以及存储路径等。
小提示:请读者观察,这里用户名使用了super-user这一用户概念,特指使用NameNode登录用户建立的文件,super-user可以不受文件权限限制而访问任何一个HDFS文件系统的任意文件。