1.高级命令
常用命令总结:
一:HA命令
1 | 操作HA 就用 hdfs haadmin |
1.hdfs haadmin -getServiceState nn1/nn2 查看serviceId的状态
1 | eg: |
小案例模拟:假设active 的 nn 被kill 掉了 ,standby 的 nn 能不能变成active?
1 | (1)把 nn1的namenode kill掉 |
2.把standby 切换为active的 失效转移
hdfs haadmin -failover
1 | [hadoop@ruozedata001 ~]$ hdfs haadmin -getServiceState nn1 |
二:HDFS集群的健康检查命令
当有文件损坏的时候 损坏的块/丢失的副本
1 | 做hdfs集群健康检查hdfs fsck |
1.查看有没有损坏的块和丢失的副本
1 | [hadoop@ruozedata001 ~]$ hdfs fsck / |
2.如果有损坏的块和丢失的副本 不想恢复他们想一了百了 只删除损坏的文件
1 | [hadoop@ruozedata001 ~]$ hdfs fsck / -delete |
注意:如果不想删除损坏的文件怎么办呢?(作业)
3.损坏的文件 在哪些块上面(因为也不知道文件的这些块分布在那台机器上面) -list-corruptfileblocks 会打印损坏的文件的哪些块损坏了或丢失了
三:HDFS集群案例
1.现象是:
断电 导致HDFS服务不正常或者显示块损坏
2.检查HDFS系统文件健康状态
hdfs fsck / 或者在50070的页面查看(这个命令只会显示哪个文件损坏了)
3.检查 损坏的文件的哪些块损坏 (加上-list-corruptfileblocks 参数)
hdfs fsck / -list-corruptfileblocks 会打印出损坏的块
这块会打印出哪个文件的哪些块损坏
4.解决
1.第一种解决办法:不建议 耗时
把损坏的数据 重新刷一份到HDFS平台即可(前提你明确知道 重刷的哪个数据(就是你删除哪个损坏文件 对应的源头数据在哪))
2.第二种解决办法:下面的实验
5.想要知道文件的哪些块分布在哪些机器上面?
如果我知道哪个文件的哪些块在哪台机器上面 我就可以手工的把那个块删掉了(使用linux命令) 就不用使用 hdfs fsck / -delete
因为 hdfs fsck / -delete 他是删除损坏的文件 (直接把损坏的文件干掉了 而不是删除损坏的块)
1 | 但是 有一个问题 如果这个损坏的块被删除 你的数据该如何完整的恢复? 你怎么知道删除的那个块 数据丢了多少? 根本不知道 |
实验:上传一个文件到hdfs上 (三个副本),在某台机器上找到对应的副本文件 删掉一个副本文件
最终使用hdfs debug 来利用其余两个好的副本恢复损坏的文件
1 | 重要的命令:hdfs debug |