hadoop高可用分为NameNode高可用 、ResourceManager高可用

NameNode 高可用:

1.先建集群

2.实现免密登录  

ssh-keygen -t rsa 
ssh-copy-id xxxx

3.安装psmisc

xcall   yum install -y psmisc

4.修改配置文件core-site.xml  hdfs-site.xml  

core-site.xml 

<configuration>
  
  <!--hdfs集群的文件位置-->
  <property>
		<name>hadoop.tmp.dir</name>
		<value>/opt/installs/hadoop3.1.4/data</value>
	</property>
  <!--hdfs入口,设置虚拟地址,具体地址后面配置-->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://hdfs-cluster</value>
  </property>
  <!--hdfs要访问zookeeper集群-->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>hadoop11:2181,hadoop12:2181,hadoop13:2181</value>
  </property>
</configuration>

 hdfs-site.xml  

<configuration>
    <!-- 副本数 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 定义hdfs入口的命名服务 -->
    <property>
        <name>dfs.nameservices</name>
        <value>hdfs-cluster</value>    跟你core-site 写的一致
    </property>
    <!-- 定义hdfs入口的命名服务下虚拟ip-->
    <property>
        <name>dfs.ha.namenodes.hdfs-cluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- 虚拟ip地址1 RPC入口 -->
    <property>
        <name>dfs.namenode.rpc-address.hdfs-cluster.nn1</name>
        <value>hadoop11:8020</value>
    </property>
    <!-- 虚拟ip地址1 HTTP入口 -->
    <property>
        <name>dfs.namenode.http-address.hdfs-cluster.nn1</name>
        <value>hadoop11:9870</value>
    </property>
    <!-- 虚拟ip地址2 PRC入口 -->
    <property>
        <name>dfs.namenode.rpc-address.hdfs-cluster.nn2</name>
        <value>hadoop12:8020</value>
    </property>
    <!-- 虚拟ip地址1 HTTP入口 -->
    <property>
        <name>dfs.namenode.http-address.hdfs-cluster.nn2</name>
        <value>hadoop12:9870</value>
    </property>
    
    <!-- 定义QJN在linux中保存文件磁盘目录 -->
    <property>
        <!-- Journal Edit Files 的存储目录:() -->
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/installs/journalnode/data/</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop11:8485;hadoop12:8485;hadoop13:8485/hdfs-cluster</value>
    </property>
    
    
    <!-- 是否开启故障切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
    
    
    <!-- 基于zookeeper的故障切换的代码类 -->
    <property>
        <name>dfs.client.failover.proxy.provider.hdfs-cluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    
    
    <!-- 远程杀死namenode方式(防止namenode假死,导致双主出现) -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <!-- 指定私钥的文件目录,使用免密登录杀死NN进程 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>

    <!-- 可以在hdfs上点击结果查看-->
    <property>
      <name>dfs.webhdfs.enabled</name>
      <value>true</value>
    </property>

  <!--	关闭 启动时权限检查  -->
	<property>
		<name>dfs.permissions.enabled</name>
		<value>false</value>
		<description>如果为"true",则在HDFS中启用权限检查;如果为"false",则关闭权限检查;默认值为"true"。</description>
 	</property>
</configuration>

5.启动服务,初始化

1、启动zookeeper
zk.sh start
2. 初始化ZKFC在zk中的Znode信息【第一次启动需要做】在hadoop11上进行即可
hdfs zkfc -formatZK
3、在三台服务器上启动jn【journalnode 主要用于存储namenode的元数据】
xcall hdfs --daemon start journalnode,否则报8345
这个为什么在这个时候启动,原因是第四步格式化的时候,需要用到journalnode,否则报8485连接超时的问题,格式化会失败的。
4、对集群进行namenode的格式化
hdfs namenode -format
5、启动hdfs
start-dfs.sh
这个服务默认会启动journalnode,但是由于你之前已经单独启动过了,所以启动它会报三个警告,可以忽略,无所谓。
6、启动第二个namenode
需要在hadoop12上运行:
第一次需要运行如下命令,以后不需要:
hdfs namenode -bootstrapStandby
接着,启动第二个namenode:
hdfs --daemon start namenode

本身集群是可以启动两个namenode的,但是由于第一次启动的话,hadoop12上没有格式化,所以无法启动,第二次就不需要了。

至此为止NameNode高可用搭建完毕

常见搭建遇见的错误

拒绝连接:解决步骤 1.启动zookeeper 删除生成的文件

                                   2.删除生成logs和放数据的文件夹 

                                   3.重新在执行5

更多推荐