一、HDFS相关常用总结
1、HDFS文件块
- 默认是128M
- 寻址时间:就是指的查找到目标block的时间
- 寻址时间最佳为传输时间的1%
- 目前磁盘的传输速率普遍为100M/s
- block的大小应该为=传输时间*传输速率
HDFS块大小调节标准
- HDFS块设置太小会增加寻址时间
- HDFS块设置太大会导致磁盘传输数据时间明显大于寻址时间,导致处理很慢
- HDFS块的大小设置取决于传输速率,也就是最好=传输时间*传输速率
2、HDFS的shell命令
3.常用命令实操
(0)启动Hadoop集群(方便后续的测试)
[gklearlove@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
[gklearlove@hadoop103 hadoop-2.7.2]$ sbin/start-yarn.sh
(1)-help:输出这个命令参数
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -help rm
(2)-ls: 显示目录信息
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -ls /
(3)-mkdir:在HDFS上创建目录
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir -p /sanguo/shuguo
(4)-moveFromLocal:从本地剪切粘贴到HDFS
[gklearlove@hadoop102 hadoop-2.7.2]$ touch kongming.txt
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -moveFromLocal ./kongming.txt /sanguo/shuguo
(5)-appendToFile:追加一个文件到已经存在的文件末尾
[gklearlove@hadoop102 hadoop-2.7.2]$ touch liubei.txt
[gklearlove@hadoop102 hadoop-2.7.2]$ vi liubei.txt
输入
san gu mao lu
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -appendToFile liubei.txt /sanguo/shuguo/kongming.txt
(6)-cat:显示文件内容
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -cat /sanguo/shuguo/kongming.txt
(7)-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -chmod 666 /sanguo/shuguo/kongming.txt
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -chown gklearlove:gklearlove /sanguo/shuguo/kongming.txt
(8)-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -copyFromLocal README.txt /
(9)-copyToLocal:从HDFS拷贝到本地
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -copyToLocal /sanguo/shuguo/kongming.txt ./
(10)-cp :从HDFS的一个路径拷贝到HDFS的另一个路径
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -cp /sanguo/shuguo/kongming.txt /zhuge.txt
(11)-mv:在HDFS目录中移动文件
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -mv /zhuge.txt /sanguo/shuguo/
(12)-get:等同于copyToLocal,就是从HDFS下载文件到本地
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -get /sanguo/shuguo/kongming.txt ./
(13)-getmerge:合并下载多个文件,比如HDFS的目录 /user/gklearlove/test下有多个文件:log.1, log.2,log.3,...
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -getmerge /user/gklearlove/test/* ./zaiyiqi.txt
(14)-put:等同于copyFromLocal
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -put ./zaiyiqi.txt /user/gklearlove/test/
(15)-tail:显示一个文件的末尾
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -tail /sanguo/shuguo/kongming.txt
(16)-rm:删除文件或文件夹
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -rm /user/gklearlove/test/jinlian2.txt
(17)-rmdir:删除空目录
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -mkdir /test
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -rmdir /test
(18)-du统计文件夹的大小信息
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -du -s -h /user/gklearlove/test
2.7 K /user/gklearlove/test
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -du -h /user/gklearlove/test
1.3 K /user/gklearlove/test/README.txt
15 /user/gklearlove/test/jinlian.txt
1.4 K /user/gklearlove/test/zaiyiqi.txt
(19)-setrep:设置HDFS中文件的副本数量
[gklearlove@hadoop102 hadoop-2.7.2]$ hadoop fs -setrep 10 /sanguo/shuguo/kongming.txt
图3-3 HDFS副本数量
这里设置的副本数只是记录在NameNode的元数据中,是否真的会有这么多副本,还得看DataNode的数量。因为目前只有3台设备,最多也就3个副本,只有节点数的增加到10台时,副本数才能达到10。
3、HDFS相关实用概念总结
-
HDFS写数据时,NameNode会判断哪个DataNode距离最近,然后写入,所以节点距离的计算方法是:两个节点到达最近的共同祖先的距离总和。
-
Fsimage:NameNode内存中元数据序列化后形成的文件,包含HDFS文件系统的所有目录和文件inode的序列化信息
-
Edits:记录客户端更新元数据信息的每一步操作(可通过Edits运算出元数据),文件系统客户端执行的所有写操作首先会被记录到Edits文件中。
-
NameNode启动过程:将Fsimage文件读入内存,加载Edits里面的更新操作,保证内存中的元数据信息都是最新、同步的。NameNode启动时就会将Fsimage和Edits合并
-
集群安全模式:
-
NameNode启动(此时处于安全模式):首先将镜像文件载入内存,并执行Edits文件中的各种操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的Fsimage文件和空的Edits日志。此时,NameNode开始监听DataNode请求。在这个过程中,NameNode一直运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
-
DataNode启动:系统的数据块的位置并不是由NameNode维护的,而是以块列表形式储存在DataNode中。在系统正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息,NameNode了解到足够多的快位置信息后,即可高效运行文件系统
-
安全模式退出判断:
- 最小副本条件:整个文件系统99.9%的块都满足对小副本级别(默认值:dfs.replication.min=1)。此时NameNode会在30秒后退出安全模式。
-
HDFS刚刚格式化启动时,NameNode不会进入安全模式,因为系统没有任何数据块。
-
相关命令:
(1)bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
(2)bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
(3)bin/hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态)
(4)bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
-
4、HDFS查看Fsimage和Edits
-
oiv查看Fsimage文件
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
例子:
hdfs oiv -p XML -i fsimage_0000000000000000025
-
oev查看Edits文件
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
例子:
hdfs oev -p XML -i edits_0000000000000000012-0000000000000000013 -o /opt/module/hadoop-2.7.2/edits.xml
5、HDFS相关参数总结
-
CheckPoint时间设置
-
默认是一小时或操作次数达到1百万时SecondaryNameNode合并一次。一分钟检查一次操作次数
-
修改步骤:
-
文件hdfs-default.xml
-
参数:
#最大间隔合并时间 <property> <name>dfs.namenode.checkpoint.period</name> <value>3600</value> </property> #最大间隔合并次数与检查时间 <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 >
-
-
-
掉线时限参数设置
-
掉线定义:当DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信时,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间为超时时长,HDFS默认的超时时长为10分+30秒
-
掉线时限公式:
TimeOut=2 * dfs.namenode.heartbeat.recheck-interval+10 * dfs.heartbeat.interval
-
其中对应的hdfs-site.xml配置文件的两个参数:dfs.heartbeat.interval单位是秒,heartbeat.recheck.interval单位是毫秒
<property> <name>dfs.namenode.heartbeat.recheck-interval</name> <value>300000</value> </property> <property> <name>dfs.heartbeat.interval</name> <value>3</value> </property>
-
6、HDFS实用场景
-
NameNode多目录配置:NameNode本地目录可以配置成多个,且内容相同,这样增加了可靠性,步骤如下:
-
在hdfs-site.xml文件中增加如下内容
<property> <name>dfs.namenode.name.dir</name> <value>file:///${hadoop.tmp.dir}/dfs/name1,file:///${hadoop.tmp.dir}/dfs/name2</value> </property>
-
停止集群,删除data和logs中所有数据
[gklearlove@hadoop102 hadoop-2.7.2]$ rm -rf data/ logs/ [gklearlove@hadoop103 hadoop-2.7.2]$ rm -rf data/ logs/ [gklearlove@hadoop104 hadoop-2.7.2]$ rm -rf data/ logs/
-
格式化集群并启动
[gklearlove@hadoop102 hadoop-2.7.2]$ bin/hdfs namenode –format [gklearlove@hadoop102 hadoop-2.7.2]$ sbin/start-dfs.sh
-
查看结果
[gklearlove@hadoop102 dfs]$ ll 总用量 12 drwx------. 3 gklearlove gklearlove 4096 12月 11 08:03 data drwxrwxr-x. 3 gklearlove gklearlove 4096 12月 11 08:03 name1 drwxrwxr-x. 3 gklearlove gklearlove 4096 12月 11 08:03 name2
-
-
NameNode故障处理
-
方法一:将SecondaryNameNode中数据拷贝到NameNode存储数据的目录
-
kill -9 NameNode进程
-
删除NameNode存储的数据(/opt/module/hadoop-2.7.2/data/tmp/dfs/name)
[gklearlove@hadoop102 hadoop-2.7.2]$ rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
-
拷贝SecondaryNameNode中数据到原NameNode存储数据目录
[gklearlove@hadoop102 dfs]$ scp -r gklearlove@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary/* ./name/
-
重新启动NameNode
[gklearlove@hadoop102 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start namenodebk
-
-
方法二:使用-importCheckpoint选项启动NameNode守护进程,从而将SecondaryNameNode中数据拷贝到NameNode目录中。
-
修改hdfs-site.xml中的
<property> <name>dfs.namenode.checkpoint.period</name> <value>120</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>/opt/module/hadoop-2.7.2/data/tmp/dfs/name</value> </property>
-
kill -9 NameNode进程
-
删除NameNode存储的数据
rm -rf /opt/module/hadoop-2.7.2/data/tmp/dfs/name/*
-
如果SecondaryNameNode不和NameNode在一个主机节点上,需要将SecondaryNameNode存储数据的目录拷贝到NameNode存储数据的平级目录,并删除in_use.lock文件
[gklearlove@hadoop102 dfs]$ scp -r gklearlove@hadoop104:/opt/module/hadoop-2.7.2/data/tmp/dfs/namesecondary ./ [gklearlove@hadoop102 namesecondary]$ rm -rf in_use.lock [gklearlove@hadoop102 dfs]$ pwd /opt/module/hadoop-2.7.2/data/tmp/dfs [gklearlove@hadoop102 dfs]$ ls data name namesecondary
-
导入检查点数据(等待一会ctrl+c结束掉)
bin/hdfs namenode -importCheckpoint
-
启动NameNode
sbin/hadoop-daemon.sh start namenode
-
-
-
服役新数据节点
-
随着业务增长,数据量增大,原来的数据节点已经无法满足,所以要增加数据节点
-
步骤:
-
机器准备
- 克隆一台相同的机器
- 修改IP地址和主机名称
- 删除原来HDFS文件系统留存的文件(/opt/module/hadoop-2.7.2/data和log)
- source一下配置文件
-
配置步骤
-
启动DataNode:
[gklearlove@hadoop105 hadoop-2.7.2]$ sbin/hadoop-daemon.sh start datanode [gklearlove@hadoop105 hadoop-2.7.2]$ sbin/yarn-daemon.sh start nodemanager
-
上传文件测试
hadoop fs -put /opt/module/hadoop-2.7.2/LICENSE.txt /
-
如果数据不均衡,用命令实现集群的再平衡
./start-balancer.sh
-
-
-
-
退役旧数据节点
-
添加白名单形式:在白名单内的主机节点,允许访问NameNode,不在白名单的主机节点都会被退出。配置白名单如下:
-
在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件
vi dfs.hosts 将不需要退出的节点写入,比如hadoop4是需要退出的,那么就写1 2 3 hadoop1 hadoop2 hadoop3
-
在NameNode的hdfs-site.xml配置文件中增加dfs.hosts属性
<property> <name>dfs.hosts</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value> </property>
-
配置文件分发
xsync hdfs-site.xml
-
刷新NameNode
hdfs dfsadmin -refreshNodes
-
更新ResourceManager节点
yarn rmadmin -refreshNodes
-
如果数据不均衡,就使用命令实现均衡
./start-balancer.sh
-
-
添加黑名单形式:在黑名单的节点都会被强制退出,步骤如下:
-
在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts.exclude文件
[gklearlove@hadoop102 hadoop]$ pwd /opt/module/hadoop-2.7.2/etc/hadoop [gklearlove@hadoop102 hadoop]$ touch dfs.hosts.exclude
-
添加需要退出的主机名
比如这里需要让hadoop4退出 vi dfs.hosts.exclude hadoop4
-
在hdfs-site.xml配置文件中增加dfs.hosts.exclude属性
<property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value> </property>
-
刷新NameNode、刷新ResourceManager
hdfs dfsadmin -refreshNodes yarn rmadmin -refreshNodes
-
通过Web服务器查看退役状态:decommission in progress表示退役中,decommissioned表示退役成功
-
退役成功后,停掉它的datanode和nodemanager
sbin/hadoop-daemon.sh stop datanode sbin/yarn-daemon.sh stop nodemanager
-
如果数据不均衡,就要使用命令来让集群平衡
sbin/start-balancer.sh
-
-
-
DataNode多目录配置
-
DataNode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本
-
具体配置如下:
-
修改hdfs-site.xml
<property> <name>dfs.datanode.data.dir</name> <value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value> </property>
-
-
-
实现两个Hadoop集群之间的递归数据复制
-
bin/hadoop distcp hdfs://haoop102:9000/user/gklearlove/hello.txt hdfs://hadoop103:9000/user/gklearlove/hello.txt
-
-
小文件存档
-
HDFS存储小文件弊端:每个文件按块存储,每个块的元数据存储在NameNode的内存中,因此存储小文件会非常低效,因为存储大量小文件的元数据会耗尽NameNode中的大部分内存
-
但是,存储小文件所需要的磁盘容量和数据块的大小无关:也就是说1M的数据使用128M的块存储,实际使用的仍然是1M磁盘空间而不是128M。
-
解决方法:使用HDFS存档文件或叫做HAR文件。
-
HDFS存档文件(HARwenjian ):一个更高效的文件存档工具,在逻辑上将多个小文件变成一个整体。具体来说就是HDFS的小文件还是一个一个的独立文件,但是对于NameNode来说却是一个整体,也就是中间人的作用,减少了NameNode的内存。
-
归档后的har文件不可修改,如果需要修改则需要重新归档
-
使用步骤:
-
启动YARN进程
start-yarn.sh
-
归档文件:将小文件归档称一个以.har后缀的归档文件。
#这里把/user/gklearlove/input的所有小文件归档称一个叫做input.har的归档文件,放到/user/gklearlove/output下,注意这里都是hdfs文件系统上 bin/hadoop archive -archiveName input.har –p /user/gklearlove/input /user/gklearlove/output
-
查看归档
hadoop fs -lsr /user/gklearlove/output/input.har hadoop fs -lsr har:///user/gklearlove/output/input.har
-
解归档文件(如果只是需要归档则不需要这一步)
hadoop fs -cp har:///user/gklearlove/output/input.har/* /user/gklearlove
-
-
-
-
回收站:可以将删除的文件在不超时的情况下,恢复原数据。
-
开启方式:
-
在core-site.xml设置两个参数
- fs.trash.interval=文件在回收站的存活时间,默认值=0
- fs.trash.checkpoint.interval=检查回收站的间隔时间,默认是=0
- 一般来说:fs.trash.checkpoint.interval<fs.trash.interval
数据值是分钟 <property> <name>fs.trash.interval</name> <value>10</value> </property> <property> <name>fs.trash.checkpoint.interval</name> <value>1</value> </property>
-
查看回收站
路径在:
HDFS的文件路径 /user/gklearlove/.Trash/….
-
修改访问垃圾回收站用户名称,默认是dr.who,在 core-site.xml
<property> <name>hadoop.http.staticuser.user</name> <value>gklearlove</value> </property>
-
-
使用方法
-
在程序中删除文件不会经过回收站,需要调用moveToTrash()才进入回收站
Trash trash = New Trash(conf); trash.moveToTrash(path);
-
恢复回收站数据
hadoop fs -mv /user/gklearlove/.Trash/Current/user/gklearlove/input /user/gklearlove/input
-
清空回收站
hadoop fs -expunge
-
-
-
快照管理:快照相当于做一个备份,但不会立即复制所有文件,而是记录文件的变化
-
开启/禁用指定目录的快照功能
开启: hdfs dfsadmin -allowSnapshot /user/gklearlove/input 禁用: hdfs dfsadmin -disallowSnapshot /user/gklearlove/input
-
对目录创建快照
创建快照(不指定名称) hdfs dfs -createSnapshot /user/gklearlove/input 创建快照(指定名称) hdfs dfs -createSnapshot /user/gklearlove/input 快照名称 查看指定目录快照 hdfs dfs -lsr /user/gklearlove/input/.snapshot/
-
重命名快照
hdfs dfs -renameSnapshot /user/gklearlove/input/ 旧名称 新名称
-
列出当前用户所有可快照目录
hdfs lsSnapshottableDir
-
比较两个快照目录的不同之处
hdfs snapshotDiff /user/gklearlove/input/ . .snapshot/gklearlove170508
-
恢复快照
hdfs dfs -cp /user/gklearlove/input/.snapshot/s20170708-134303.027 /user
-
HDFS-HA高可用(需要做的事情如下,理论上)
- 元数据管理方式需要改变
- 内存中各自保存一份元数据;
- Edits日志只有Active状态的NameNode节点可以做写操作;
- 两个NameNode都可以读取Edits;
- 共享的Edits放在一个共享存储中管理(qjournal和NFS两个主流实现);
- 需要一个状态管理功能模块
- 实现了一个zkfailover,常驻在每一个namenode所在的节点,每一个zkfailover负责监控自己所在NameNode节点,利用zk进行状态标识,当需要进行状态切换时,由zkfailover来负责切换,切换时需要防止brain split现象的发生。
- 必须保证两个NameNode之间能够ssh无密码登录
- 隔离(Fence),即同一时刻仅仅有一个NameNode对外提供服务
- 元数据管理方式需要改变
-
HDFS-HA高可用配置(手动转移)(在配置好ZooKeeper的基础上):
-
在opt目录下创建一个ha文件夹
mkdir ha
-
将/opt/app/下的 hadoop-2.7.2拷贝到/opt/ha目录下
cp -r hadoop-2.7.2/ /opt/ha/
-
配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144
-
配置core-site.xml
<configuration> <!-- 把两个NameNode)的地址组装成一个集群mycluster --> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop运行时产生文件的存储目录 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/ha/hadoop-2.7.2/data/tmp</value> </property> </configuration>
-
配置hdfs-site.xml
<configuration> <!-- 完全分布式集群名称 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 集群中NameNode节点都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop102:9000</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop103:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop102:50070</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop103:50070</value> </property> <!-- 指定NameNode元数据在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value> </property> <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔离机制时需要ssh无秘钥登录--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/gklearlove/.ssh/id_rsa</value> </property> <!-- 声明journalnode服务器存储目录--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/ha/hadoop-2.7.2/data/jn</value> </property> <!-- 关闭权限检查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> </configuration>
-
拷贝配置好的hadoop环境到其他节点
-
启动HDFS-HA集群
-
在各个JournalNode节点上,输入以下命令启动journalnode服务
sbin/hadoop-daemon.sh start journalnode
-
在[nn1]上,对其进行格式化,并启动
bin/hdfs namenode -format sbin/hadoop-daemon.sh start namenode
-
在[nn2]上,同步nn1的元数据信息
bin/hdfs namenode -bootstrapStandby
-
启动nn2
sbin/hadoop-daemon.sh start namenode
-
查看web页面显示,如图所示
-
-
- 在[nn1]上,启动所有datanode
```shell
sbin/hadoop-daemons.sh start datanode
```
- 将[nn1]切换为Active
```shell
bin/hdfs haadmin -transitionToActive nn1
```
- 查看是否Active
```shell
bin/hdfs haadmin -getServiceState nn1
```
-
HDFS-HA自动故障转移工作机制
- 自动故障转移工作机制就是指的当现役的NameNode故障时,会自动转移到备用的NameNode。部署自动故障转移需要两个新的东西:ZooKeeper和ZKFailoverController(ZKFC)进程。也就是说自动故障转移依赖ZooKeeper的故障检测功能,和现役NameNode选择功能。
- ZooKeeper做的事情是:
- 故障检测:集群中的每个NameNode在ZooKeeper中维护了一个持久会话,如果机器崩溃,ZooKeeper中的会话将终止,ZooKeeper通知另一个NameNode需要触发故障转移。
- 现役NameNode选择:ZooKeeper提供了一个简单的机制用于唯一的选择一个节点为active状态。如果目前现役NameNode崩溃,另一个节点可能从ZooKeeper获得特殊的排外锁以表明它应该成为现役NameNode。
- ZKFC(每个NameNode都会运行的进程,是ZooKeeper的客户端,也监视和管理NameNode的状态)做的事情是:
- 健康监测:ZKFC使用一个健康检查命令定期地ping与之在相同主机的NameNode,只要该NameNode及时地回复健康状态,ZKFC认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
- ZooKeeper会话管理:当本地NameNode是健康的,ZKFC保持一个在ZooKeeper中打开的会话。如果本地NameNode处于active状态,ZKFC也保持一个特殊的znode锁,该锁使用了ZooKeeper对短暂节点的支持,如果会话终止,锁节点将自动删除。
- 基于ZooKeeper的选择:如果本地NameNode是健康的,且ZKFC发现没有其它的节点当前持有znode锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地NameNode为Active。故障转移进程与前面描述的手动故障转移相似,首先如果必要保护之前的现役NameNode,然后本地NameNode转换为Active状态。
- ZooKeeper做的事情是:
- 自动故障转移工作机制就是指的当现役的NameNode故障时,会自动转移到备用的NameNode。部署自动故障转移需要两个新的东西:ZooKeeper和ZKFailoverController(ZKFC)进程。也就是说自动故障转移依赖ZooKeeper的故障检测功能,和现役NameNode选择功能。
-
配置HDFS-HA自动故障转移(在手动基础上)
-
在hdfs-site.xml中增加
<property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
-
在core-site.xml文件中增加
<property> <name>ha.zookeeper.quorum</name>xml <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> </property>
-
启动
-
关闭所有HDFS服务
sbin/stop-dfs.sh
-
启动Zookeeper集群
bin/zkServer.sh start
-
初始化HA在Zookeeper中状态
bin/hdfs zkfc -formatZK
-
启动HDFS服务
sbin/start-dfs.sh
-
在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode
sbin/hadoop-daemin.sh start zkfc
-
-
验证
-
将Active NameNode进程kill
kill -9 namenode的进程id
-
将Active NameNode机器断开网络
service network stop
-
-
-
配置YARN-HA集群
-
配置yarn-site.xml文件
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--启用resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--声明两台resourcemanager的地址--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop102</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop103</value> </property> <!--指定zookeeper集群的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> </property> <!--启用自动恢复--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的状态信息存储在zookeeper集群--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration>
-
同步更新其他节点的配置信息
-
启动HDFS
-
在各个JournalNode节点上,输入以下命令启动journalnode服务:
sbin/hadoop-daemon.sh start journalnode
-
在[nn1]上,对其进行格式化,并启动:
bin/hdfs namenode -format sbin/hadoop-daemon.sh start namenode
-
在[nn2]上,同步nn1的元数据信息
bin/hdfs namenode -bootstrapStandby
-
启动[nn2]
sbin/hadoop-daemon.sh start namenode
-
启动所有DataNode
sbin/hadoop-daemons.sh start datanode
-
将[nn1]切换为Active
bin/hdfs haadmin -transitionToActive nn1
-
-
启动YARN
-
在hadoop102中执行:
sbin/yarn-daemon.sh start resourcemanager
-
在hadoop103中执行
sbin/yarn-daemon.sh start resourcemanager
-
查看服务状态
bin/yarn rmadmin -getServiceState rm1
-
-
-
HDFS Federation架构设计
-
提出的原因:
-
NameNode架构的局限性
-
Namespace的限制:
由于NameNode在内存中存储所有的元数据(metadata),因此单个NameNode所能存储的对象(文件+块)数目受到NameNode所在JVM的heap size的限制。50G的heap能够存储20亿(200million)个对象,这20亿个对象支持4000个DataNode,12PB的存储(假设文件平均大小为40MB)。随着数据的飞速增长,存储的需求也随之增长。单个DataNode从4T增长到36T,集群的尺寸增长到8000个DataNode。存储的需求从12PB增长到大于100PB。
-
隔离问题:
由于HDFS仅有一个NameNode,无法隔离各个程序,因此HDFS上的一个实验程序就很有可能影响整个HDFS上运行的程序。
-
性能的瓶颈
由于是单个NameNode的HDFS架构,因此整个HDFS文件系统的吞吐量受限于单个NameNode的吞吐量。
-
-
-
架构设计方案:
- 多个NameNode,每个NameNode负责不同的业务,使用不同的Namespace(隔离性)
-