小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
前言
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状态转换为Active或Standby(有自动选举,且这些命令不会尝试执行任何防护,因此应该很少使用)
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(故障转移器,和JN,ZK一起工作,做NN的高可用)
hdfs zkfc
#启动nfs3(共享hdfs文件系统,挂载到本地,支持远程没有hadoop的环境)
hdfs nfs3
#启动httpfs(以http方式浏览hdfs文件)
hdfs httpfs
#启动kms管理服务(key管理服务,默认没有启动)
hadoop kms
参考
这位博主的命令描述更细,排版很好,有目录链接非常方便 www.cnblogs.com/shudazhaofe…