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配置

集群规划

localhost102 localhost103 localhost104
NameNode NameNode  
JournalNode JournalNode JournalNode
DataNode DataNode DataNode
ZK ZK ZK
ResourceManager ResourceManager  
NodeManager NodeManager NodeManager

配置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

Hadoop - HA学习笔记的更多相关文章

  1. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  2. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  3. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  4. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

  5. Hadoop入门学习笔记(一)

    Week2 学习笔记 Hadoop核心组件 Hadoop HDFS(分布式文件存储系统):解决海量数据存储 Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度 Hadoop Map ...

  6. Hadoop概括——学习笔记<一>

    之前有幸在MOOC学院抽中小象学院hadoop体验课. 这是小象学院hadoop2.X概述第一章的笔记 第一章主要讲的是hadoop基础知识.老师讲的还是比较全面简单的,起码作为一个非专业码农以及数据 ...

  7. 智传播客hadoop视频学习笔记(共2天)

    第一天:1.答疑解惑•  就业前景•  学习hadoop要有什么基础•  hadoop会像塞班一样,热一阵子吗•  hadoop学习起来容易还是困难•  课堂上的学习方法(所有实验必须按照要求做,重原 ...

  8. Hadoop入门学习笔记总结系列文章导航

    一.为何要学习Hadoop? 这是一个信息爆炸的时代.经过数十年的积累,很多企业都聚集了大量的数据.这些数据也是企业的核心财富之一,怎样从累积的数据里寻找价值,变废为宝炼数成金成为当务之急.但数据增长 ...

  9. Hadoop概括——学习笔记<一>转

    前言 第一章主要讲的是hadoop基础知识.老师讲的还是比较全面简单的,起码作为一个非专业码农以及数据库管理人员,也能狗大致了解其特点 首先是概括图(以hadoop2.0为例)  一.Hadoop基础 ...

随机推荐

  1. logrotate 日志切割

    logrotate是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用. 配置文件 Linux系统默认安装logrotate工具,它默认 ...

  2. 2022年写的香橙派 OrangePi Zero 用python获取dht11温度和湿度

    感谢网上资料和个人的不放弃,终于方便的解决了香橙派 OrangePi Zero用python获取dht11温湿度的问题. 网上关于香橙派的资料比起树莓派真是少之又少,现在香橙派zero能干的活暂时也只 ...

  3. Java枚举-通过值查找对应的枚举

    一.背景 Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等. 最近工作中,对接了很多其他的系统,发现对接的同一个系统 ...

  4. makefile 编译多个目标

    1.静态库libtools.a源码 libtools.h #ifndef tools_h_ #define tools_h_ int sub(int x,int y); int mul(int x,i ...

  5. Codeforces Round #746 Div. 2

    掉分快乐qwq C题代码以及分析(在注释里) /* * @Author: Nan97 * @Date: 2021-10-04 22:37:18 * @Last Modified by: Nan97 * ...

  6. dotnet 替换 ASP.NET Core 的底层通讯为命名管道的 IPC 库

    这是一个用于本机多进程进行 IPC 通讯的库,此库的顶层 API 是采用 ASP.NET Core 的 MVC 框架,其底层通讯不是传统的走网络的方式,而是通过 dotnetCampus.Ipc 开源 ...

  7. ARC-124 部分题解

    E 直接统计原式不好做,注意到首先我们应该知道怎样的 \(x\) 序列是合法的,那么不妨首先来统计一下合法的 \(x\) 序列数量. 令 \(b_i\) 为 \(i\) 向右给的球数,那么有(\(i ...

  8. Servlet Servlet的装载三种情况

    感谢原文作者:DaleyDC 原文链接:https://blog.csdn.net/sinat_32873711/article/details/53170342 Servlet的装载三种情况: 自动 ...

  9. Plist存储

  10. win8.1/2012R2上面安装flash debugger

    1.开启windows桌面体验 a. Launch Power Shell b. Run command "add-WindowsFeature Desktop-Experience&quo ...