Setting Up Hadoop NameNode High Availability

Hadoop2.0以后,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,本文使用JournalNode集群进行数据共享(这也是主流的做法)。如下图所示,便是JournalNode的架构图。
Setting Up Hadoop NameNode High Availability
两个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 环境介绍
本文的环境如下表所示:
Setting Up Hadoop NameNode High Availability
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 2017

hbase(main):001:0> status

ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
        at 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里定义了数据库的位置信息,如下图:
Setting Up Hadoop NameNode High Availability
而SDS定义了表的位置信息:
Setting Up Hadoop NameNode High Availability
如果以上两张表不做修改,则在对表进行操作的时候,会报如下错误:
Setting Up Hadoop NameNode High Availability
修改后的结果如下:
Setting Up Hadoop NameNode High Availability
查询验证:
Setting Up Hadoop NameNode High Availability

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值