bingmous

欢迎交流,不吝赐教~

导航

Hadoop - HA学习笔记

Hadoop HA概述

工作要点

  • 通过双NameNode消除单点故障
  • 元数据管理方式需要改变:内存中各自保存一份元数据;Edits 日志只有 Active 状态的NameNode节点可以做写操作;两个
    NameNode都可以读取 Edits;共享的Edits放在一个共享存储中管理(qjournal 和 NFS 两个主流实现);
  • 需要一个状态管理功能模块:实现了一个zkfailover ,常驻在每一个 NameNode 所在的节点,每一个 zkfailover 负责监
    控自己所在NameNode节点,利用 zk 进行状态标识,当需要进行状态切换时,由 zkfailover来负责切换,切换时需要防止 brain split 现象的发生。
  • 必须保证两个 NameNode 之间能够 ssh 无密码登录;
  • 隔离(Fence),即同一时刻仅仅有一个 NameNode 对外提供服务

HDSF HA自动故障转移机制

  • 使用两个新组件:ZooKeeper,ZKFailoverController(zkfc)进程
  • HA依赖于ZooKeeper的以下功能:
    • Failure detection,故障检测:集群中的每个 NameNode 在 ZooKe eper 中维护了一个持久会话,如果机器崩溃, ZooKeeper 中的会话将终止, ZooKeeper 通知另一个 NameNode 需要触发故障转移。
    • Active NameNode election,现役NameNode选择:ZooKeeper 提供了一个简单的机制用于唯一的选择一个节点为 active 状态。如果目前现役 NameNode 崩溃,另一个节点可能从 ZooKeeper 获得特殊的排外锁以表明它应该成为现役 NameNode。
  • zkfc是ZooKeeper的客户端,监视和管理NameNode的状态,每个NameNode运行一个akfc进程,负责:
    • Health monitoring,健康检测:使用一个健康检测命令定期的ping与与之在相同主机的NameNode,只要NameNode及时的回复健康状态,zkfc则认为改节点是健康的,认为该节点是健康的。如果该节点崩溃,冻结或进入不健康状态,健康监测器标识该节点为非健康的。
    • ZooKeeper session management ,ZooKeeper会话管理:当本地 NameNode是健康的, ZKFC保持一个在 ZooKeeper中打开的会话。如果本地 NameNode 处于 active 状态, ZKFC也保持一个特殊的 znode 锁,该锁使用了 ZooKeeper 对短暂 节点的支持,如果会话终止,锁节点将自动删除。
    • ZooKeeper-based election,基于 ZooKeeper 的选择: 如果本地 NameNode 是健康的,且 ZKFC 发现没有其它的
      节点当前持有 znode 锁,它将为自己获取该锁。如果成功,则它已经赢得了选择,并负责运行故障转移进程以使它的本地 NameNode 为 A ctive 。故障转移 进程 与前面描述的手动故障转移相似,首先如果必要保护之前的现役 NameNode ,然后本地 NameNode 转换为 Active 状态。

HDFS HA配置

集群规划

localhost102localhost103localhost104
NameNodeNameNode 
JournalNodeJournalNodeJournalNode
DataNodeDataNodeDataNode
ZKZKZK
ResourceManagerResourceManager 
NodeManagerNodeManagerNodeManager

配置ZooKeeper集群

  • 解压,创建zkData目录,添加myid文件
  • 修改conf/zoo.cfg,添加集群信息server.A=B:C:D,A是节点myid,B是主机名,C是通信端口2888,D是选举端口3888
  • 启动集群:bin/zkServer.sh start,启动客户端:bin/zkCli.sh

配置HDFS HA集群(手动故障转移)

  • 配置core-site.xml
 <!-- 把两个NameNode的地址组装成一个集群mycluster -->
 <property>
         <name>fs.defaultFS</name>
         <value>hdfs://mycluster</value>
 </property>

 <!-- 指定Hadoop 运行时产生文件的存储目录-->
 <property>
         <name>hadoop.tmp.dir</name>
         <value>/opt/module/HA/hadoop-2.7.2/data/tmp</value>
 </property>

 <!-- 声明journalnode服务器存储目录-->
 <property>
         <name>dfs.journalnode.edits.dir</name>
         <value>/opt/module/HA/hadoop-2.7.2/data/tmp/jn</value>
 </property>
  • 配置hdfs-site.xml
<!-- 完全分布式集群名称-->
<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>localhost102:8020</value>
</property>

<!-- nn2的RPC通信地址 -->
<property>
        <name>dfs.namenode.rpc-address.mycluster.nn2</name>
        <value>localhost103:8020</value>
</property>

<!-- nn1的http通信地址 -->
<property>
        <name>dfs.namenode.http-address.mycluster.nn1</name>
        <value>localhost102:50070</value>
</property>

<!-- nn2的http通信地址 -->
<property>
        <name>dfs.namenode.http-address.mycluster.nn2</name>
        <value>localhost103:50070</value>
</property>

<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
        <name>dfs.namenode.shared.edits.dir</name>
                 <value>qjournal://localhost102:8485;localhost103:8485;localhost104:8485/mycluster</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>

<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
</property>

<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/shun/.ssh/id_rsa</value>
</property>

<!-- 关闭权限检查-->
<property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
</property>
  • 启动所有的JournalNode:sbin/hadoop-daemons.sh start journalnodes
  • 在nn1上格式化并启动:bin/hdfs namenode -format,启动sbin/hadoop-daemon.sh start namenode
  • 在nn2上同步nn1的信息并启动:bin/hdfs namenode -bootstrapStandby,启动:sbin/hadoop-daemon.sh start namenode
  • 将nn1或nn2切换成Active状态:启动所有DataNode:sbin/hadoop-daemons.sh start datanode,切换为Active:bin/hdfs haadmin -transitionToActive nn1,查看状态:bin/hdfs haadmin -getServiceState nn1

配置HDFS HA自动故障转移

  • 关闭所有HDFS服务:sbin/stop-dfs.sh
  • 启动ZooKeeper集群:ZooKeeper目录下:bin/zkServer.sh start
  • 配置core-site.xml,ZK地址
 <!-- 声明ZooKeeper集群地址-->
 <property>
         <name>ha.zookeeper.quorum</name>
         <value>localhost102:2181,localhost103:2181,localhost104:2181</value>
 </property>
  • 配置hdfs-site.xml,开启自动故障转移
<!--开启自动故障转移-->
<property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
</property>
  • 初始化HA在ZK中的状态:bin/hdfs zkfc -formatZK
  • 启动HDFS服务:sbin/start-dfs.sh

注意:第一次使用集群时,必须先不打开自动故障转移;启动所有的JournalNode,格式化其中一个NameNode,然后启动,再在另一个NameNode上同步前一个NameNode的信息,开启这个NameNode。然后关闭所有HDFS服务,配置ZK地址、开启自动故障转移,再格式化zkfc,开启所有HDFS服务即可。

nn1和nn2的端口可以是1版本的8020,也可以是9000

YARN HA配置

  • 工作机制

  • 配置yarn-site.xml,启用HA,声明集群名,两个rm的命名,声明两个rm的地址,ZK地址
<!-- Reducer 获取数据的方式-->
<property>
	<name>yarn.nodemanager.aux-services</name>
	<value>mapreduce_shuffle</value>
</property>

<!-- 日志聚集功能使能-->
<property>
	<name>yarn.log-aggregation-enable</name>
	<value>true</value>
</property>

<!-- 日志保留时间设置7 天-->
<property>
	<name>yarn.log-aggregation.retain-seconds</name>
	<value>604800</value>
</property>

<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>localhost102</value>
</property>

<property>
    <name>yarn.resourcemanager.hostname.rm2</name>
    <value>localhost103</value>
</property>

<!--指定zookeeper集群的地址-->
<property>
    <name>yarn.resourcemanager.zk-address</name>
    <value>localhost102:2181,localhost103:2181,localhost104:2181</value>
</property>
  • 在rm1上开启所有YARN服务:sbin/start-yarn.sh(不会开启rm2的resourcemanager)
  • 在rm2上开启resourcemanager:sbin/yarn-daemon.sh start resourcemanager

注意:

sbin/start-yarn.sh只开启本地的resourcemanager和所有的nodemanager,需要在两一个节点开启resourcemanager;

sbin/start-hdfs.sh开启所有节点的DataNode、NameNode、JournalNode、zkfc;

开启/关闭所有节点的单个HDFS进程:sbin/hadoop-daemons.sh start/stop namenode/datanode/journalnode/zkfc

开启/关闭所有节点的单个YARN进程:sbin/yarn-daemons.sh start/stop resourcemanager/nodemanager

单节点启动:sbin/hadoop-daemon.sh,sbin/yarn-daemon.sh

 

 

 

 

 

posted on 2020-07-17 19:49  Bingmous  阅读(56)  评论(0编辑  收藏  举报