【Hadoop】HDFS的常见shell操作
Hadoop Distributed File System,简称 HDFS,是一个分布式文件系统。我们可以在命令行中对hdfs进行操作,形式上类似于linux文件系统的操作,但本质上相去甚远。其命令格式为:
bin/hdfs dfs -<命令参数> hdfs://authority/path
1. 帮助文档
查看总的帮助文档的命令为:hdfs dfs
。在帮助文档中可以看到很多熟悉的命令,如ls
、cat
、mkdir
等。
[root@bigData01 hadoop-3.2.0]# hdfs dfs
Usage: hadoop fs [generic options]
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>]
[-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...]
[-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] [-v] [-x] <path> ...]
[-expunge]
[-find <path> ... <expression> ...]
[-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getfattr [-R] {-n name | -d} [-e en] <path>]
[-getmerge [-nl] [-skip-empty-file] <src> <localdst>]
[-head <file>]
[-help [cmd ...]]
[-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setfattr {-n name [-v value] | -x name} <path>]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...]
[-touchz <path> ...]
[-truncate [-w] <length> <path> ...]
[-usage [cmd ...]]
······
2. 查询指定路径信息
查询指定路径信息的参数格式为:
hdfs dfs -ls hdfs://authority/path/
,也可以写为hdfs dfs -ls /
。
这一串url之所以可以省略,是因为hdfs在执行的时候会根据HDOOP_HOME自动识别配置文件中的fs.defaultFS属性补全。
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls hdfs://bigData01:9000/
Found 1 items
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /
Found 1 items
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
递归显示所有目录信息使用参数-R
:
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /
Found 4 items
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:54 /a
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls -R /
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:54 /a
drwxr-xr-x - root supergroup 0 2023-01-18 10:54 /a/c
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
3. 从本地上传文件
从本地上传文件到hdfs的参数格式为:
hdfs dfs -put hdfs://authority/path/
,也可以写为hdfs dfs -put /
。
[root@bigData01 hadoop-3.2.0]# hdfs dfs -put LICENSE.txt /
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /
Found 2 items
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
4. 浏览本地文件
浏览本地文件的参数格式为:
hdfs dfs -cat <文件地址>
[root@bigData01 hadoop-3.2.0]# hdfs dfs -cat /README.txt
For the latest information about Hadoop, please visit our website at:
http://hadoop.apache.org/
and our wiki, at:
http://wiki.apache.org/hadoop/
This distribution includes cryptographic software. The country in
which you currently reside may have restrictions on the import,
······
5. 下载文件到本地
下载文件到本地的参数格式为:
hdfs dfs -get <文件名> <地址>
其中参数中的地址项若给定的是一个文件夹地址,那么就会将文件下载到该文件夹内,并保持原名,若给定的是一个具体的文件地址,那么就会将该文件下载到该地址并改名。
[root@bigData01 hadoop-3.2.0]# hdfs dfs -get /README.txt ~
[root@bigData01 hadoop-3.2.0]# ll ~
total 28
-rw-------. 1 root root 2606 Mar 26 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 Jan 17 10:40 a.txt
-rw-r--r--. 1 root root 90 Jan 15 14:59 hello.txt
-rwxr-xr-x. 1 root root 13846 Apr 20 2021 pd
-rw-r--r--. 1 root root 1361 Jan 18 10:20 README.txt
[root@bigData01 hadoop-3.2.0]# hdfs dfs -get /README.txt ~/readme.txt
[root@bigData01 hadoop-3.2.0]# ll ~
total 32
-rw-------. 1 root root 2606 Mar 26 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 Jan 17 10:40 a.txt
-rw-r--r--. 1 root root 90 Jan 15 14:59 hello.txt
-rwxr-xr-x. 1 root root 13846 Apr 20 2021 pd
-rw-r--r--. 1 root root 1361 Jan 18 10:26 readme.txt
-rw-r--r--. 1 root root 1361 Jan 18 10:20 README.txt
6. 创建文件夹
创建文件夹使用mkdir
命令,参数格式为:
hdfs dfs -mkdir <地址>
[root@bigData01 hadoop-3.2.0]# hdfs dfs -mkdir /test
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /
Found 3 items
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
递归创建多级目录使用参数-p
:
[root@bigData01 hadoop-3.2.0]# hdfs dfs -mkdir /a/c
mkdir: `hdfs://bigData01:9000/a': No such file or directory
[root@bigData01 hadoop-3.2.0]# hdfs dfs -mkdir -p /a/c
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /
Found 4 items
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
-rw-r--r-- 1 root supergroup 1361 2023-01-17 18:34 /README.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:54 /a
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
7. 删除文件/文件夹
删除操作使用rm
参数,参数格式为:
hdfs dfs -rm <文件名>
若要删除文件夹,需要使用-r
参数,会将目录进行递归删除。
[root@bigData01 hadoop-3.2.0]# hdfs dfs -rm /README.txt
Deleted /README.txt
[root@bigData01 hadoop-3.2.0]# hdfs dfs -rm /a
rm: `/a': Is a directory
[root@bigData01 hadoop-3.2.0]# hdfs dfs -rm -r /a
Deleted /a
8. 综合应用
统计根目录下文件数量,并显示文件大小。
8.1 统计文件数量
使用管道命令将hdfs dfs -ls /
命令的执行结果发给grep
命令筛选出文件(实际上就是减去第一行的Found 2 items
),再将过滤结果使用wc -l
命令统计行数。
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /
Found 2 items
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /|grep /|wc -l
2
8.2 显示各文件大小
hdfs dfs -ls /|grep /
输出的数据第5列为文件大小,第8列为文件名,因此使用awk
命令将这两列输出即可。
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /|grep /
-rw-r--r-- 1 root supergroup 150569 2023-01-17 18:48 /LICENSE.txt
drwxr-xr-x - root supergroup 0 2023-01-18 10:52 /test
[root@bigData01 hadoop-3.2.0]# hdfs dfs -ls /|grep /|awk '{print $8,$5}'
/LICENSE.txt 150569
/test 0