
HDFS常用的四十个命令及HDFS的文件读写流程前言Hadoop 提供了命令行接口对HDFS中的文件进行管理操作如读取文件、新建目录、移动文件、复制文件、删除目录、上传文件、下载文件、列出目录等HDFS命令行的格式如下所示Hadoop fs-cmdargs其中cmd是要执行的具体命令是要执行命令的参数但不限于一个参数。要查看命令行接口的帮助信息只需在命令行中输入如下命令hadoop fs具体信息如下所示[rootnode1~]# hadoop fsUsage:hadoop fs[generic options][-appendToFilelocalsrc...dst][-cat[-ignoreCrc]src...][-checksum[-v]src...][-chgrp[-R]GROUPPATH...][-chmod[-R]MODE[,MODE]...|OCTALMODEPATH...][-chown[-R][OWNER][:[GROUP]]PATH...][-copyFromLocal[-f][-p][-l][-d][-tthread 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][-createSnapshotsnapshotDir[snapshotName]][-deleteSnapshotsnapshotDirsnapshotName][-df[-h][path...]][-du[-s][-h][-v][-x]path...][-expunge[-immediate][-fspath]][-findpath...expression...][-get[-f][-p][-ignoreCrc][-crc]src...localdst][-getfacl[-R]path][-getfattr[-R]{-n name|-d}[-e en]path][-getmerge[-nl][-skip-empty-file]srclocaldst][-headfile][-help[cmd...]][-ls[-C][-d][-h][-q][-R][-t][-S][-r][-u][-e][path...]][-mkdir[-p]path...][-moveFromLocallocalsrc...dst][-moveToLocalsrclocaldst][-mvsrc...dst][-put[-f][-p][-l][-d]localsrc...dst][-renameSnapshotsnapshotDiroldNamenewName][-rm[-f][-r|-R][-skipTrash][-safely]src...][-rmdir[--ignore-fail-on-non-empty]dir...][-setfacl[-R][{-b|-k}{-m|-xacl_spec}path]|[--setacl_specpath]][-setfattr{-n name[-v value]|-x name}path][-setrep[-R][-w]reppath...][-stat[format]path...][-tail[-f][-ssleep interval]file][-test-[defswrz]path][-text[-ignoreCrc]src...][-touch[-a][-m][-tTIMESTAMP][-c]path...][-touchzpath...][-truncate[-w]lengthpath...][-usage[cmd...]]Generic options supported are:-confconfiguration filespecify an application configuration file-Dpropertyvaluedefine a valuefora given property-fsfile:///|hdfs://namenode:port specify default filesystem URL to use, overrides fs.defaultFS property from configurations.-jtlocal|resourcemanager:portspecify a ResourceManager-filesfile1,...specify a comma-separated listoffiles to be copied to the map reduce cluster-libjarsjar1,...specify a comma-separated listofjar files to be includedinthe classpath-archivesarchive1,...specify a comma-separated listofarchives to be unarchived on the compute machines The general command line syntax is:command[genericOptions][commandOptions]1、文件准备在服务器本地创建data.txt 文件用于测试文件内容如下所示hello hadoop2、-appendToFile将服务器本地的文件追加到HDFS指定的文件中如果多次运行相同的参数则会在HDFS的文件中追加多行相同的内容。实例代码如下所示hadoop fs-appendToFile/data.txt/zctest/data.txt3、cat主要用来查看HDFS中的非压缩文件的内容。实例代码[rootnode1/]# hadoop fs-cat/zctest/data.txt hello hadoop4、checksum查看HDFS中文件的校验和。实例代码[rootnode1/]# hadoop fs-checksum/zctest/data.txt/zctest/data.txtMD5-of-0MD5-of-512CRC32C0000020000000000000000001c2aa3eb42436ea1c9af770e38374ea35、-chgrp改变HDFS中文件或目录的所属组-R选项可以改变目录下所有子目录的所属组执行此命令的用户必须是文件或目录的所有者或超级用户。实例代码hadoop fs-chgrp hadoop/zctest/data.txt6、chmod修改HDFS中文件或 目录的访问权限-R选项可以修改目录下所有子目录的访问权限执行此命令的用户必须是文件或目录的所有者或超级用户。实例代码hadoop-fs chmod700/zctest/data.txt此时data.txt文件当前的访问权限已经被修改为-rwx------7、chown修改文件或目录的所有者-R选项可以修改目录下所有子目录的所有者此命令的用户必须是超级用户。实例代码hadoop fs-chown alice:alice/zctest/data.txt8、-copyFromLocal将本地服务器上的文件复制到HDFS中。实例代码hadoop fs-copyFromLocal a.txt/data.txt9、-copyToLocal将本HDFS上的文件复制到本地服务器中。实例代码hadoop fs-copyToLocal/zctest/data.txt/10、-count显示目录下的子目录数、文件数、占用字节数、所有文件和目录名-q选项显示目录和空间的配额信息。实例代码11 、-cp复制文件或目录如果源文件或目录有多个则目标必须为目录。实例代码如下所示hadoop fs-cp/data/data.txt/data/data.tmp12、-createSnapshot为HDFS中的文件创建快照实例代码如下首先在HDFS中创建目录/sn并将/sn 目录设置为可快照如下所示[rootnode01zwj]# hadoop fs-mkdir/sn[rootnode01zwj]# hdfs dfsadmin-allowSnapshot/snAllowingsnaphot on/sn succeeded 接下来执行创建快照操作如下所示[rootnode01zwj]# hadoop fs-createSnapshot/sn s1Createdsnapshot/sn/.snapshot/s1 说明创建快照成功。13、-deleteSnapshot删除 HDFS 中的文件快照实例代码如下所示hadoop fs-deleteSnapshot/sn sn1 删除/sn 目录的快照sn114、-df查看 HDFS 中目录空间的使用情况。实例代码如下所示[rootnode01zwj]# hadoop fs-df-h/dataFilesystemSizeUsedAvailableUse%hdfs://node01:8020130.1G13.7G57.8G11%15、-du查看 HDFS 或目录中的文件大小。实例代码如下所示[rootnode01zwj]# hadoop fs-du-h-s-x/data4561.3K/data16、-expunge清空HDFS中的回收站实例代码如下所示[rootnode01zwj]# hadoop fs-expunge20/12/2720:41:48INFOfs.TrashPolicyDefault:TrashPolicyDefault#deleteCheckpointfortrashRoot:hdfs://node01:8020/user/root/.Trash20/12/2720:41:48INFOfs.TrashPolicyDefault:TrashPolicyDefault#deleteCheckpointfortrashRoot:hdfs://node01:8020/user/root/.Trash20/12/2720:41:48INFOfs.TrashPolicyDefault:Deletedtrash checkpoint:/user/root/.Trash/20102806371520/12/2720:41:48INFOfs.TrashPolicyDefault:Deletedtrash checkpoint:/user/root/.Trash/20103118113920/12/2720:41:48INFOfs.TrashPolicyDefault:TrashPolicyDefault#createCheckpointfortrashRoot:hdfs://node01:8020/user/root/.Trash20/12/2720:41:48INFOfs.TrashPolicyDefault:Createdtrash checkpoint:/user/root/.Trash/20122720414817、-find查找 HDFS 中指定目录下的文件。实例代码如下所示[rootnode01zwj]# hadoop fs-find/data/data/data.txt/data/data/a.txt/data/data.txt18、-get将 HDFS 中的文件复制到本地服务器。实例代码如下所示hadoop fs-get/data/data.txt/home/hadoop/input19、-getfacl查看HDFS中指定目录下的文件的访问控制列表-R 选项可以查看所有子目录下的文件访问控制列表。实例代码如下所示[rootnode01zwj]# hadoop fs-getfacl/data # file:/data # owner:root # group:supergroup20、-getfattr查看 HDFS 上的文件扩展属性信息-R 选项可以查看当前目录下所有子目录中的文件扩展属性信息或子目录下文件的扩展属性信息。实例代码如下所示[rootnode01zwj]# hadoop fs-getfattr-R-d/data # file:/data # file:/data/a.txt # file:/data/data.txt # file:/data/input21、-getmerge将 HDFS 中的多个文件合并为一个文件复制到本地服务器。实例代码如下所示hadoop fs-getmerge/data/a.txt/data/b.txt/home/hadoop/input/data.local22、-head以head方式查看 HDFS 中的文件此命令后面的文件只能为文件不能为目录实例代码如下所示[rootnode01zwj]# hadoop fs-head/data/data.txt hello hadoop hello hadoop23、-help查看 Hadoop 具体命令的帮助信息。实例代码如下所示[rootnode01zwj]# hadoop fs-help cat-cat[-ignoreCrc]src...:Fetchall files that match the file patternsrcand display their content on stdout.24、-ls列出 HDFS 中指定目录下的信息实例代码如下所示[rootnode01zwj]# hadoop fs-ls/dataFound3items-rw-r--r--3root supergroup62020-12-2720:11/data/a.txt-rw-r--r--3root supergroup262020-12-2718:59/data/data.txt drwxr-xr-x-root supergroup02020-09-1819:16/data/input25、-mkdir在 HDFS 上创建目录实例代码如下所示hadoop fs-mkdir/test/data26、-moveFromLocal移动本地服务器上的某个文件到 HDFS 中。实例代码如下所示hadoop fs-moveFromLocal/home/hadoop/input/data.local/data/27、-moveToLocal移动 HDFS 中的文件到本地服务器的某个目录下。hadoop fs-moveToLocal/data/data.txt/home/hadoop/input/注意|此命令在Hadoop3.2.0版本中尚未实现28、-mv移动 HDFS 中的目录到 HDFS 中的另一个目录下。实例代码如下所示hadoop fs-mv/data/data.local/test29、-put复制本地文件到 HDFS 中的某个目录下。实例代码如下所示hadoop fs-put/home/hadoop/input/data.local/data30、-renameSnapshot重命名 HDFS 上的文件快照。实例代码如下首先在 HDFS 中创建目录 /sn并将 /sn 目录设置为可快照如下所示[rootnode01zwj]# hadoop fs-mkdir/sn[rootnode01zwj]# hdfs dfsadmin-allowSnapshot/snAllowingsnaphot on/sn succeeded 接下来执行创建快照操作如下所示[rootnode01zwj]# hadoop fs-createSnapshot/sn s1Createdsnapshot/sn/.snapshot/s1 说明创建快照成功。 接下来将/sn 目录的快照名称 sn1 重命名为 sn2如下所示 hadoop fs-renameSnapshot/sn sn1 sn231、-rm删除文件或目录。实例代码如下所示hadoop fs-rm/data/data.local32、-rmkdir删除HDFS上的目录此目录必须是空目录。实例代码如下所示hadoop fs-mkdir/test33、-setrep设置 HDFS 上的文件的目标副本数量-R 选项可以对子目录逐级进行相同的操作 -w 选项等待副本达到设置值。实例代码如下所示hadoop fs-setrep5/data/data.txt34、-stat查看 HDFS 上文件或目录的统计信息以 format 的格式列出。可选的 format 格式如下%b文件所占的块数%g文件所属的用户组%n文件名%o文件块大小%r备份数%u文件所属用户%y文件修改时间 实例代码如下所示[rootnode01zwj]$ hadoop fs-stat%b,%g,%n,%o,%r,%u,%y/data0,hive,data,0,0,hive,2020-11-1607:54:0435、-tail显示一个文件的末尾数据通常是显示文件最后的 1KB 的数据。-f 选项可以监听文件的变化当有内容追加到文件中时-f 选项能够实时显示追加的内容。实例代码如下所示[rootnode01zwj]# hadoop fs-tail/data/data.txt hello hadoop hello hadoop36、-test检测文件的信息参数选项如下-d如果路径为目录则返回0-e如果路径存在则返回0-f如果路径为文件则返回0-s如果路径中的文件大于0字节则返回0-w如果路径存在并且具有写权限则返回0-r如果路径存在并且具有读权限则返回0-z如果路径中的文件为0字节则返回0否则返回1实例代码如下所示 hadoop fs-test-d/data37、-text查看文件内容。text 命令除了能够查看非压缩的文本文件内容之外也能查看压缩后的文本文件内容cat命令只能查看非压缩的文本文件内容。实例代码如下所示[rootnode01zwj]# hadoop fs-text/data/data.txt hello hadoop hello hadoop38、touch在 HDFS 上创建文件如果文件不存在则不报错实例代码如下所示hadoop fs-touch/data/data.touch39、-truncate切断 HDFS 上的文件实例代码如下所示[rootnode01zwj]# hadoop fs-truncate26/data/data.txtTruncate/data/data.txttolength:2640、-usage列出指定命令的使用格式实例代码如下所示[[rootnode01zwj]# hadoop fs-usage catUsage:hadoop fs[generic options]-cat[-ignoreCrc]src...HDFS的文件读写流程HDFS的分布式架构决定了它的读写流程需要Client、NameNode和实际存储节点DataNode三方协同。一、HDFS写文件流程写文件的核心逻辑是客户端切分数据向 NameNode 申请存储位置然后以管道Pipeline的方式流式写入各个 DataNode。详细步骤·1、发起创建请求客户端通过调用 DistributedFileSystem 对象的 create() 方法向 NameNode 发起写文件请求。2、检查与权限校验NameNode 检查文件是否已存在、父目录是否存在以及客户端是否有写权限。校验通过后NameNode 会为文件创建一个新的记录此时还没有关联具体的数据块并返回一个 FSDataOutputStream 输出流对象给客户端。3、请求数据块存储位置客户端将文件切分成一个个的 Block默认 128MB。在传输第一个 Block 前客户端向 NameNode 请求“我要写第一个数据块请告诉我应该存放在哪几个 DataNode 上默认 3 副本”4、返回 DataNode 列表NameNode 根据机架感知策略Rack Awareness选择一组最佳的 DataNode 节点例如DN1, DN2, DN3返回给客户端。5、建立数据传输管道Pipeline客户端的输出流收到节点列表后会与最近的 DN1 建立连接DN1 紧接着与 DN2 建立连接DN2 与 DN3 建立连接。这样就形成了一个数据传输管道。6、流式写入数据Packet客户端将 Block 进一步拆分为更小的 Packet通常为 64KB。客户端将 Packet 放入内部的发送队列Data Queue并流式传给 DN1。DN1 收到 Packet 后写入本地磁盘同时将其传给 DN2DN2 再传给 DN37、ACK 确认机制为了保证传输安全客户端内部还维护了一个确认队列Ack Queue。当 DN3 完成写入后向 DN2 发送确认ACKDN2 传给 DN1DN1 最终传给客户端。客户端收到 ACK 后才会将该 Packet 从 Ack Queue 中移除。8、完成与关闭当一个 Block 的所有 Packet 都写完并确认后管道关闭。客户端继续为下一个 Block 向 NameNode 申请位置重复上述步骤。所有 Block 写完后客户端调用 close() 关闭输出流并通知 NameNode 文件写入完成。二、HDFS读文件流程读文件的核心逻辑是客户端找 NameNode 索取数据块的位置列表然后直接连接离自己最近的 DataNode 进行数据读取。详细步骤1、发起读取请求客户端通过调用 DistributedFileSystem 对象的 open() 方法向 NameNode 请求读取某个文件。2、获取块位置信息NameNode 查询元数据获取该文件对应的 Block 列表。对于每个 BlockNameNode 会返回持有该副本的 DataNode 地址。优化机制NameNode 返回的 DataNode 列表会根据网络拓扑距离进行排序距离客户端最近的 DataNode 会排在前面。3、返回输入流DistributedFileSystem 返回一个 FSDataInputStream 输入流对象给客户端客户端通过该输入流开始读取数据。4、流式读取数据客户端调用 read() 方法输入流寻找当前 Block 距离最近的 DataNode假设是 DN1并建立连接。数据以Packet 为单位从 DataNode 流式传输到客户端。校验机制客户端在读取的同时会验证数据的校验和Checksum。如果发现数据损坏或连接中断客户端会断开与该 DataNode的连接记录异常并转向列表中的下一个 DataNode 读取。5、切换下一个数据块当当前 Block 的数据读取完毕后输入流会关闭与该 DataNode 的连接然后自动寻找下一个 Block 的最佳 DataNode继续读取。6、关闭输入流当文件所有 Block 的数据都读取完毕后客户端调用 close() 方法关闭输入流。