HDFS 常用命令

阅读 645
收藏
2018-01-22
原文链接:blog.sanyuehua.net

引言

当在网页运行 hadoopm:50070 可以出现网页时即可对 HDFS 操作Linux 系统 : Ubuntu 14.04

HDFS 的 shell 操作基本命令图解

hadoop fs <选项> 建议使用
hdfs dfs <选项>
hadoop dfs <选项> 不推荐使用

选项名称 使用格式 含义 Example
-ls -ls <路径> 查看指定路径的当前目录结构 hadoop fs -ls /input
-lsr -lsr <路径> 递归查看指定路径的目录结构 hadoop fs -lsr /
-du -du <路径> 统计目录下文件的大小 hadoop fs -du /input
-dus -dus <路径> 汇总统计目录下文件和文件夹的大小 hadoop fs -du /
-mv -mv <源路径> <目的路径> 移动或重命名 hadoop fs -mv /input /tmp
-count -count [-q] <路径> 查询文件夹的磁盘空间限额和文件数目限额 hadoop fs -count -p /tmp
-cp -cp <源路径> <目的路径> 复制文件(夹)到指定目录 hadoop fs -cp /one /two
-put -put <多个 Linux 上的文件> 上传文件到 HDFS 中 hadoop fs -put ~/Downloads/abc.txt /two/one/
-copyFromLocal -copyFromLocal <多个或单个 linux 上的文件> 从本地复制文件到 HDFS hadoop fs -copyFromLocal ~/Downloads/1.txt /two
-moveFromLocal -moveFromLocal <多个或单个 linux 上的文件> 从本地移动 hadoop fs -copyFromLocal ~/Downloads/2.txt /two
-rm -rm [-skipTrash] <路径> 删除文件或空白文件夹, 加上 -skipTrash 删除不会放到回收站 hadoop -fs -rm -skipTrash /two/one/abc.txt
-rmr -rmr [-skipTrash] <路径> 递归删除, 加上 -skipTrash 删除不会放到回收站 hadoop -fs -rmr -skipTrash /two/one
-getmerge -getmerge <源路径> [addnl] 合并文件到本地, [addnl] 参数实在每一个文件末尾添加一个换行符 hadoop fs -getmerge /two/*.txt ~/Down addnl
-cat -cat 查看文件内容 hadoop fs -cat /input/abc.txt
-text -text 查看文件或者 zip 的内容 hadoop fs -text /input/abc.txt
-copyToLocal -copyToLocal [-ignoreCrc] [-crc] [hdfs 源路径] [linux 目的路径] 从 hdfs 向本地复制 hadoop fs -copyToLocal /input/* ~/Downloads
-moveToLocal -moveToLocal [-crc] 从 hdfs 向本地移动 hdfs dfs -moveToLocal /input/* ~/Downloads
-mkdir -mkdir 创建空白文件夹 hadoop fs -mkdir /666
-setrep -setrp [-R] [-w] <副本数> <路径> 修改文件的副本系数。-R选项用于递归改变目录下所有文件的副本系数 hadoop fs -setrep -R -w 3 /user/hadoop/dir
-touchz -touchz <文件路径> 创建空白文件 hadoop fs -touchz /666/999.log
-stat -stat [format] <路径> 显示文件统计信息 hadoop fs -stat path
-tail -tail [-f] <文件> 查看文件尾部信息 hadoop fs -tail pathname
-chmod -chmod [-R] <权限模式> [路径] 修改权限 hadoop fs -chmod -R 777 /input
-chown -chown [-R] [属主][:[属组]] 路径 修改属主 hadoop fs -chown -R hadoop0 /input
-chgrp -chgrp [-R] 属组名称 路径 修改属组 hadoop fs -chgrp -R root /flume
-help -help [命令选项] 查看帮助 hadoop fs -help

详情使用请看官方文档Hadoop Shell命令

-mkdir 新建一个文件夹

su # 切换超级用户
cd /usr/local/hadoop/bin
hdfs dfs -mkdir /demo
# 这里的文件名必须要以 '/' 开头 , hdfs是以绝对路径为基础,因为没有 'cd' 这样的命令支持
hdfs dfs -mkdir -p /dir0/dir1/dir2 # 创建多层文件夹 使用 -p 可以创建不存在的父路径
hadoop fs -mkdir /demo1 #使用这个也可以创建一个文件夹

可以通过 hdfs dfs (hadoop fs) 查看可用的命令

-put 将本地文件上传 和 上传到 HDFS

  • 本地上传

    hadoop fs -put /home/python2/one.txt /
    # -put 文件(本地系统的文件) 目录(一定要加上 / )
  • 上传到 HDFS

    hdfs dfs -put `echo $HADOOP_HOME`/etc/hadoop/*.xml /input
    # 将指定目录下的所有以 xml 结尾的文件上传到 input 目录下面
    hdfs dfs -put /home/python2/one.txt /two.txt
    # 将指定目录下的 one.txt 结尾的文件上传到 / 目录下面. 并重命名为 two.txt
  • 通过键盘输入的值上传到 HDFS

    hdfs dfs -put - two.txt 
    # 按 Ctrl + D 结束输入 , 并且 two.txt 不能存 , 否则命令会报错不会执行

-ls 查看文件

  • 列出 HDFS 上的文件
    hdfs dfs -ls / # 推荐
    hadoop fs -ls /
    hadoop dfs -ls / # 使用这个命令也可以列出来,但是不建议使用

Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
汉 : 不建议使用此脚本来执行 hdfs 命令。而是使用 hdfs 来执行 hdfs 命令。

  • 列出指定目录下的所有文件
    hdfs dfs -ls -R /

首字母表示文件夹(是“d”)、还是文件(是“-”);
后面的 9 位字符表示权限;
后面的数字或者“-”表示副本数。如果是文件,使用数字表示副本数;文件夹没有副
本;
后面的“root”表示属主;
后面的“supergroup”表示属组;
后面的“0”、“11”表示文件大小,单位是字节;
后面的时间表示修改时间,格式是年月日时分;
最后一项表示文件路径。
可见根目录下面有三个文件夹、三个文件。

-du 显示文件大小

hdfs dfs -du /input #列出指定目录下面每个文件大小
hdfs dfs -du -s /input #列出指定目录或文件的占用的总大小

-count 列出文件夹数量、文件数量、内容大小

hdfs dfs -count -q /

-cat 在终端显示文件内容

hdfs dfs -cat /two.txt
hdfs dfs -cat /input/* # 查看指定目录下面所有的文件的内容

-text

在终端显示文件内容,将源文件输出为文本格式。允许的格式是zip和TextRecordInputStream

hdfs dfs -text /input/yarn-site.xml
./hdfs dfs -text /demodemo.zip (有可能会输入一堆乱码)

-get 将 HDFS 中的文件复制到本地系统中

hdfs dfs -get two.txt  .  (复制到本地当前目录下)
hdfs dfs -get two2.txt /home/python2 (将 two2.txt 文件复制到本地 /home/python2 目录下)
# 可以忽略crc校验

-getmerge

将源目录中的所有文件排序合并到一个文件中,接受一个源目录和一个目标文件作为输入,并且将源目录中所有的文件连接成本地目标文件。

hdfs dfs -getmerge /input/* /input2/data.txt
# 将 HDFS 下的 /input 目录里面的所有文件合并后 复制到本地系统的 /input2/data.txt 文件里面

-mv 移动文件

hdfs dfs -mv /two.txt /twoo.txt
# 文件必须是 hdfs / 下的文件
# 如果 目标文件 存在,就相当于给 移动文件 重命名
hdfs dfs -mv (hdfs file or dir...) < hdfs dir >
源路径有多个时,目标路径必须为目录,且必须存在。

-cp 复制文件

hdfs dfs -cp /test /test1
# 将文件从源路径复制到目标路径。
这个命令允许有多个源路径,但目标路径必须是一个目录

-rm 删除文件或文件夹

hdfs dfs -rm -r /demo  #删除文件夹 (递归删除)
hdfs dfs -rm -r /twoo.txt #删除文件

-copyFromLocal

hdfs dfs -copyFromLocal /home/python2/jdk/jdk-8u144-linux-x64.tar.gz /demo1
# 将本地任意文件复制到 HDFS 的 demo1 目录下

-moveFromLocal

hdfs dfs -moveFromLocal /home/python2/jdk2/move.txt /demo1
# 将本地任意文件剪切到 HDFS 的 demo1 目录下

-copyToLocal

hdfs dfs -copyToLocal /input/* /input2
# 将 HDFS 下的 /input 目录下的所有文件复制到 本地 /input2(这个目录必须存在) 目录下

-moveToLocal

hdfs dfs -moveToLocal /input/* /input2
# 将 HDFS 下的 /input 目录下的所有文件复制到 本地 /input2(这个目录必须存在) 目录下
# 这里博主并没有实现

-touchz 创建一个空文件

hdfs dfs -touchz /abc # 在 HDFS 的 / 目录下创建一个字节为 0 的 abc 文件
hdfs dfs -touchz abc # 在 HDFS 的 /user/当前登录的用户/ 目录下创建一个字节为 0 的 abc 文件

-grep 指定查询的内容

hdfs dfs -cat /input/* | grep a
# 显示 HDFS 的 /input 目录下所有包含 a 的文件内容
hdfs dfs -ls / | grep d
# 列出 HDFS 的 / 目录下所有包含 b 的文件

其他命令

  • getfacl

    hdfs dfs -getfacl [-R] <path>  
    # 显示权限信息.
  • getfattr

    hdfs dfs -getfattr [-R] -n name | -d [-e en] <path>
    # 显示文件或目录的扩展属性名称和值(必须有这个文件目录)。
  • expunge

    hdfs dfs -eexpunge
    # 清空 HDFS 回收站
  • chgrp

    改变文件所属的组,使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户。

    hdfs dfs -chgrp [-R] group URI
    hdfs dfs -chgrp -R hadoop /flume
  • chmod

    改变文件的权限,使用 -R 将使改变在目录结构下递归进行。命令的使用者必须是文件的所有者或者超级用户

    hdfs dfs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI …]
    hdfs dfs -chmod -R 777 /input
  • chown

    改变文件的拥有者,使用 -R 使改变在目录结构下递归进行。命令的使用者必须是超级用户。

    hdfs dfs -chown [-R] [OWNER]   [ :[GROUP]]  URI 
    hdfs dfs -chown -R python2 /input2
  • test

    测试检查目录或者文件是否存在

    hadoop fs -test -[ezd] URI
    hdfs dfs -test -[ezd] Path
    选项解释 :
    -e 检查文件是否存在。如果存在则返回0。
    -z 检查文件是否是0字节。如果是则返回0。
    -d 如果路径是个目录,则返回1,否则返回0。
  • setrep

    可以改变一个文件的副本系数

    使用方法:hadoop fs -setrep [-R] <path>
    参数说明:-R 选项用于递归改变目录下所有文件的副本系数
    hadoop fs -setrep 5 -R /input3
    成功返回0,失败返回-1
  • tail

    将文件尾部 1K 字节的内容输出到 stdout。支持 -f 选项,行为和 Unix 中一致。在标准输出中显示文件末尾的1KB数据

    hadoop fs -tail [-f] URI
    hadoop fs -tail /input
  • stat

    stat命令用于返回指定路径的统计信息

    使用方法:hadoop fs -stat URI [URI......]
    hadoop fs -stat path
    成功返回0,失败返回-1

        

    balancer 启用均衡

    hdfs balancer
    # 如果发现某些 DataNode 保存数据过多,某些 DataNode 保存数据相对较少,可以使用上述命令手动启动内部的均衡过程

dfsadmin 管理 HDFS

hdfs dfsadmin -help  #查看如何管理HDFS
hdfs dfsadmin -report # 显示文件系统的基本数据
hdfs dfsadmin -safemode [enter | leave | get | wait ]
选项解释 :
enter:进入安全模式
leave:离开安全模式
get:获知是否开启安全模式
wait:等待离开安全模式

archive 压缩命令

命令中参数name:压缩文件名,自己任意取;
< hdfs parent dir > :压缩文件所在的父目录;
< src >:要压缩的文件名;
< hdfs dst >:压缩文件存放路径

*示例:hadoop archive -archiveName hadoop.har -p /user 1.txt 2.txt /des
示例中将hdfs中/user目录下的文件1.txt,2.txt压缩成一个名叫hadoop.har的文件存放在hdfs中/des目录下,如果1.txt,2.txt不写就是将/user目录下所有的目录和文件压缩成一个名叫hadoop.har的文件存放在hdfs中/des目录下

hadoop fs -ls /des/hadoop.jar  # 显示 har 的内容
hadoop fs -ls -R har:///des/hadoop.har # 显示 har 压缩的是哪些文件
  • 特别注意

    har文件不能进行二次压缩。如果想给.har加文件,只能找到原来的文件,重新创建一个。har文件中原来文件的数据并没有变化,har文件真正的作用是减少NameNode和DataNode过多的空间浪费。

distcp 在两个 HDFS 拷贝命令

这个命令博主未测试

扩展 简化 hadoop 命令

如果需要简化 hadoop 命令,在用户根目录下  vi .bashrc

在最后添加:
alias fs='hadoop fs'
alias fsa='hadoop dfsadmin'
执行 source .bashrc 即可立即生效

比如如下命令, 也可以
fs -ls
fs -mkdir input
fsa -safemode leave

参考博客 :
HDFS设计文档
最新Hadoop Shell完全讲解
hdfs dfsadmin 管理命令
Hadoop学习笔记-Hadoop HDFS环境搭建
HDFS基本命令
HDFS 常用文件操作命令

-------------本文结束 感谢您的阅读-------------
评论