Hadoop 文件系统命令可以用来直接和 Hadoop 的文件系统交互,支持包括 HDFS、本地文件系统、WebHDFS、S3 等文件系统。
命令的入口是:
bin/hadoop fs <args>
下面我们介绍下常用的文件命令。
appendToFile 命令可以用来合并文件,或者将一个或多个文件添加到目标文件的末尾,也支持直接从标准输入获取。
hadoop fs -appendToFile <localsrc> ... <dst>
例子:
# 添加文件内容到目标文件末尾
hadoop fs -appendToFile localfile /user/hadoop/hadoopfile
# 合并多个文件
hadoop fs -appendToFile localfile1 localfile2 /user/hadoop/hadoopfile
# 支持其他文件系统
hadoop fs -appendToFile localfile hdfs://nn.example.com/hadoop/hadoopfile
# 支持标准输入
hadoop fs -appendToFile - hdfs://nn.example.com/hadoop/hadoopfile
cat 用来显示文件内容,和 Linux 的 cat 命令类似。
hadoop fs -cat [-ignoreCrc] URI [URI ...]
使用 -ignoreCrc
选项禁用文件校验。
例子:
hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
hadoop fs -cat file:///file3 /user/hadoop/file4
chmod 可以修改文件权限,类似 Linux 的 chmod 命令。
hadoop fs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]
使用 -R
选项递归修改。用户必须具有文件的权限(所有者或超级用户)。
chown 可以修改文件所有者,类似 Linux 的 chown 命令。
hadoop fs -chown [-R] [OWNER][:[GROUP]] URI [URI ]
使用 -R
选项递归修改。用户必须是超级用户。
count 可以用来计算指定路径下的目录、文件或者字节数量。
hadoop fs -count [-q] [-h] [-v] [-x] [-t [<storage type>]] [-u] [-e] [-s] <paths>
参数:
例子:
hadoop fs -count hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
hadoop fs -count -q hdfs://nn1.example.com/file1
hadoop fs -count -q -h hdfs://nn1.example.com/file1
hadoop fs -count -q -h -v hdfs://nn1.example.com/file1
hadoop fs -count -u hdfs://nn1.example.com/file1
hadoop fs -count -u -h hdfs://nn1.example.com/file1
hadoop fs -count -u -h -v hdfs://nn1.example.com/file1
hadoop fs -count -e hdfs://nn1.example.com/file1
hadoop fs -count -s hdfs://nn1.example.com/file1
cp 命令可以复制文件。
hadoop fs -cp [-f] [-p | -p[topax]] [-d] [-t <thread count>] [-q <thread pool queue size>] URI [URI ...] <dest>
参数:
例子:
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp -f -d /user/hadoop/file1 /user/hadoop/file2
hadoop fs -cp /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
hadoop fs -cp -t 5 /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
hadoop fs -cp -t 10 -q 2048 /user/hadoop/file1 /user/hadoop/file2 /user/hadoop/dir
df 命令查看空闲的空间。
hadoop fs -df [-h] URI [URI ...]
-h
选项将大小格式化为易于理解的格式。
例子:
hadoop dfs -df /user/hadoop/dir1
du 查看目录的空间占用或文件的大小。
hadoop fs -du [-s] [-h] [-v] [-x] URI [URI ...]
参数:
例子:
hadoop fs -du /user/hadoop/dir1 /user/hadoop/file1 hdfs://nn.example.com/user/hadoop/dir1
find 命令可根据表达式查找指定的文件,并应用操作。如果不指定路径,则默认从当前目录查找。如果不指定操作,则默认打印。
支持的表达式有:
-name pattern:匹配文件名模式
-iname pattern:匹配文件名模式,不区分大小写
-print:打印
-print0:打印,会添加 ASCII NULL 字符
支持逻辑运算符,如 expression -a expression
和 expression -and expression
。
例子:
hadoop fs -find / -name test -print
get 可以从其他文件系统下载到本地文件系统。
hadoop fs -get [-ignoreCrc] [-crc] [-p] [-f] [-t <thread count>] [-q <thread pool queue size>] <src> ... <localdst>
参数:
例子:
hadoop fs -get /user/hadoop/file localfile
hadoop fs -get hdfs://nn.example.com/user/hadoop/file localfile
hadoop fs -get -t 10 hdfs://nn.example.com/user/hadoop/dir1 localdir
hadoop fs -get -t 10 -q 2048 hdfs://nn.example.com/user/hadoop/dir* localdir
ls 可以查看文件夹中文件的信息。默认按文件名排序。
hadoop fs -ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] <args>
参数:
例子:
hadoop fs -ls /user/hadoop/file1
hadoop fs -ls -e /ecdir
mkdir 用来创建文件夹。
hadoop fs -mkdir [-p] <paths>
使用 -p
参数来创建父文件夹(如果不存在)。
例子:
hadoop fs -mkdir /user/hadoop/dir1 /user/hadoop/dir2
hadoop fs -mkdir hdfs://nn1.example.com/user/hadoop/dir hdfs://nn2.example.com/user/hadoop/dir
mv 用来移动文件或文件夹,或者重命名,不支持跨文件系统移动。
hadoop fs -mv URI [URI ...] <dest>
例子:
hadoop fs -mv /user/hadoop/file1 /user/hadoop/file2
hadoop fs -mv hdfs://nn.example.com/file1 hdfs://nn.example.com/file2 hdfs://nn.example.com/file3 hdfs://nn.example.com/dir1
put 可以将本地文件系统中的文件上传到目标文件系统中。也支持从标准输入读取。
hadoop fs -put [-f] [-p] [-l] [-d] [-t <thread count>] [-q <thread pool queue size>] [ - | <localsrc> ...] <dst>
参数:
例子:
hadoop fs -put localfile /user/hadoop/hadoopfile
hadoop fs -put -f localfile1 localfile2 /user/hadoop/hadoopdir
hadoop fs -put -d localfile hdfs://nn.example.com/hadoop/hadoopfile
hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile Reads the input from stdin.
hadoop fs -put -t 5 localdir hdfs://nn.example.com/hadoop/hadoopdir
hadoop fs -put -t 10 -q 2048 localdir1 localdir2 hdfs://nn.example.com/hadoop/hadoopdir
rm 可以删除文件。如果启用了回收站(默认不启用),则会将文件移动到回收站。
hadoop fs -rm [-f] [-r |-R] [-skipTrash] [-safely] URI [URI ...]
参数:
例子:
hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir
rmdir 可以删除文件夹。
hadoop fs -rmdir [--ignore-fail-on-non-empty] URI [URI ...]
--ignore-fail-on-non-empty
选项指定使用通配符时,当文件夹中有文件时不报错。
例子:
hadoop fs -rmdir /user/hadoop/emptydir
stat 可以按指定格式输出文件或文件夹的统计信息。
hadoop fs -stat [format] <path> ...
支持如下格式:
例子:
hadoop fs -stat "type:%F perm:%a %u:%g size:%b mtime:%y atime:%x name:%n" /file
touch 可以修改文件的访问时间和修改时间,当文件不存在时,则创建一个空文件。
hadoop fs -touch [-a] [-m] [-t TIMESTAMP] [-c] URI [URI ...]
参数:
例子:
hadoop fs -touch pathname
hadoop fs -touch -m -t 20180809:230000 pathname
hadoop fs -touch -t 20180809:230000 pathname
hadoop fs -touch -a pathname
Hadoop 也支持对象存储协议等其他文件系统,如 AWS S3,Azure ABFS 等,使用对应的协议。
# 创建文件夹
hadoop fs -mkdir s3a://bucket/datasets/
# 从本地上传文件
hadoop fs -put /datasets/example.orc s3a://bucket/datasets/
# 更新文件时间
hadoop fs -touch wasb://yourcontainer@youraccount.blob.core.windows.net/touched
# 下载文件
hadoop fs -get wasb://yourcontainer@youraccount.blob.core.windows.net/hello.txt /examples
注意:使用 S3 等远程文件系统时,如果大量文件复制、移动或者查找的话会非常慢,对应的命令需谨慎。