大数据学习第7天:
学习主题:HDFS命令操作和高可用
学习目标:
hdfs HA的原理:
•HDFS 2.x
–解决HDFS 1.0中单点故障和内存受限问题。
–解决单点故障
•HDFS HA:通过主备NameNode解决
•如果主NameNode发生故障,则切换到备NameNode上
–解决内存受限问题
•HDFS Federation(联邦)
•水平扩展,支持多个NameNode;
•(2)每个NameNode分管一部分目录;
•(1)所有NameNode共享所有DataNode存储资源
–2.x仅是架构上发生了变化,使用方式不变
–对HDFS使用者透明
–HDFS 1.x中的命令和API仍可以使用
HDFS 2.0 HA
–主备NameNode
–解决单点故障(属性,位置)
•主NameNode对外提供服务,备NameNode同步主NameNode元数据,以待切换
•所有DataNode同时向两个NameNode汇报数据块信息(位置)
•JNN:集群(属性)
•standby:备,完成了edits.log文件的合并产生新的image,推送回ANN
–两种切换选择
•手动切换:通过命令实现主备之间的切换,可以用HDFS升级等场合
•自动切换:基于Zookeeper实现
–基于Zookeeper自动切换方案
•ZooKeeper Failover Controller:监控NameNode健康状态,
•并向Zookeeper注册NameNode
•NameNode挂掉后,ZKFC为NameNode竞争锁,获得ZKFC 锁的NameNode变为active
•HDFS 2.x Federation
–
–通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展。
–能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。
4.HDFS 2.0 联邦制(Federation)
通过多个namenode/namespace把元数据的存储和管理分散到多个节点中,使到namenode/namespace可以通过增加机器来进行水平扩展。
能把单个namenode的负载分散到多个节点中,在HDFS数据规模较大的时候不会也降低HDFS的性能。可以通过多个namespace来隔离不同类型的应用,把不同类型应用的HDFS元数据的存储和管理分派到不同的namenode中。
掌握:HDFS的命令行操作
hdfs dfs -ls",“hdfs dfs -cat”,“hdfs dfs -mkdir”,“hdfs dfs -put”,“hdfs dfs -get” “-chmod” ,“-chown”等
掌握:HDFS高可用的原理。
Hadoop HA(High Available)通过同时配置两个处于Active/Passive模式的Namenode来解决上述问题,分别叫Active Namenode和Standby Namenode. Standby Namenode作为热备份,从而允许在机器发生故障时能够快速进行故障转移,同时在日常维护的时候使用优雅的方式进行Namenode切换。Namenode只能配置一主一备,不能多于两个Namenode。
主Namenode处理所有的操作请求(读写),而Standby只是作为slave,维护尽可能同步的状态,使得故障时能够快速切换到Standby。为了使Standby Namenode与Active Namenode数据保持同步,两个Namenode都与一组Journal Node进行通信。当主Namenode进行任务的namespace操作时,都会确保持久会修改日志到Journal Node节点中的大部分。Standby Namenode持续监控这些edit,当监测到变化时,将这些修改应用到自己的namespace。
当进行故障转移时,Standby在成为Active Namenode之前,会确保自己已经读取了Journal Node中的所有edit日志,从而保持数据状态与故障发生前一致。
为了确保故障转移能够快速完成,Standby Namenode需要维护最新的Block位置信息,即每个Block副本存放在集群中的哪些节点上。为了达到这一点,Datanode同时配置主备两个Namenode,并同时发送Block报告和心跳到两台Namenode。
确保任何时刻只有一个Namenode处于Active状态非常重要,否则可能出现数据丢失或者数据损坏。当两台Namenode都认为自己的Active Namenode时,会同时尝试写入数据(不会再去检测和同步数据)。为了防止这种脑裂现象,Journal Nodes只允许一个Namenode写入数据,内部通过维护epoch数来控制,从而安全地进行故障转移。
有两种方式可以进行edit log共享:
- 使用NFS共享edit log(存储在NAS/SAN)
- 使用QJM共享edit log
使用Zookeeper进行自动故障转移
前面提到,为了支持故障转移,Hadoop引入两个新的组件:Zookeeper Quorum和ZKFailoverController process(简称ZKFC)。
Zookeeper的任务包括:
失败检测:每个Namnode都在ZK中维护一个持久性session,如果Namnode故障,session过期,使用zk的事件机制通知其他Namenode需要故障转移。
Namenode选举:如果当前Activenamenode挂了,另一个namenode会尝试获取ZK中的一个排它锁,获取这个锁就表名它将成为下一个Active NN。
在每个Namenode守护进程的机器上,同时也会运行一个ZKFC,用于完成以下任务:
Namenode健康健康
ZK Session管理
基于ZK的Namenode选举
如果ZKFC所在机器的Namenode健康状态良好,并且用于选举的znode锁未被其他节点持有,则ZKFC会尝试获取锁,成功获取这个排它锁就代表获得选举,获得选举之后负责故障转移,如果有必要,会fencing掉之前的namenode使其不可用,然后将自己的namenode切换为Active状态。
-
实战:HDFS的高可用。注意记录笔记。
-
注意观察一个命令执行之后是否有error。
-
任何一个节点启动不了。需要查看该节点的日志。 日志在hadoop的目录下面logs目录里面。
-
注意的问题1 :每台机器必须有不同的主机名。每台机器必须配置hosts
-
注意的问题2:每台机器上到底有什么节点。
node1 node2 node3 node4 NN NN JN JN JN DN DN DN ZK ZK ZK ZKFC ZKFC
Active NameNode : 一个集群只有一个Active,接受客户端的读写请求,记录edits日志(元数据)。
StandbyNameNode : 一个集群中可能有多个Standby。合并edits和fsimage文件,从而更新fsimage。等待 ActiveNameNode的死亡。
JournalNode: 共享edits日志文件。当ANN写入一条日志的同时,往JournalNode集群中也写入一条。当它接受一条日志,同时通知StandbyNamenode获取。
DataNode: 保存和管理block。并且往两种NameNode同时汇报block的位置信息。
Zookeeper: 它是负责选举算法。选举一个Namenode的状态为Active。同时记录每个Namenode的运行信息。
ZKFC: 监控各自的NameNode(每一个NameNode一定有一个与之对应的ZKFC)。负责NameNode的状态切换。借助ssh服务来切换NameNode的状态(一定要配置SSH服务的免密钥)。
-
zk客户端命令
ZooKeeper命令行工具类似于Linux的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作. 使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。
命令行工具的一些简单操作如下:
- \1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容
- \2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据
- \3. 创建文件,并设置初始内容: create /zk “test” 创建一个新的 znode节点“ zk ”以及与它关联的字符串
- \4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串
- \5. 修改文件内容: set /zk “zkbak” 对 zk 所关联的字符串进行设置
- \6. 删除文件: delete /zk 将刚才创建的 znode 删除
- \7. 退出客户端: quit
- \8. 帮助命令: help
搭建HA集群:
1、zookeeper集群搭建
a) 将zookeeper.tar.gz上传到node2、node3、node4
b) 解压到/opt
tar -zxf zookeeper-3.4.6.tar.gz -C /opt
c) 配置环境变量:
export ZOOKEEPER_PREFIX=/opt/zookeeper-3.4.6
export PATH= P A T H : PATH: PATH:ZOOKEEPER_PREFIX/bin
然后. /etc/profile让配置生效
d) 到$ZOOKEEPER_PREFIX/conf下
复制zoo_sample.cfg为zoo.cfg
cp zoo_sample.cfg zoo.cfg
e) 编辑zoo.cfg
添加如下行:
server.1=node2:2881:3881
server.2=node3:2881:3881
server.3=node4:2881:3881
修改
dataDir=/var/bjsxt/zookeeper/data
f) 创建/var/bjsxt/zookeeper/data目录,并在该目录下放一个文件:myid
在myid中写下当前zookeeper的编号
mkdir -p /var/bjsxt/zookeeper/data
echo 3 > /var/bjsxt/zookeeper/data/myid
g) 将/opt/zookeeper-3.4.6通过网络拷贝到node2、node3上
scp -r zookeeper-3.4.6/ node2:/opt
scp -r zookeeper-3.4.6/ node3:/opt
h) 在node2和node3上分别创建/var/bjsxt/zookeeper/data目录,
并在该目录下放一个文件:myid
node2:
mkdir -p /var/bjsxt/zookeeper/data
echo 1 > /var/bjsxt/zookeeper/data/myid
node3:
mkdir -p /var/bjsxt/zookeeper/data
echo 2 > /var/bjsxt/zookeeper/data/myid
i) 启动zookeeper
zkServer.sh start
zkServer.sh start|stop|status
j) 关闭zookeeper
zkServer.sh stop
l) 连接zookeeper
m) 退出zkCli.sh命令
quit
2、hadoop配置
core-site.xml
fs.defaultFS
hdfs://mycluster
hadoop.tmp.dir
/var/bjsxt/hadoop/ha
ha.zookeeper.quorum
node2:2181,node3:2181,node4:2181
hdfs-site.xml
dfs.replication
2
dfs.nameservices
mycluster
dfs.ha.namenodes.mycluster
nn1,nn2
dfs.namenode.rpc-address.mycluster.nn1
node1:8020
dfs.namenode.rpc-address.mycluster.nn2
node2:8020
dfs.namenode.shared.edits.dir
qjournal://node1:8485;node2:8485;node3:8485/mycluster
<!-- 指定客户端查找active的namenode的策略:
会给所有namenode发请求,以决定哪个是active的 -->
dfs.client.failover.proxy.provider.mycluster
org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
dfs.ha.fencing.methods
sshfence
dfs.ha.fencing.ssh.private-key-files
/root/.ssh/id_dsa
dfs.journalnode.edits.dir
/var/bjsxt/hadoop/ha/jnn
dfs.ha.automatic-failover.enabled
true
3、启动ha的hadoop
a) 在node1\node2\node3上启动三台journalnode
hadoop-daemon.sh start journalnode
b) 任意选择node1或者node2,格式化HDFS
hdfs namenode -format
格式化后,启动namenode进程
hadoop-daemon.sh start namenode
c) 在另一台node2或者node1上同步元数据
hdfs namenode -bootstrapStandby
d) 初始化zookeeper上的内容
hdfs zkfc -formatZK
e) 启动hadoop集群,可在node1到node4这四台服务器上任意位置执行
4、zookeeper操作
在node2或者node3或者node4上运行
ls /hadoop-ha/mycluster 查看临时文件
get /hadoop-ha/mycluster/ActiveStandbyElectorLock 查看临时文件的内容
quit
5、停止集群:
首先
其次,停止zookeeper集群
node2、node3、node4上执行:
zkServer.sh stop