4.HDFS 常用命令和理论详细分析

教程 阿布都的都 ⋅ 于 2023-01-06 17:40:49 ⋅ 1423 阅读

1 HDFS的shell命令

#查看hadoop 命令的脚本
#which查看可执行文件的位置
which hadoop

fs命令调用的java类地址

file

最后拼到可执行java命令里

2 HDFS的常用操作

hadoop fs 与 hdfs dfs 都调的FsShell 类

下面都用hadoop fs 命令来演示

2.1 列出文件列表 ls

查看hdfs根目录

# 标准写法
hadoop fs -ls hdfs://ns1/
# 简写(推荐)
hadoop fs -ls / 
# -h:文件大小显示为最大单位
hadoop fs -ls -h /
# -R:递归显示
hadoop fs -ls -R /  

文件大小显示为最大单位

file

file

2.2 上传文件/目录 put

从主机本地系统到集群HDFS系统。

1)上传新文件

#标准写法:put 左面:是本地,右面是hdfs集群
hadoop fs -put /home/hadoop/test.txt hdfs://ns1/
#简写:右面默认找hdfs (推荐)
hadoop fs -put /home/hadoop/test.txt /
#当上传时要对文件进行重名
hadoop fs -put test.txt /t1.txt

2)上传多个文件

#一次上传多个文件到HDFS路径
hadoop fs -put f1 f2 /data  

3)上传目录

#上传并重命名目录
hadoop fs -put hadoop_op /    

4)覆盖上传

#当上传时,hdfs存在同样的文件名时,会报文件已存在错误。
#可通过 -f 强制上传,并替换旧文件
hadoop fs -put -f test.txt /t1.txt
[panniu@op hadoop_test]$ hadoop fs -ls -R -h /user/panniu/hdfs
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1/d11
-rw-r--r--   2 panniu panniu    946.1 K 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
# 上传
[panniu@op hadoop_test]$ hadoop fs -put ~/data.txt hdfs://ns1/user/panniu/hdfs
[panniu@op hadoop_test]$ 
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 3 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:19 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ 
# 上传重命名
[panniu@op hadoop_test]$ hadoop fs -put ~/data.txt /user/panniu/hdfs/data2.txt
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs                      
Found 4 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:19 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ 
# 重复上传会报错
[panniu@op hadoop_test]$ hadoop fs -put  ~/data.txt /user/panniu/hdfs  
put: /user/panniu/hdfs/data.txt: File exists
[panniu@op hadoop_test]$ 
# 强制上传
[panniu@op hadoop_test]$ hadoop fs -put -f ~/data.txt /user/panniu/hdfs
[panniu@op hadoop_test]$ 
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs               
Found 4 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
# 多个文件同时上传
[panniu@op hadoop_test]$ touch f1
[panniu@op hadoop_test]$ touch f2
[panniu@op hadoop_test]$ 
[panniu@op hadoop_test]$ hadoop fs -put f1 f2 /user/panniu/hdfs
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 6 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz

2.3 下载文件/目录 get

从集群HDFS到本地文件系统,默认左面是hdfs,右面是linux本地

#1)下载hdfs文件到本地目录
hadoop fs -get /test.txt /home/hadoop
#2)下载hdfs文件到本地目录并重命名
hadoop fs -get /test.txt /home/hadoop/test2.txt
# 下载hdfs文件到本地目录
[panniu@op hadoop_test]$ hadoop fs -get /user/panniu/hdfs/d1 ./           
[panniu@op hadoop_test]$ ll
总用量 0
drwxrwxr-x 3 panniu panniu 25 7月  19 16:27 d1
-rw-rw-r-- 1 panniu panniu  0 7月  19 16:26 f1
-rw-rw-r-- 1 panniu panniu  0 7月  19 16:26 f2
# 下载hdfs文件到本地目录并重命名
[panniu@op hadoop_test]$ hadoop fs -get /user/panniu/hdfs/d1 ./d1_1
[panniu@op hadoop_test]$ ll
总用量 0
drwxrwxr-x 3 panniu panniu 25 7月  19 16:27 d1
drwxrwxr-x 3 panniu panniu 25 7月  19 16:28 d1_1
-rw-rw-r-- 1 panniu panniu  0 7月  19 16:26 f1
-rw-rw-r-- 1 panniu panniu  0 7月  19 16:26 f2

2.4 拷贝文件/目录 cp

1)从本地到HDFS,同put,【此种方式推荐用put】

如果是本地文件,要以绝对路径表示,本地路径需要加file:

hadoop fs -cp file:/home/hadoop/test/f2 /test_f2

2)从HDFS到HDFS

# 如果是不同hdfs集群间copy用标准写法
hadoop fs -cp hdfs://ns1/haha.sh hdfs://ns1/test
 hadoop fs -cp hdfs:/exe.sh hdfs:/test
# 如果是同集群,用简写
 hadoop fs -cp /haha.sh /data
# 同put一样的cp   linux ---> hdfs
[panniu@op hadoop_test]$ hadoop fs -cp file:/home/panniu/hadoop_test/f1 /user/panniu/hdfs/d1
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs/d1
Found 2 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/hdfs/d1/d11
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1/f1
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 6 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
# hdfs --> hdfs  可以 copy文件、目录
[panniu@op hadoop_test]$ hadoop fs -cp /user/panniu/hdfs/d1 /user/panniu/hdfs/d1_copy
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs                             
Found 7 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_copy
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs/d1_copy
Found 2 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_copy/d11
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_copy/f1

2.5 移动文件 mv

hadoop fs -mv /test_f2 /test

# hdfs ---> hdfs  目录文件均可
[panniu@op hadoop_test]$ hadoop fs -mv /user/panniu/hdfs/d1_copy /user/panniu/hdfs/d1_mv
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 7 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_mv
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ 

2.6 删除文件/目录 rm

执行-rm 命令后,默认是把文件移动到 user/hadoop/.Trash/Current 下,会根据配置文件配置的清理周期定期清理。

1)删除指定文件

​ hadoop fs -rm /a.txt

2)删除全部txt文件

​ hadoop fs -rm /*.txt

[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 7 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_mv
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ 
# 删除 hdfs 文件, 其实是mv到hdfs的回收站: hdfs://ns1/user/xxx/.Trash/Current
[panniu@op hadoop_test]$ hadoop fs -rm /user/panniu/hdfs/f1
21/07/19 16:37:19 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 2880 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://ns1/user/panniu/hdfs/f1' to trash at: hdfs://ns1/user/panniu/.Trash/Current
# 在回收站查看
[panniu@op hadoop_test]$ hadoop fs -ls hdfs://ns1/user/panniu/.Trash/Current
Found 1 items
drwx------   - panniu panniu          0 2021-07-19 00:00 hdfs://ns1/user/panniu/.Trash/Current/user
[panniu@op hadoop_test]$ hadoop fs -ls hdfs://ns1/user/panniu/.Trash/Current/user/panniu/hdfs
Found 1 items
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 hdfs://ns1/user/panniu/.Trash/Current/user/panniu/hdfs/f1
[panniu@op hadoop_test]$ 
# 文件缺失进入回收站了
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 6 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_mv
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ 
# 从回收站恢复
[panniu@op hadoop_test]$ hadoop fs -mv hdfs://ns1/user/panniu/.Trash/Current/user/panniu/hdfs/f1 /user/panniu/hdfs
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 7 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_mv
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/hdfs/f2
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
# 支持模糊删除
[panniu@op hadoop_test]$ hadoop fs -rm /user/panniu/hdfs/f*
21/07/19 16:41:41 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 2880 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://ns1/user/panniu/hdfs/f1' to trash at: hdfs://ns1/user/panniu/.Trash/Current
21/07/19 16:41:41 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 2880 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://ns1/user/panniu/hdfs/f2' to trash at: hdfs://ns1/user/panniu/.Trash/Current
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs   
Found 5 items
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/hdfs/d1_mv
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:21 /user/panniu/hdfs/data2.txt
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz

3)递归删除全部文件和目录

​ hadoop fs -rmr /dir/

hadoop fs -rm -r /dir/

[panniu@op hadoop_test]$ hadoop fs -rm /user/panniu/hdfs/d1
rm: `/user/panniu/hdfs/d1': Is a directory
[panniu@op hadoop_test]$ 
[panniu@op hadoop_test]$ hadoop fs -rm -r /user/panniu/hdfs/d1
21/07/19 16:42:51 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 2880 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://ns1/user/panniu/hdfs/d1' to trash at: hdfs://ns1/user/panniu/.Trash/Current
[panniu@op hadoop_test]$ hadoop fs -rmr /user/panniu/hdfs/d1_mv
rmr: DEPRECATED: Please use 'rm -r' instead.
21/07/19 16:43:03 INFO fs.TrashPolicyDefault: Namenode trash configuration: Deletion interval = 2880 minutes, Emptier interval = 0 minutes.
Moved: 'hdfs://ns1/user/panniu/hdfs/d1_mv' to trash at: hdfs://ns1/user/panniu/.Trash/Current

4)删除之后不放到回收站

​ hadoop fs -rm -skipTrash /dir

Moved: 'hdfs://ns1/user/panniu/hdfs/d1_mv' to trash at: hdfs://ns1/user/panniu/.Trash/Current
[panniu@op hadoop_test]$ hadoop fs -rm -skipTrash /user/panniu/hdfs/data2.txt
Deleted /user/panniu/hdfs/data2.txt
[panniu@op hadoop_test]$ hadoop fs -ls -R /user/panniu/.Trash/Current/user/panniu/hdfs
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:31 /user/panniu/.Trash/Current/user/panniu/hdfs/d1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:16 /user/panniu/.Trash/Current/user/panniu/hdfs/d1/d11
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:31 /user/panniu/.Trash/Current/user/panniu/hdfs/d1/f1
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/.Trash/Current/user/panniu/hdfs/d1_mv
drwxr-xr-x   - panniu panniu          0 2021-07-19 16:32 /user/panniu/.Trash/Current/user/panniu/hdfs/d1_mv/d11
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:32 /user/panniu/.Trash/Current/user/panniu/hdfs/d1_mv/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/.Trash/Current/user/panniu/hdfs/f1
-rw-r--r--   2 panniu panniu          0 2021-07-19 16:26 /user/panniu/.Trash/Current/user/panniu/hdfs/f2

2.7 读取文件 cat

查看文件内容,如果文件超过一屏幕,那不建议用

hadoop fs -cat /test.txt

2.8 读取文件尾部 tail

查看尾部1K字节

hadoop fs -tail /test.txt

file

2.9 创建空文件 touchz

hadoop fs - touchz /newfile.txt

2.10 追加写入文件 appendToFile

hadoop fs -appendToFile file:/test.txt hdfs:/newfile.txt #读取本地文件内容追加到HDFS文件

[panniu@op hadoop_test]$ hadoop fs -touchz /user/panniu/hdfs/f3
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs
Found 3 items
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu          0 2021-07-19 17:05 /user/panniu/hdfs/f3
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op hadoop_test]$ hadoop fs -appendFile ~/data.txt /user/panniu/hdfs/f3
-appendFile: Unknown command
[panniu@op hadoop_test]$ hadoop fs -appendToFile ~/data.txt /user/panniu/hdfs/f3  
[panniu@op hadoop_test]$ hadoop fs -ls /user/panniu/hdfs                        
Found 3 items
-rw-r--r--   2 panniu panniu       7703 2021-07-19 16:22 /user/panniu/hdfs/data.txt
-rw-r--r--   2 panniu panniu       7703 2021-07-19 17:06 /user/panniu/hdfs/f3
-rw-r--r--   2 panniu panniu     968805 2021-07-19 16:15 /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz

2.11 创建目录 mkdir

#可以同时创建多个目录
hadoop fs -mkdir /newdir /newdir2   
#同时创建父级目录
hadoop fs -mkdir -p /newpkg/newpkg2/newpkg3
[panniu@op hadoop_test]$ hadoop fs -mkdir -p /user/panniu/hdfs/dd1/dd2/dd3
[panniu@op hadoop_test]$ hadoop fs -ls -R /user/panniu/hdfs/dd1
drwxr-xr-x   - panniu panniu          0 2021-07-19 17:07 /user/panniu/hdfs/dd1/dd2
drwxr-xr-x   - panniu panniu          0 2021-07-19 17:07 /user/panniu/hdfs/dd1/dd2/dd3

2.12 改变文件副本数 setrep

hadoop fs -setrep -R -w 2 /test.txt

-R 递归改变目录下所有文件的副本数。

-w 等待副本数调整完毕后返回。可理解为加了这个参数就是阻塞式的了。

file

file

如果想修改块大小,修改配置hdfs-site.xml dfs.blocksize 属性

2.13 获取逻辑空间文件/目录大小 du

#显示HDFS根目录中各文件和文件夹大小
hadoop fs - du / 
#以最大单位显示HDFS根目录中各文件和文件夹大小
hadoop fs -du -h / 
#仅显示HDFS根目录大小。即各文件和文件夹大小之和
hadoop fs -du -s /
[panniu@op ~]$ hadoop fs -du /user/panniu/hdfs
7703    /user/panniu/hdfs/data.txt
0       /user/panniu/hdfs/dd1
7703    /user/panniu/hdfs/f3
968805  /user/panniu/hdfs/nginx_hainiu_20190428.log.tar.gz
[panniu@op ~]$ hadoop fs -du -s /user/panniu/hdfs
984211  /user/panniu/hdfs
[panniu@op ~]$ 
[panniu@op ~]$ hadoop fs -du -s -h /user/panniu/hdfs
961.1 K  /user/panniu/hdfs
[panniu@op ~]$ hadoop fs -du -s -h /user/panniu
28.1 G  /user/panniu

3 管理工具hadoop dfsadmin

hdfs dfsadmin

例如:hadoop dfsadmin -report

dfsadmin命令详解

1) -report:

​ 查看文件系统的基本信息和统计信息。

2)-safemode :

​ 安全模式命令。安全模式是NameNode的一种状态,在这种状态下,NameNode不接受对名字空间的更改(只读);不复制或删除块。NameNode在启动时自动进入安全模式,当配置块的最小百分数满足最小副本数的条件时,会自动离开安全模式。enter是进入,leave是离开。

#进入安全模式
hdfs dfsadmin  -safemode enter
#离开安全模式
hdfs dfsadmin -safemode leave
#获取安全模式信息
hdfs dfsadmin -safemode get

3) -refreshNodes:

​ 重新读取hosts和exclude文件,使新的节点或需要退出集群的节点能够被NameNode重新识别。这个命令在新增节点或注销节点时用到。

如何动态增加节点?

新增一台s4

1)s4 机器基础环境必须搞好(host、ssh、免密登录root),简单方式直接从s3 克隆一台,注意:要把s4机器上的/data/dfs 目录删掉,因为在启动datanode 节点时会自动在/data/目录下创建dfs目录。

将当前开启的窗口平铺

file

file

这样所有开启的窗口,一起执行命令echo "192.168.142.165 s4.hadoop" >> /etc/hosts

2)在 etc/hadoop/slave 文件中追加 s4 的主机名

file

3)在s4 机器上用 hadoop-daemon.sh star datanode 启动s4机器上的datanode

5)用 hdfs dfsadmin -refreshNodes

6)先让nn1.hadoop 记录 s4.hadoop 的ssh 信息:在nn1.hadoop上用hadoop用户执行: ssh s4.hadoop

如何动态删除节点?

1)在hdfs-site.xml 追加属性dfs.hosts.exclude, 该属性配置的参数是配置要删除节点机器的主机名。

        <property>
                <name>dfs.hosts.exclude</name>
                <value>/usr/local/hadoop/etc/hadoop/excludes</value>
        </property>

2)在excludes文件中配置要删除节点的主机名

3)分发hdfs-site.xml 和 exludes 文件

4)执行命令 hdfs dfsadmin -refreshNodes,查看WEBUI,节点状态在Decommission In Progress,在将退役节点的数据往其他机器迁移

5)当所有的要退役的节点都报告为Decommissioned,数据迁移工作已经完成

注意:【退役后的节点数要≥ 设置的副本数,否则会一直留在退役中】。

解释:

​ ① 设置hdfs副本数为2

​ ② 上传数据到hdfs,会有两个副本

file

​ ③ 将三个datanode机器的s2.hadoop 退役,webUI显示s2.hadoop 正在退役,在退役时,会复制该节点数据到其他节点

file

​ ④ 已经将s2.hadoop 数据复制到了s3.hadoop上,当复制完成后,就变成已退役状态。

file

​ ⑤ 查看 /zookeeper-3.4.8.tar.gz 文件块位置

file

4) -metasave filename:

​ 保存NameNode的主要数据结构到hadoop.log.dir属性指定的目录下的 文件中。

#在hadoop日志目录下创建namenode的数据结构信息
hdfs dfsadmin -metasave  namenode_data

file

4 HDFS 负载均衡

4.1 HDFS负载均衡概述

​ Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。当数据不平衡时,Map任务可能会分配到没有存储数据的机器,这将导致网络带宽的消耗,也无法很好的进行本地计算。
​ 当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能,防止热点的发生。进行数据的负载均衡调整,必须要满足如下原则:

  • 数据平衡不能导致数据块减少,数据块备份丢失
  • 管理员可以中止数据平衡进程
  • 每次移动的数据量以及占用的网络资源,必须是可控的
  • 数据均衡过程,不能影响namenode的正常工作

4.2 HDFS 数据自动平衡脚本使用方法

​ 在Hadoop中,包含一个 start-balancer.sh 脚本,通过运行这个工具,启动HDFS数据均衡服务。该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。

启动命令为:‘Hadoop_home/sbin/start-balancer.sh –threshold`

影响Balancer的参数:

  • -threshold
    • 默认设置:10,参数取值范围:1-100
    • 参数含义:datanode间磁盘使用率相差阈值。理论上,该参数设置的越小,整个集群就越平衡。

比如:

#启动数据均衡,默认阈值为 10%
$Hadoop_home/sbin/start-balancer.sh
#启动数据均衡,阈值 5%
$Hadoop_home/sbin/start-balancer.sh -threshold 5
#停止数据均衡
$Hadoop_home/bin/stop-balancer.sh

也可以在hdfs-site.xml文件中设置数据均衡占用的网络带宽限制

    <property>
        <name>dfs.balance.bandwidthPerSec</name>
        <value>1048576</value>
        <description>根据每秒字节数指定每个数据节点可用于平衡的最大带宽,默认 1M/S</description>
    </property>

5 理论详细分析

5.1 NameNode 详解

1)NameNode是整个HDFS集群的中心

​ a 负责管理 DataNode 节点;

​ b 负责安排管理集群中数据的存储并记录存储文件的元数据;

​ c 负责客户端对文件的访问;

2)在运行时把所有的元数据都保存到namenode机器的内存中,所以整个HDFS可存储的文件数受限于namenode的内存大小。一个元数据是150字节。

3)NameNode 也记录着每个文件中各个block块所在的DataNode信息,但它并不永久保存其block块的位置信息,因为这些信息会在系统启动时由DataNode上报给NameNode。

4)Namenode 除了内存存储元数据外,磁盘也存储,主要维护两个文件,一个是 fsimage**,一个是editlog**。

editlog(简称edits):

​ 操作日志文件,记录了NameNode所要执行的操作;

fsimage:

​ 元数据镜像文件。存储某NameNode元数据信息,并不是实时同步内存中的数据。

​ 一般而言,fsimage中的元数据是落后于内存中的元数据的;

​ 当有写请求时,NameNode会首先写该操作先写到磁盘上的edits文件中,当edits文件写成功后才会修改NameNode内存的元数据,内存 修改成功后向客户端返回成功信号。

file

设计的目的:

​ 一旦namenode挂了,内存数据丢失,可以通过 fsimage + edits 恢复。

journalnode 同步数据方式:通过edits

file

7) fsimage 和 edits 合并

​ 随着时间的推移,hdfs 存储越来越多,元数据越来越多,导致 edits 文件也越来越多、越来越大。导致namenode 在启动加载edits 时会很慢,所以需要对edits和fsimage进行合并。

​ 所谓合并,就是将edits和fsimage加载到内存中,照着edits中的操作一步步执行,最终形成新的fsimage,其实这个过程叫 checkpoint机制。

checkpoint机制:

file

​ 其实这个合并过程是一个很耗I/O与CPU的操作,并且在进行合并的过程中肯定也会有其他应用继续访问和修改hdfs文件。

​ 如果HDFS没有做HA的话,checkpoint由SecondNameNode进程(一般SecondNameNode单独起在另一台机器上)来进行。

​ 在HA模式下,checkpoint则由StandBy状态的NameNode来进行。

大概执行过程:

​ 如果满足checkpoint需求,standby NameNode 拉取Active NameNode的fsimage镜像文件,和 同步过来的 edits 合并成新的 fsimage,然后再返回给Active NameNode。

​ 什么时候checkpoint 由两个参数决定:

​ a. 每隔一小时执行一次(定时执行)

<property>
  <name>dfs.namenode.checkpoint.period</name>
  <value>3600</value>
</property >

​ b. 一分钟检查一次操作次数,当操作次数达到1百万时,执行一次(定量执行)

<property>
  <name>dfs.namenode.checkpoint.txns</name>
  <value>1000000</value>
<description>操作动作次数</description>
</property>
<property>
  <name>dfs.namenode.checkpoint.check.period</name>
  <value>60</value>
<description> 1分钟检查一次操作次数</description>
</property>

5.2 数据块副本的存储规则

​ 1)若client为DataNode节点,那存储block时,规则为:

​ 副本1,同client的节点上;

​ 副本2,不同机架节点上;

​ 副本3,同第二个副本机架的另一个节点上;

​ 其他副本随机挑选。

​ 2)若client不为DataNode节点,那存储block时,规则为:

​ 副本1,随机选择一个节点上;

​ 副本2,不同机架节点上;

​ 副本3,同第二个副本机架的另一个节点上;

​ 其他副本随机挑选。

file

5.3 机架感知策略的实现机制

默认情况下,Hadoop机架感知是没有启用的,需要在NameNode机器的hadoop-site.xml里配置一个选项,例如:

<property>  
    <name>topology.script.file.name</name>
    <value>/path/to/script</value>
</property>

其中:

​ 这个配置选项的 value 指定为一个可执行程序,通常为一个脚本,该脚本接受一个参数,输出一个值。

​ 接受的参数通常为 datanode 机器的 ip 地址,而输出的值通常为该ip地址对应的 datanode 所在的rackID,例如”/rack1”。

​ Namenode 启动时,会判断该配置选项是否为空,如果非空,则表示已经启用机架感知的配置,此时 namenode 会根据配置寻找该脚本,并在接收到每一个 datanode 的 heartbeat 时,将该 datanode 的ip地址作为参数传给该脚本运行,并将得到的输出作为该datanode 所属的机架,保存到内存的一个map中。

​ 至于脚本的编写,就需要将真实的网络拓朴和机架信息了解清楚后,通过该脚本能够将机器的ip地址正确的映射到相应的机架上去。

​ 当没有配置机架信息时,所有的datanode,hadoop都默认在同一个名为 “/default-rack”机架下。

版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-阿布都的都,http://hainiubl.com/topics/76038
成为第一个点赞的人吧 :bowtie:
回复数量: 0
    暂无评论~~
    • 请注意单词拼写,以及中英文排版,参考此页
    • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
    • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
    • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
    • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
    Ctrl+Enter