Hadoop2.0以后,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,本文使用JournalNode集群进行数据共享(这也是主流的做法)。如下图所示,便是JournalNode的架构图。

两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了。
对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失数据,或者产生错误的结果。为了保证这点,这就需要利用使用ZooKeeper了。首先HDFS集群中的两个NameNode都在ZooKeeper中注册,当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态。
一、NameNode HA搭建
1.1 环境介绍
本文的环境如下表所示:

1.2 环境设置
针对hadoop集群环境需要设置SSH免密码登录以及安装JDK。在搭建hadoop集群的时候,已经设置了,这里直接省略.....
1.3 Zookeeper集群搭建
请参考我的博客链接:Configuring Zookeeper Cluster
1.4 编辑core-site.xml,追加以下内容

<!--修改HDFS的Nameservice为NNcluster--><property><name>fs.defaultFS</name><value>hdfs://NNcluster</value></property>
<!--指定Zookeeper地址--><property>  <name>ha.zookeeper.quorum</name>  <value>hdp01:2181,hdp02:2181,hdp03:2181,hdp04:2181</value>  </property> 

1.5 编辑hdfs-site.xml,追加以下内容

<!-- Configure NameNode High Availability. -->
<!-- 指定nameservices名称(这个要和core-site.xml文件中的值相同) --><property><name>dfs.nameservices</name><value>NNcluster</value></property>
<!--启用NameNode故障时自动切换--><property>  <name>dfs.ha.automatic-failover.enabled</name>  <value>true</value>  </property>
<!--NNcluster下面有两个NameNode,分别是nn1,nn2--><property><name>dfs.ha.namenodes.NNcluster</name><value>nn1,nn2</value></property>
<!--nn1对应hdp01--><property>  <name>dfs.namenode.rpc-address.ns.nn1</name>  <value>hdp01:9000</value>  </property>
<!--nn2对应hdp02--><property>  <name>dfs.namenode.rpc-address.ns.nn2</name>  <value>hdp02:9000</value>  </property><property><name>dfs.namenode.rpc-address.NNcluster.nn1</name><value>hdp01:8020</value></property><property><name>dfs.namenode.rpc-address.NNcluster.nn2</name><value>hdp02:8020</value></property><property><name>dfs.namenode.http-address.NNcluster.nn1</name><value>hdp01:50070</value></property><property><name>dfs.namenode.http-address.NNcluster.nn2</name><value>hdp02:50070</value></property>
<!--指定NameNode的元数据在JournalNode上的存放位置,一般JournalNode为奇数个,这里配置不合理--><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://hdp01:8485;hdp02:8485;hdp03:8485;hdp04:8485/NNcluster</value></property>
<!-- 配置失败自动切换实现方式 --><property><name>dfs.client.failover.proxy.provider.NNcluster</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/hadoop/.ssh/id_rsa</value></property>

如果要启用NameNode的自动切换特性,必须配置oozie high availability,只需在oozie-env.sh里定义OOZIE_HTTP_HOSTNAME即可。这个名称对应的IP必须是可漂移的IP。

1.6 同步文件☞其他节点

[hadoop@hdp01 hadoop]$ for i in {2..4};do scp hdfs-site.xml* hdp0$i:/u01/hadoop/etc/hadoop;done
[hadoop@hdp01 hadoop]$ for i in {2..4};do scp core-site.xml hdp0$i:/u01/hadoop/etc/hadoop;done

二、启动服务
2.1 启动JournalNode服务
现在主节点启动,然后在其他节点启动:

[hadoop@hdp01 hadoop]$ for i in {1..4};do ssh hdp0$i 'source .bash_profile;hadoop-daemon.sh start journalnode';done
starting journalnode, logging to /u01/hadoop/logs/hadoop-hadoop-journalnode-hdp01.out
starting journalnode, logging to /u01/hadoop/logs/hadoop-hadoop-journalnode-hdp02.out
starting journalnode, logging to /u01/hadoop/logs/hadoop-hadoop-journalnode-hdp03.out
starting journalnode, logging to /u01/hadoop/logs/hadoop-hadoop-journalnode-hdp04.out

2.2 初始化JournalNodes
分别在各个节点执行以下命令:

[hadoop@hdp01 hadoop]$ for i in {1..4};do ssh hdp$i 'source .bash_profile;hdfs namenode -initializeSharedEdits -force';done

如果不想在交互模式下执行上述命令,就加-force和-nonInteractive参数即可。
2.3 初始化ZooKeeper中的HA状态
这步只需在Master节点执行即可,如下:

[hadoop@hdp01 hadoop]$ hdfs zkfc -formatZK -force

启动zkfc服务:

[hadoop@hdp01 hadoop]$ hadoop-daemons.sh start zkfc

Standby节点启动namenode服务:

[hadoop@hdp02 ~]$ hdfs namenode -bootstrapStandby -force

2.4 重启hadoop集群(可选项)

[hadoop@hdp01 ~]$ stop-yarn.sh;stop-dfs.sh
[hadoop@hdp01 ~]$ start-dfs.sh;start-yarn.sh

2.5 节点状态验证

[hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn1
active
[hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn2
standby

三、测试NameNode HA的高可用性
如2.5看到的,nn1状态为active,nn2状态为standby,停止nn1的namenode服务,看是否可以自动切换,如下:

[hadoop@hdp01 ~]$ hadoop-daemon.sh stop namenode
stopping namenode
[hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn1
18/01/03 11:30:36 INFO ipc.Client: Retrying connect to server: hdp01/192.168.120.96:8020. Already tried 0 time(s); retry policy is RetryUpToMaximumCountWithFixedSleep(maxRetries=1, sleepTime=1000 MILLISECONDS)
Operation failed: Call From hdp01/192.168.120.96 to hdp01:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see:  http://wiki.apache.org/hadoop/ConnectionRefused
[hadoop@hdp01 ~]$ hdfs dfs -ls /
Found 6 items
drwxr-xr-x   - hadoop supergroup          0 2017-12-27 10:27 /hbase
drwxrwxrwt   - hadoop hadoop              0 2017-12-21 15:04 /logs
drwxrwx---   - hadoop supergroup          0 2017-12-21 15:03 /mr-history
drwxr-xr-x   - hadoop supergroup          0 2017-12-11 19:56 /spark
drwxrwxrwx   - hadoop supergroup          0 2017-12-26 11:41 /tmp
drwxr-xr-x   - hadoop supergroup          0 2017-12-26 11:05 /user

经验证可以正常使用。开启nn1的namenode服务,如下:

[hadoop@hdp01 ~]$ hadoop-daemon.sh start namenode
starting namenode, logging to /u01/hadoop/logs/hadoop-hadoop-namenode-hdp01.out
[hadoop@hdp01 ~]$ hdfs haadmin -getServiceState nn1
standby

四、应用配置
4.1 Hbase设置
修改hbase-site.xml中的hbase.rootdir,如下:

--修改前:<property><name>hbase.rootdir</name><value>hdfs://hdp01:9000/hbase</value></property>
--修改后:<property><name>hbase.rootdir</name><value>hdfs://NNcluster/hbase</value></property>

链接hadoop的配置文件☞hbase的conf目录下:

--如果HBase HA模式,主备节点以及regionservers节点都要做如下链接
[hadoop@hdp01 ~]$ ln -s /u01/hadoop/etc/hadoop/hdfs-site.xml /u01/hbase/conf/hdfs-site.xml
[hadoop@hdp01 ~]$ ln -s /u01/hadoop/etc/hadoop/core-site.xml /u01/hbase/conf/core-site.xml

如果不做上述链接,则在启动hbase的过程会报错(虽然启动成功,但有些操作不能执行),而且regionservers也会启动失败。报错信息如下:

[hadoop@hdp01 conf]$ hbase shell
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.3.1, r930b9a55528fe45d8edce7af42fef2d35e77677a, Thu Apr  6 19:36:54 PDT 2017hbase(main):001:0> statusERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializingat org.apache.hadoop.hbase.master.HMaster.checkInitialized(HMaster.java:2452)at org.apache.hadoop.hbase.master.MasterRpcServices.getClusterStatus(MasterRpcServices.java:792)at org.apache.hadoop.hbase.protobuf.generated.MasterProtos$MasterService$2.callBlockingMethod(MasterProtos.java:58519)at org.apache.hadoop.hbase.ipc.RpcServer.call(RpcServer.java:2339)at org.apache.hadoop.hbase.ipc.CallRunner.run(CallRunner.java:123)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:188)at org.apache.hadoop.hbase.ipc.RpcExecutor$Handler.run(RpcExecutor.java:168)

正常的执行结果如下:

hbase(main):001:0> status
1 active master, 1 backup masters, 3 servers, 0 dead, 0.6667 average load

4.2 Hive设置
编辑hive-site.xml文件,修改如下内容:

--变更前<property><name>hive.metastore.warehouse.dir</name><value>hdfs://hdp01:9000/user/hive/warehouse</value><description>location of default database for the warehouse</description></property>
--变更后<property><name>hive.metastore.warehouse.dir</name><value>hdfs://NNcluster/user/hive/warehouse</value><description>location of default database for the warehouse</description></property>

Hive的元数据库修改:
主要修改两张表:DBS和SDS。
其中DBS里定义了数据库的位置信息,如下图:

而SDS定义了表的位置信息:

如果以上两张表不做修改,则在对表进行操作的时候,会报如下错误:

修改后的结果如下:

查询验证:

转载于:https://blog.51cto.com/candon123/2057016

Setting Up Hadoop NameNode High Availability相关推荐

  1. hadoop namenode ha方案

    Hadoop 2.0 NameNode HA和Federation实践 Posted on 2012/12/10 一.背景 天云趋势在2012年下半年开始为某大型国有银行的历史交易数据备份及查询提供基 ...

  2. hadoop namenode启动不了_集群版hadoop安装,写给大忙人看的

    导语 如果之前的单机版hadoop环境安装满足不了你,集群版hadoop一定合你胃口,轻松入手. 目录 集群规划 前置条件 配置免密登录 3.1 生成密匙 3.2 免密登录 3.3 验证免密登录 集群 ...

  3. Hadoop Namenode不能启动

    自己在虚拟机上建立伪分布环境,第一天还一切正常,后来发现每次重新开机以后都不能正常启动,在start-dfs.sh之后jps一下发现namenode不能正常启动,按提示找到logs目录下namenod ...

  4. Hadoop namenode无法启动问题解决

    Hadoop namenode无法启动问题解决 参考文章: (1)Hadoop namenode无法启动问题解决 (2)https://www.cnblogs.com/unflynaomi/p/447 ...

  5. Hadoop Namenode元数据文件 Fsimage、editlog、seen_txid说明

    Hadoop NameNode元数据的$dfs.namenode.name.dir/current/文件夹有几个文件: current/ 2|-- VERSION 3|-- edits_* 4|-- ...

  6. 大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

    目录 一.问题源起 二.HDFS优雅的解决方案 (1)分段加锁机制 + 内存双缓冲机制 (2)多线程并发吞吐量的百倍优化 (3)缓冲数据批量刷磁盘 + 网络的优化 四.总结 五.参考文章 一.问题源起 ...

  7. hadoop namenode启动不了_Hadoop框架:HDFS高可用环境配置

    一.HDFS高可用 1.基础描述 在单点或者少数节点故障的情况下,集群还可以正常的提供服务,HDFS高可用机制可以通过配置Active/Standby两个NameNodes节点实现在集群中对NameN ...

  8. hadoop NameNode HA 和ResouceManager HA

    官网配置地址: HDFS HA : http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSHighAvai ...

  9. Hadoop namenode启动瓶颈分析

    转载:http://blog.csdn.net/AE86_FC/archive/2010/08/26/5842020.aspx NameNode启动过程详细剖析 NameNode中几个关键的数据结构 ...

最新文章

  1. IT 需要知道的一些专业名词和解释 (长期更新)
  2. python面对对象汉诺塔_如何使用python实现的汉诺塔的小程序
  3. 转https_免费!这个PPT转PDF的方法不学可惜!
  4. CBT的完整形式是什么?
  5. 机器学习速成课程 | 练习 | Google Development——编程练习:创建和操控张量
  6. python中typeerror是什么意思_TypeError:在Python中
  7. VisualBox安装Ubuntu18.04后续操作:换源、IP、LAMP、phpmyadmin
  8. Chrome 开发者工具(DevTools)中所有快捷方式列表
  9. 组合,聚合,关联,依赖 的区别
  10. python怎么用散点图_怎么用Python画散点图
  11. php前台切图,php网页切图/js切图
  12. CICD实战——使用Jenkins实现自动化部署和环境隔离
  13. 对话MVP丨腾讯崔冉的十年“技术马拉松”
  14. 明港镇计算机培训班,平桥区建筑工匠培训班在明港新集村开班
  15. 1.2样本空间和随机事件
  16. sql server时间格式
  17. Spark系列之SparkSubmit提交任务到YARN
  18. WIN10系统休眠文件与保留存储
  19. 制造费用分配方法(一)
  20. PS工作区拖动乱了如何复位?

热门文章

  1. (剑指Offer)面试题19:二叉树的镜像
  2. 使用stsadm命令部署和激活webpart解决方案
  3. xslt中的Javascript取得xml中的参数
  4. Python开发【第十二篇】:DOM
  5. nginx负载均衡高可用
  6. 转 Java的各种打包方式(JAR/WAR/EAR/CAR)
  7. Java SPI机制分析
  8. 目录:SpringBoot学习目录
  9. 数据结构之堆的插入、取值、排序(细致讲解+图片演示)
  10. python判断字符串