大数据学习第7天:

本文深入探讨HDFS2.x版本中解决单点故障和内存受限问题的高可用(HA)与联邦(Federation)机制。HA通过主备NameNode确保服务连续性,而Federation支持多个NameNode进行水平扩展,分散元数据存储与管理。文章还详细介绍了HDFS命令操作、HA原理及实战搭建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大数据学习第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共享:

  1. 使用NFS共享edit log(存储在NAS/SAN)
  2. 使用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状态。

  1. 实战:HDFS的高可用。注意记录笔记。

    1. 注意观察一个命令执行之后是否有error。

    2. 任何一个节点启动不了。需要查看该节点的日志。 日志在hadoop的目录下面logs目录里面。

    3. 注意的问题1 :每台机器必须有不同的主机名。每台机器必须配置hosts

    4. 注意的问题2:每台机器上到底有什么节点。

      node1node2node3node4
      NNNN
      JNJNJN
      DNDNDN
      ZKZKZK
      ZKFCZKFC

    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

zkCli.sh

​ 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这四台服务器上任意位置执行

start-dfs.sh

4、zookeeper操作

​ 在node2或者node3或者node4上运行

zkCli.sh

​ ls /hadoop-ha/mycluster 查看临时文件

​ get /hadoop-ha/mycluster/ActiveStandbyElectorLock 查看临时文件的内容

退出zkCli.sh

​ quit

5、停止集群:

​ 首先

stop-dfs.sh

​ 其次,停止zookeeper集群

​ node2、node3、node4上执行:

zkServer.sh stop

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值