概述
本文列举了常用的hadoop fs shell,以及涉及到的几个基本概念。
目的在于熟悉hadoop fs 命令,借鉴linux对应的命令,以及理解hadoop的几个基本概念。
基本的命令格式
bin/hadoop fs <args>
args就是具体的命令,比如ls,cat等。
文件系统schema
命令中支持三种schema:
- file:/// 操作主机的文件系统
- hdfs:/// 操作hdfs的文件系统
- / 未指定具体的文件系统,采用默认的hdfs
默认的hdfs地址,配置在hadoop/etc/hadoop/core-site.xml中.
注意,这里是三个斜线:hdfs:///。URI的格式为hdfs://hostname/path,这里省略了hostname,采用默认nodename地址。
HDFS权限
HDFS实现了一个类似于POSIX的权限模型。
文件或路径对于所有者,组,其他用户三个独立的权限管理。
r | w | x | |
---|---|---|---|
文件 | 读权限 | 写或者追加 | |
路径 | list路径下的文件列表 | 创建或删除文件或路径 | 访问目录下的子文件或目录 |
HDFS通过访问者名称匹配来查找权限,过程如下:
1 如果用户名和所有者名字相同,则验证所有者的权限。
2 如果用户名和组里的某个名字相同,则验证组的权限。
3 否则使用其他人的权限
通配符
通配符经常用于搜索文件的参数中。
通配符和正则表达式类似,但是也有很大的区别。
通配符 | 含义 | 实例 |
---|---|---|
* | 匹配 0 或多个字符 | a*b,a与b之间可以有任意长度的任意字符, 也可以一个也没有 |
? | 匹配任意单个字符 | a?b,a与b之间有且只有一个字符, 可以是任意字符 |
[list] | 匹配 list 中的任意单个字符 | a[xyz]b,a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z |
[!list] | 匹配除 list 中的任意单一字符 | a[!0-9]b,a与b之间必须也只能有一个字符, 但不能是阿拉伯数字 |
[c1-c2] | 匹配 c1-c2 中的任意单一字符 | a[0-9]b,匹配0与9之间其中一个字符 |
{s1,s2,…} | 匹配 s1 或 s2 (或更多)中的一个字符串 | a{abc,xyz,123}b,a与b之间只能是abc或xyz或123这三个字符串之一 |
命令
appendToFile
将本地文件内容追加到hdfs文件尾:
hadoop fs -appendToFile /home/yunzhong/.bashrc hdfs:///user/hadoop/testfile
本地文件可以是多个。
也可以及时输入字符:
hadoop fs -appendToFile - hdfs:///user/hadoop/testfile
cat
将文件打印到标准输出
hadoop fs -cat hdfs:///user/hadoop/testfile
hadoop fs -cat file:///home/yunzhong/testfile
checksum
每当hadoop创建文件file时,hadoop就会同时在同一个文件夹下创建隐藏文件.file.crc,这个文件记录了文件file的校验和.
hadoop fs -checksum hdfs:///user/hadoop/testfile
chgrp
chmod
更改文件的访问权限。
参数-R是否影响所有子目录
hadoop fs -chmod -R 777 /user/hadoop/testdir
hadoop fs -chmod 777 /user/hadoop/testfile
chown
更改文件的所有者。
支持-R参数
hadoop fs -chown username[:group] /user/hadoop/testfile
copyFromLocal
将本地的文件放到hdfs中
和-put功能类似,但是copyFromLocal的文件必须来自本地文件系统。
#上传文件到hdfs:///user/hadoop/目录下。目录必须存在。
hadoop fs -copyFromLocal file:///home/yunzhong/localfile /user/hadoop/
#更改上传文件的名字
hadoop fs -copyFromLocal file:///home/yunzhong/localfile /user/hadoop/localfilenewname
# -f 强制覆盖已有文件
hadoop fs -copyFromLocal -f file:///home/yunzhong/localfile /user/hadoop/
copyToLocal
和 -get类似。目标为本地文件系统。
hadoop fs -copyToLocal hdfs:///user/hadoop/testfile /home/yunzhong/
count
统计目录下文件信息,输出列:
子目录数量 | 文件数量 | 目录大小 | 路径 |
---|---|---|---|
DIR_COUNT | FILE_COUNT | CONTENT_SIZE | PATHNAME |
参数:
- -u参数:输出信息携带quota和usage。输出列:
QUOTA, REMAINING_QUOTA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, PATHNAME - -q参数:输出信息携带quota信息。输出列:
QUOTA, REMAINING_QUOTA, SPACE_QUOTA, REMAINING_SPACE_QUOTA, DIR_COUNT, FILE_COUNT, CONTENT_SIZE, PATHNAME - -h参数:数据可读
- -v参数:输出信息带表头。
hadoop fs -count -q -h -v /user/hadoop/
cp
cp可以一次拷贝多个文件,但是此时的目标必须为路径。
支持正则“*”.
hadoop fs -cp /user/hadoop/testfile* /user/hadoop/temp/
参数:
- -f 覆盖已有的文件
- -p 保留原属性。保留的属性可以配置[topx] ,对应(timestamps, ownership, permission, ACL, XAttr)
#覆盖已有文件。otherfile的所有者不会变
hadoop fs -cp -f -po /user/hadoop/otherfile /user/hadoop/tempdir/
df
显示空闲空间
参数:-h。结果数据可读。
hadoop fs -df -h /user/hadoop/temp/
du
显示一个文件夹下所有的文件或文件夹的大小。也可以显示单独一个文件的大小。
参数:-s统计当前文件夹的所有信息。
-h human readable
-x 不包含snapshot的统计
注意:3.2.1的hadoop还包含-v参数,显示结果的title。而且3版本的结果包含三列:size disk_space_consumed_with_all_replicas full_path_name,而2版本只包含size,full_path_name。
hadoop fs -du -s -h -x hdfs:///user/hadoop/
expunge
如果trash配置成true,那么通过fs shell删除的文件不会立即从HDFS删除。HDFS把文件移动到trash路径下(每个用户都有自己的路径/user//.Trash)。文件可以从trash中恢复。
在配置的时间间隔之后,HDFS将会对trash的文件做一个checkpoint,并且删除过期的checkpoint。
当trash中的文件过期,NameNode将会真正删除这些文件。
expunge命令创建一个新的checkpoint,且删除过期的checkpoint。
参数-immediate,将立即删除所有的trash文件。
find
参数-name:支持通配符。-iname:支持通配符,不区分大小写
hadoop fs -find /user/hadoop/ -name "testfil*"
hadoop fs -find /user/hadoop/ -name "TestFil*"
get
将文件拷贝到本地。
参数:
-p 保留文件的创建修改时间、所有者、权限信息。如果所有者/群不存在,则抛出异常。
-f 覆盖已存在文件
hadoop fs -get -f /user/hadoop/testfile
getfacl
显示文件或目录的access control lists(ACL)
参数:-R 递归显示所有文件
hadoop fs -getfacl -R /user/hadoop/temp
getmerge
合并多个文件内容,到一个本地文件。
参数:-nl 在每个源文件内容的最后添加一个换行。
hadoop fs -getmerge -nl /user/hadoop/temp /user/hadoop/testfile /home/yunzhong/mergefile
head
2版本还不支持此命令。
ls lsr
ls输出列:
- 文件:permissions number_of_replicas userid groupid filesize modification_date modification_time filename
- 目录:permissions userid groupid modification_date modification_time dirname
lsr等同于:hadoop fs -ls -R
mkdir
创建路径。参数可以为多个路径。
参数:-p 递归创建不存在的parent路径。
hadoop fs -mkdir -p /user/hadoop/temp/temp1/temp2 /user/hadoop/temp1
moveFromLocal
类似于-put命令,但是本地文件被删除。
hadoop fs -moveFromLocal /home/yunzhong/localfile /user/hadoop/temp/
mv
迁移文件。支持多个源文件。不可以跨文件系统。
put
将一个或多个文件拷贝到目标文件系统。可以从标准输入数据写入目标文件。
参数:-p 保留源文件的时间,访问权限,所有者等信息。
-f 覆盖已有文件
#本地到hdfs
hadoop fs -put file:///home/yunzhong/testfile hdfs:///user/hadoop/
#标准输入到hdfs文件
hadoop fs -put - hdfs:///user/hadoop/fromStdin
rm
删除文件。
如果用户开启了trash功能,则文件移入trash。
参数:
-f 不会有提示信息
-R 递归删除文件夹
-skipTrash 直接删除,不走trash
setfacl
设置acl
stat
格式化输出文件,目录的统计信息。
Format accepts permissions in octal (%a) and symbolic (%A), filesize in bytes (%b), type (%F), group name of owner (%g), name (%n), block size (%o), replication (%r), user name of owner(%u), access date(%x, %X), and modification date (%y, %Y). %x and %y show UTC date as “yyyy-MM-dd HH:mm:ss”, and %X and %Y show milliseconds since January 1, 1970 UTC. If the format is not specified, %y is used by default.
hadoop fs -stat "type:%F %u:%g size:%b name:%n" /user/hadoop/testfile
tail
显示文件的最后几行数据。
参数:-f 和linux中的含义一样,持续输出追加信息。
hadoop fs -tail /user/hadoop/testfile
test
测试文件或路径信息。
- -d: f the path is a directory, return 0.
- -e: if the path exists, return 0.
- -f: if the path is a file, return 0.
- -s: if the path is not empty, return 0.
- -w: if the path exists and write permission is granted, return 0.
- -r: if the path exists and read permission is granted, return 0.
- -z: if the file is zero length, return 0.
touch,touchz
更新文件的读取和修改时间戳。如果文件不存在,则创建。
参数:
-a 仅仅更新访问时间
-m仅仅更新修改时间
-t 指定时间。时间格式(yyyyMMddHHmmss)
-c如果文件不存在,则创建。
2版本还未支持。
2版本支持touchz,创建一个空文件
truncate
截断文件,保留指定长度的内容。
参数:-w等待完全结束再退出。如果没有-w命令,truncate返回后,内部操作还没有结束,文件不能被打开或者追加信息。
hadoop fs -truncate -w 10 /user/hadoop/testfile