规划原则:
➢ NameNode 和 SecondaryNameNode 不要安装在同⼀台服务器
➢ ResourceManager 也很消耗内存,不要和 NameNode、SecondaryNameNode 配置在同⼀台服务器

master

slave1

slave2

hdfs

namenode

namenode

datanode

datanode

datanode

yarn

datanode

datanode

datanode

nodemanager

nodemanager

nodemanager

各个组件功能
active nn:

  • 接收client的rpc的请求,同时自己的editlog文件写一份,
  • 也会向jn集群写一份
  • 也同时接收dn的heartbeat(心跳) blockreport(块报告)

standby nn:

  • 同时会接受到从jn集群的这份记录,使自己的元数据和active nn的元数据保持一致。
  • 这个动作叫做 【重演】,说白了 就是active nn的一个实时热备份。
  • 一旦standby切换为active状态,就能够立即马上对外提供服务。
    JournalNode jn集群:
  • 用于active standby nn同步数据的,
  • 本身由jn节点组成,至少3台 2n+1 保证高可用

zkfc:

  • 监控nn的健康状态
  • 向zk集群定期的发送心跳 让自己被选举上,
  • 当被zk选举为active时,zkfc通过rpc协议调用让nn状态转换为nn active

dn:

  • 同时向两个NN发送 心跳 块报告

1.配置namenode节点和备份节点

vim /hadoop/hadoop-3.2.2/etc/hadoop/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>
<!--指定集群的namenode节点远程通信地址-->
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>master:9000</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>slave1:9000</value>
</property>

<!--指定集群的namenode节点http请求地址-->
<property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>master:50070</value>
</property>
<property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>slave1:50070</value>
</property>
<!--指定集群的namenode节点edits⽂件存放路径-->
<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>

<!--配置节点隔离级别,同⼀时刻只能有⼀个namenode提供服务-->
<property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
</property>
<!--journalnode存放路径-->
<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/hadoop/hadoop/jn</value>
</property>
<!--关闭权限-->
<property>
    <name>dfs.permissions.enabled</name>
    <value>false</value>
</property>

<!--⾃动切换的代理类-->
<property>
    <name>dfs.client.failover.proxy.provider.mycluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--⾃动故障转移的开关开启-->
<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>
<!--⽆密登录-->
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
    <name>dfs.namenode.name.dir</name>
    <value>/hadoop/dfs/namenode</value>
</property>
<property>
    <name>dfs.datanode.data.dir</name>
    <value>/hadoop/dfs/datanode</value>
</property>
<property>
    <name>dfs.replication</name>
    <value>2</value>
</property>
<property>
    <name>dfs.namenode.secondary.http-address</name>
    <value>slave2:9001</value>
</property>
<property>
    <name>dfs.permissions.superusergroup</name>
    <value>hadoop</value>
</property>

2.指定datanode和managernode节点

vim /hadoop/hadoop-3.2.2/etc/hadoop/workers
master slave1 slave2
修改后将⽂件分发到三台机器
注意: 三台机器需都配置公私钥
启动时在resourcemanager在的机器输⼊群起命令start-all.sh

集群节点分布如图

hadoop中jps命令 hadoop jn_高可用

3.安装zookeeper

下载,上传Zookeeper,建⽴软链接,配置环境变量:家⽬录下
的.bash_profile

export ZOOKEEPER_HOME=zookeeper家⽬录
export PATH=$PATH:$ZOOKEEPER_HOME/bin

配置完后让环境变量⽣效:source .bash_profile

  • 3.1. 在~/software/zookeeper⽬录下新建⼀个⽬录zkData
  • 3.2. 将zookeeper家⽬录下的conf⽬录下的zoo_sample.cfg更名为zoo.cfg
  • 3.3. 修改zoo.cfg的内容:
bash dataDir=zookeeper家⽬录/zkData 
server.1=master:2888:3888 
server.2=slave1:2888:3888 
server.3=slave2:2888:3888

(hadoop101…是主机名,也可以⽤主机IP地址,2888:服务器与leader之间通信的端口3888:选举端口 server.num,其中num是每个节点中的myid⽂件中的编号)

  • 3.4. 将Zookeeper .bash_profile同步到其他机器上
  • 3.5.在每个节点的zookeeper家⽬录下zkData中新建⼀个myid⽂件,每个节点id不同。
  • 3.6.在每台机器上启动zookeeper:zkServer.sh start启动zookeeper集群后会可以使⽤zkCli.sh登录客⼾端。
    Zookeeper集群中存在半数机制,即:在集群中运⾏zookeeper的节点占运⾏zookeeper总节点数的⼀半的时候后才会对外提供服务;

4.修改core-site.xml⽂件

<!-- 指定HDFS 的namenode的通信地址,这里默认为本地 -->
    <property>
        <name>fs.defaultFS</name>
        <!-- <value>hdfs://master:9000</value> -->
        <value>hdfs://mycluster</value>
    </property>
    <!-- 指定运⾏在zookeeper上的节点,以及通信端口-->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>
    <!-- 指定hadoop运行时产生文件的存储路径 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/hadoop/tmp</value>
    </property>

5.修改yarn-site.xml⽂件

<!-- 设置resourcemanager为master write by gleam 2021-02-18-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
        <value>org.apache.hadoop.mapred.ShuffleHandler</value>
    </property>
    <property>
        <name>yarn.resourcemanager.address</name>
        <value>slave2:8032</value>
    </property>
    <property>
        <name>yarn.resourcemanager.scheduler.address</name>
        <value>slave2:8030</value>
    </property>
    <property>
        <name>yarn.resourcemanager.resource-tracker.address</name>
        <value>slave2:8031</value>
    </property>
    <property>
        <name>yarn.resourcemanager.admin.address</name>
        <value>slave2:8033</value>
    </property>
    <property>
        <name>yarn.resourcemanager.webapp.address</name>
        <value>slave2:8088</value>
    </property>
    <!-- 设置yarn集群的内存分配方案 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>20480</value>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>2048</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
    </property>
        <!-- 开启日志聚合功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置聚合日志在hdfs上的保存时间 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
    <!-- 设置yarn历史服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://master:19888/jobhistory/logs</value>
    </property>
    <!-- 关闭yarn内存检查 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>

6.执行以下步骤
分布core-site.xml,hdfs-site.xml,yarn-site.xml⽂件到其他机器
假设nn1上和nn2上有namenode

  1. 将每个节点上的data,和logs⽂件夹删除
  2. 启动journalnode(此时data和logs⽂件夹会出现)
  3. 在nn1上格式化namenode:hdfs namenode -format
  4. 在nn1上启动namenode:hadoop-daemon.sh start
    namenode
  5. 在nn2上主动拉取nn1上的元数据:hdfs namenode-bootstrapStandby
  6. 在nn2上启动namenode:hadoop-daemon.sh start namenode
  7. 将两个namenode停⽌
  8. 启动zookeeper集群:zkServer.sh start
  9. 在有namenode的节点上初始化zk集群:hdfs zkfc -formatZK(在zk集群上创建出hadoop⾼可⽤节点)
  10. 启动hadoop集群(在ResourceManager节点上):start-all.sh

7.每台机器执行jps查看节点是否启动,如果未启动,查看日志文件,按日志报错解决问题

hadoop中jps命令 hadoop jn_高可用_02


正常启动后节点分布如下

hadoop中jps命令 hadoop jn_hadoop_03