🙋‍♂️🧠🙆‍♂️hadoop3.0命令行指南

1,751 阅读9分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

hadoop的命令行对于管理人员或开发人员而言会经常使用,因此熟悉和掌握这些命令是必需要做的

不清楚命令执行后产生的结果,请不要在生产环境执行,先在开发环境运行,因为故障的代价是无法评估的

HDFS分为用户命令和管理员命令,以及Daemon命令 三个部分

因为hadoop fs和hdfs dfs命令是一样的,但大部分子命令hadoop是没有的,博主大部分时候使用hdfs命令来管理和使用hadoop,当然有一些hdfs子命令没有,就使用hadoop来实现,比如跨集群迁移数据distcp,小文件压缩archive等

🚀🌅😅用户命令

用户命令又可以细分为如下几类

集群信息查看

#显示所有类包的绝对路径
hdfs classpath

#显示hadoop环境变量
hdfs envvars

#获取集群部分组件配置,其他参数基本没有配置
hadoop getconf -namenodes

#查看用户组信息,默认root用户
hdfs groups

#查看集群版本,git仓库及分支
hdfs version

hdfs文件操作

常用命令,对hdfs文件进行增删改查等等

#查看目录下有哪些文件
hadoop fs -ls /data

#分页查看文件内容,直接查看 将|和more 去掉就行
hadoop fs -cat  /wordcount/output/part-r-00000 | more

#强制创建多级目录 
hadoop fs -mkdir  -p  /aaa/bbb/cc/dd

#追加一个文件到已经存在的文件末尾appendToFile
Hadoop fs -appendToFile  ./hello.txt  /hello.txt

#显示一个文件的末尾tail
hadoop fs -tail  /weblog/access_log.1

#linux文件系统中的用法一样,对文件所属权限
-chgrp
-chmod
-chown
示例:
hadoop fs -chmod  666  /hello.txt
hadoop fs -chown  someuser:somegrp   /hello.txt

#从hdfs的一个路径拷贝hdfs的另一个路径cp
hadoop fs -cp  /aaa/jdk.tar.gz  /bbb/jdk.tar.gz.2

#在hdfs目录中移动文件mv
hadoop fs -mv  /aaa/jdk.tar.gz  /

#从hdfs下载文件到本地get
hadoop fs -get  /aaa/jdk.tar.gz .

#上传文件到hdfs
hadoop fs -put  ./jdk.tar.gz  /bbb/jdk.tar.gz.2
#上传目录到hdfs,会将commondb_course文件夹放到ods.db里面
hadoop fs -put commondb_course  /user/hive/warehouse/ods.db/

#删除文件或文件夹rm
hadoop fs -rm -r -f /aaa/bbb/

#统计文件系统的可用空间信息df
hadoop fs -df -h /

#统计文件夹的大小信息du
hadoop fs -du -s -h /aaa/*

#统计一个指定目录下的文件节点数量count
hadoop fs -count -v  /test2

#设置hdfs中文件的副本数量setrep

hadoop fs -setrep 3 /aaa/jdk.tar.gz
<这里设置的副本数只是记录在namenode的元数据中,是否真的会有这么多副本,还得看datanode的数量>

#永久删除过期文件 慎用
hadoop fs -expunge

#合并下载,多个文件内容合并到一个文件
hadoop fs -getmerge /data/log.* ./log.sum
  • hadoop hdfs上传大于设置的限制大小值的文件时,会进行分块上传到hdfs文件系统,对外还是表现为一个文件,但在内部可能存在不同的节点,且可能包含很多个块

  • hadoop hdfs中没有用户和组的严格限定,你可以设置任何用户和组,即使设置的用户和组不存在也可以设置成功

  • 分块保存原理,上传时用Input循环读,当读的值大于设置值(默认128m)时,从新new一个socket和output写到另外一个分块文件,这样同一个文件的不同块就可能存在不同的集群节点,且每个块都有和设置值(默认3份)相同的副本;

  • 设置的副本数的值大于datanode节点时,最多只会保存副本数为datanode的节点数量,多一个文件块不会存多分副本在一台datanode节点上

  • 在namenode web控制台看到的文件副本数是元数据的副本值,真实值由于上面的说明的那个原因,可能存在偏差,可以直接调接口查看: curl -s http://namenode:9870/jmx | grep BlocksTotal

  • namenode的hdfs默认访问端口为9000,集群一般为8020

hdfs文件系统检查

#检查整个文件系统状态
hdfs fsck / 

#显示指定路径块位置
hdfs fsck /user/hue -files -blocks -locations

#显示副本的详细信息
hdfs fsck /user/hue -files -blocks -replicaDetails

#显示块的机架位置
hdfs fsck /user/hue -files -blocks -locations -racks

#显示正在操作的文件
hdfs fsck /user -openforwrite

#显示已损坏的块
hdfs fsck /test2 -list-corruptfileblocks

#删除已损坏的块
hdfs fsck /user/hue -delete

块统计

统计目录的块数据,第二列为块数据

hdfs dfs -count /user/*

#统计系统总块数,和上面的 比较是否一致,不一致应该是快照的原因
hdfs fsck / -blocks

块恢复

#如果块丢失,恢复了数据也找不到
hdfs debug recoverLease  -path /user/hue  -retries 5

数据备份

快照备份

#启用快照功能
hdfs dfsadmin -allowSnapshot /data

#关闭快照功能
hdfs dfsadmin -disallowSnapshot /data

#创建快照
hdfs dfs -createSnapshot /data data-snapshot-${Date}

#删除快照
hdfs dfs -deleteSnapshot /data data-snapshot-${Date}

#重命名快照
hdfs dfs -renameSnapshot /data <oldName> <newName>

#查看所有快照目录
hdfs lsSnapshottableDir

#比较两个快照的差异
hdfs snapshotDiff /data <fromSnapshot> <toSnapshot>

跨集群迁移

#将n1集群的a文件 迁移到n2 foo目录,将启动一个MR任务
hadoop distcp hdfs://nn1:9820/foo/a hdfs://nn2:9820/foo/

#覆盖目的集群中的文件
hadoop distcp -overwrite hdfs://nn1:9820/source/first hdfs://nn1:9820/source/second hdfs://nn2:9820/target

#只更新发生变化的文件
hadoop distcp -update hdfs://nn1:9820/source/first hdfs://nn1:9820/source/second hdfs://nn2:9820/target

#删除目标集群中的存在 但源集群没有的文件
hadoop distcp -update -delete hdfs://nn1:9820/source/first hdfs://nn1:9820/source/second hdfs://nn2:9820/target

编辑日志

文件系统客户端执行写操作(变更文件,变更权限等)时,这些事务首先会记录到edits日志中

如果出现极端情况,可以通过更改 相应的动作(删除改成授权)来避免服务风险

#将edits文件转换成xml文件
hdfs oev -i edits_xxxxxx -o edits_xxxxx.xml

#将xml文件转换成二制进edits文件
hdfs oev -i edits_xxxxx.xml -o edits_xxxxxx -p binary

edits_inprogress

edits_inprogress正在处理的动作 会生成edits文件,edits文件的编号是连续的。

fsimage

HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件inode的序列化信息(id、类型、目录、所属用户、用户权限、时间戳...)全部放在fsimage里面,在namenode启动时会将它加载到内存,还会定期更新快照到该文件中

#将fsimage文件转换成xml文件,里面的内容不具备查看性质

hdfs oiv -i fsimage_0000000000000004588 -o fsimage_0000000000000004588.xml

🚀🌅😅管理员命令

数据均衡

#设定均衡各datanode之间的数据百分比在5,默认是10,如果节点多,10也没问题
hdfs balancer -threshold 5

集群管理

#显示集群报告
hdfs dfsadmin -report

#进入安全模式(hdfs只读不可写)
hdfs dfsadmin -safemode enter 

#离开安全模式
hdfs dfsadmin -safemode leave

#保存namenode数据结构到日志目录下
hdfs dfsadmin -metasave 20210914
--- cat /var/log/hadoop-hdfs/20210914

#获取最新的fsimage文件,fsimage是hadoop启动时加载到内存中的
hdfs dfsadmin -fetchImage .

#手动滚动编辑日志(系统会自动滚动,正常情况不要执行该命令)
hdfs dfsadmin -rollEdits

高可用集群管理

serviceId 这个ID在hdfs UI页面上,这行 Namenode ID:

#该命令没有实现,执行后没有任何返回
hdfs haadmin -checkHealth <serviceId>

#将namenodes状态转换为ActiveStandby(有自动选举,且这些命令不会尝试执行任何防护,因此应该很少使用)
hdfs haadmin [ -transitionToActive | -transitionToStandby] [<serviceId>]
#在两个 NameNode 之间启动故障转移,
hdfs haadmin -failover <serviceId> <serviceId>
  • 第一个提供的 NameNode 故障转移到第二个。如果第一个 NameNode 处于 Standby 状态,此命令只会将第二个 NameNode 转换为 Active 状态而不会出错。如果第一个 NameNode 处于 Active 状态,则会尝试将其优雅地转换为 Standby 状态。如果失败,将按顺序尝试防护方法(由dfs.ha.fencing.methods配置 ),直到成功。只有在这个过程之后,第二个 NameNode 才会转换到 Active 状态。如果没有 fencing 方法成功,第二个 NameNode 不会转换到 Active 状态,并且会返回错误
#查看所有NameNode 的状态
hdfs haadmin -getAllServiceState

#查看指定namenode的状态
hdfs haadmin -getServiceState <serviceId>

namenode初化始

#搞个备份的namenode,需要先启动QJM,然后格式化共享编辑日志,执行以下命令会,重新配置文件PATH/dfs/nn/current/  ,如果该目录不为空,会报错
hdfs namenode -initializeSharedEdits

验证datanode元数据和元文件

这个命令一般用不上

#验证元数据的类型和值,以及数据验证
hdfs debug verifyMeta -meta /PATH/dfs/dn/current/BP-1796118229-10.10.1.26-1600740369277/current/finalized/subdir0/subdir0/blk_1073742076_1252.meta -block /PATH/dfs/dn/current/BP-1796118229-10.10.1.26-1600740369277/current/finalized/subdir0/subdir0/blk_1073742076

小文件压缩

小文件压缩是管理blocks的方法之一,将大量小文件压缩成一个目录,减少blocks数量,减轻namenode压力

#执行归档命令,将启动一个MR任务
hadoop archive -archiveName data.har -p /user/xxx/old /user/xxx/new

#查看归档文件
hadoop fs -ls /user/xxx/new/data.har

#查看文件列表
hdfs dfs -ls har:///user/xxx/new/data.har

#查看文件内容
hdfs dfs -cat har:///user/xxx/new/data.har/99.txt

#提取小文件到其他目录
hadoop fs -cp har:///user/xxx/new/data.har/* /test10

🚀🌅😅Daemon命令

所谓的Deamon命令,其实就是启动一个集群组件服务

因为集群弄好之后,该启动都启好了, 基本上这些命令用不上,只要知道就行

启动服务,这些命令会从环境变量中读取到相应的配置

#启动datanode (DN,数据节点)
hdfs datanode

#启动journalnode(JN,共享编辑区)
hdfs  journalnode

#启动namenode(NN,名称节点)
hdfs  namenode

#启动zkfc(故障转移器,和JNZK一起工作,做NN的高可用)
hdfs zkfc

#启动nfs3(共享hdfs文件系统,挂载到本地,支持远程没有hadoop的环境)
hdfs nfs3

#启动httpfs(以http方式浏览hdfs文件)
hdfs httpfs

#启动kms管理服务(key管理服务,默认没有启动)
hadoop kms           

参考

这位博主的命令描述更细,排版很好,有目录链接非常方便 www.cnblogs.com/shudazhaofe…