Hadoop集群部署


Hadoop集群部署

网ip 内网ip 安装的服务
36.111.36.* 192.168.0.8 NameNode、DFSZKFailoverController、ResourceManager、Zookeeper
36.111.36.* 192.168.0.9 NameNode、DFSZKFailoverController、ResourceManager、Zookeeper
192.168.0.2 DataNode、NodeManager、JournalNode、Zookeeper
192.168.0.3 DataNode、NodeManager、JournalNode、Zookeeper
192.168.0.4 DataNode、NodeManager、JournalNode、Zookeeper
192.168.0.5 DataNode、NodeManager、JournalNode、Zookeeper
192.168.0.6 DataNode、NodeManager、JournalNode、Zookeeper

准备工作

配置/etc/hosts

  • master1
0.0.0.0 master1
36.111.36.177 master2
192.168.0.9 master3
192.168.0.2 slave1
192.168.0.3 slave2
192.168.0.4 slave3
192.168.0.5 slave4
192.168.0.6 slave5
  • master2
36.111.36.174 master1
0.0.0.0 master2
192.168.0.9 master3
192.168.0.2 slave1
192.168.0.3 slave2
192.168.0.4 slave3
192.168.0.5 slave4
192.168.0.6 slave5
  • slave*
192.168.0.8 master1
192.168.0.10 master2
192.168.0.9 master3
192.168.0.2 slave1
192.168.0.3 slave2
192.168.0.4 slave3
192.168.0.5 slave4
192.168.0.6 slave5

一. 前期配置


1.1 编写集群分发脚本xsync,集群处理脚本xcall

xsync集群分发 脚本

(1)需求:循环复制文件到所有节点的相同目录下

(2)需求分析

  • ①rsync命令原始拷贝:

    rsync -av /usr/local/yangguang/software root@hadoop103:/opt/`

  • ②期望脚本:

xsync要同步的文件名称

  • ③说明:在/bin这个目录下存放的脚本,用户可以在系统任何地方直接执行。

(3)脚本实现

①在用的家目录/home/root下创建bin文件夹

[atguigu@master1 ~]$ mkdir bin

②在/home/root/bin目录下创建xsync文件,以便全局调用

[atguigu@master1 ~]$ cd /home/root/bin

[atguigu@master1 ~]$ vim xsync

在该文件中编写如下代码

#!/bin/bash

#1. 判断参数个数

if [ $# -lt 1 ]

then

  echo Not Enough Arguement!

  exit;

fi

#2. 遍历集群所有机器

for host in master1 master2 slave1 slave2 slave3 slave4 slave5

do

  echo ====================  $host  ====================

  #3. 遍历所有目录,挨个发送

  for file in $@

  do

    #4 判断文件是否存在

    if [ -e $file ]

    then

      #5. 获取父目录

      pdir=$(cd -P $(dirname $file); pwd)

      #6. 获取当前文件的名称

      fname=$(basename $file)

      ssh $host "mkdir -p $pdir"

      rsync -av $pdir/$fname $host:$pdir

    else

      echo $file does not exists!

    fi

  done

done

③修改脚本xsync具有执行权限

[atguigu@master1 bin]$ chmod +x xsync

④测试脚本

[atguigu@master1 bin]$ xsync xsync

[atguigu@master1 bin]$ mv xsync /bin

  • xcall集群批量处理脚本

[atguigu@master1 bin]$ cd /bin

[atguigu@master1 bin]$ vim xcall

#!/bin/bash

# 获取控制台指令

cmd=$*

# 判断指令是否为空
if (( #$cmd -eq # ))
then 
    echo "command can not be null !"
    exit
fi

# 获取当前登录用户
user=`whoami`

# 在从机执行指令,这里需要根据你具体的集群情况配置,host与具体主机名一致
for (( host=2;host<=5;host++ ))
do
        echo "================current host is hadoop00$host================="
    echo "--> excute command \"$cmd\""
        ssh $user@hadoop00$host $cmd
done

echo "excute successfully !"

[atguigu@master1 bin]$ chmod +x xcall

1.2 SSH无密登录配置

说明:这里面只配置了master1、master2到其他主机的无密登录;因为master2,master1都要求对其他节点无密访问。

(1)master1上生成公钥和私钥:

[atguigu@master1 .ssh]$ ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

(2)将master1公钥拷贝到要免密登录的目标机器上

[atguigu@master1 .ssh]$ ssh-copy-id master1

[atguigu@master1 .ssh]$ ssh-copy-id master2

[atguigu@master1 .ssh]$ ssh-copy-id slave1

[atguigu@master1 .ssh]$ ssh-copy-id slave2

[atguigu@master1 .ssh]$ ssh-copy-id slave3

[atguigu@master1 .ssh]$ ssh-copy-id slave4

[atguigu@master1 .ssh]$ ssh-copy-id slave5

(3)master2上生成公钥和私钥:

[atguigu@master2 .ssh]$ ssh-keygen -t rsa

然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)

(4)将hadoop103公钥拷贝到要免密登录的目标机器上

[atguigu@master2 .ssh]$ ssh-copy-id master1

[atguigu@master2 .ssh]$ ssh-copy-id master2

[atguigu@master2 .ssh]$ ssh-copy-id slave1

[atguigu@master2 .ssh]$ ssh-copy-id slave2

[atguigu@master2 .ssh]$ ssh-copy-id slave3

[atguigu@master2 .ssh]$ ssh-copy-id slave4

[atguigu@master2 .ssh]$ ssh-copy-id slave5

1.3 JDK准备

1)卸载现有JDK

[atguigu@master1 opt]# xcall rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps

  • (1)rpm -qa:表示查询所有已经安装的软件包
  • (2)grep -i:表示过滤时不区分大小写
  • (3)xargs -n1:表示一次获取上次执行结果的一个值
  • (4)rpm -e –nodeps:表示卸载软件

2)用XShell工具将JDK导入到master2的/usr/local/yangguang/software 文件夹下面

img

3)在Linux系统下的software目录中查看软件包是否导入成功

[atguigu@master1 software]# ls /usr/local/yangguang/software /

看到如下结果:

jdk-8u212-linux-x64.tar.gz

4)解压JDK到/opt/module目录下

[atguigu@master1 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /usr/local/yangguang/software/

[atguigu@master1 module]$ mv jdk1.8.0_212/ jdk

5)配置JDK环境变量

  • (1)新建/etc/profile.d/my_env.sh文件

[atguigu@master1 module]# sudo vim /etc/profile.d/my_env.sh

添加如下内容,然后保存(:wq)退出

#JAVA_HOME

export JAVA_HOME=/usr/local/yangguang/software/jdk

export PATH=$PATH:$JAVA_HOME/bin
  • (2)让环境变量生效

[atguigu@master1 software]$ source /etc/profile.d/my_env.sh

6)测试JDK是否安装成功

[atguigu@master1 module]# java -version

如果能看到以下结果、则Java正常安装

java version "1.8.0_212"

7)分发JDK

[atguigu@master1 module]$ sudo sh /home/atguigu/bin/xsync /usr/local/yangguang/software/jdk

8)分发环境变量配置文件

[atguigu@master1 module]$ sudo sh /home/atguigu/bin/xsync /etc/profile.d/my_env.sh

9)使用xcall上执行source

[atguigu@hadoop103 module]$ xcall source /etc/profile.d/my_env.sh

1.4 环境变量配置说明

Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,/.bashrc,/.bash_profile等,下面说明上述几个文件之间的关系和区别。

bash的运行模式可分为login shell和non-login shell。

例如,我们通过终端,输入用户名、密码,登录系统之后,得到就是一个login shell。而当我们执行以下命令ssh slave * command,在slave *执行command的就是一个non-login shell。

img

这两种shell的主要区别在于,它们启动时会加载不同的配置文件,login shell启动时会加载/etc/profile,/.bash_profile,/.bashrc。non-login shell启动时会加载~/.bashrc。

而在加载/.bashrc(实际是/.bashrc中加载的/etc/bashrc)或/etc/profile时,都会执行如下代码片段,

img

因此不管是login shell还是non-login shell,启动时都会加载/etc/profile.d/*.sh中的环境变量。

二、Zookeeper部署


3.1 什么是Zookeeper

Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。

Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。

3.2 分布式安装部署

3.2.1 集群规划

在所有slave节点上部署Zookeeper。

服务器slave1 服务器slave2 服务器slave3 服务器slave4 服务器slave5
Zookeeper Zookeeper Zookeeper Zookeeper Zookeeper Zookeeper

3.2.2 解压安装

(1)解压Zookeeper安装包到/usr/local/yangguang/software/目录下

[atguigu@master1 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/yangguang/software/

(2)修改/usr/local/yangguang/software/apache-zookeeper-3.5.7-bin名称为zookeeper-3.5.7

[atguigu@master1 module]$ mv apache-zookeeper-3.5.7-bin/ zookeeper

3.2.3 配置服务器编号

(1)在/usr/local/yangguang/software/zookeeper/这个目录下创建zkData

[atguigu@master1 zookeeper]$ mkdir zkData

(2)在/usr/local/yangguang/software/zookeeper/zkData目录下创建一个myid的文件

[atguigu@master1 zkData]$ vim myid

添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码

在文件中添加与server对应的编号:

2

3.2.4 配置zoo.cfg文件

(1)重命名/usr/local/yangguang/software/zookeeper-3.5.7/conf这个目录下的zoo_sample.cfg为zoo.cfg

[atguigu@master1 conf]$ mv zoo_sample.cfg zoo.cfg

(2)打开zoo.cfg文件

[atguigu@master1 conf]$ vim zoo.cfg

修改数据存储路径配置

dataDir=/usr/local/yangguang/software/zookeeper/zkData

增加如下配置

#######################cluster##########################

server.2=slave1:2888:3888

server.3=slave2:2888:3888

server.4=slave3:2888:3888

server.5=slave4:2888:3888

server.6=slave5:2888:3888

(3)同步/usr/local/yangguang/software/zookeeper-3.5.7目录内容到hadoop103、hadoop104

[atguigu@master1 module]$ xsync zookeeper/

(4)分别修改hadoop103、hadoop104上的myid文件中内容为3、4

(5)zoo.cfg配置参数解读

server.A=B:C:D。

A是一个数字,表示这个是第几号服务器;

集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。

B是这个服务器的地址;

C是这个服务器Follower与集群中的Leader服务器交换信息的端口;

D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。

3.2.5 集群操作

(1)分别启动Zookeeper

[atguigu@master1 zookeeper]$ xcall bin/zkServer.sh start

(2)查看状态

[atguigu@master1 zookeeper]# xcall bin/zkServer.sh status

JMX enabled by default

Using config: /usr/local/yangguang/software/zookeeper/bin../image/conf/zoo.cfg

Mode: follower

JMX enabled by default

Using config: /usr/local/yangguang/software/zookeeper/bin../image/conf/zoo.cfg

Mode: leader

JMX enabled by default

Using config: /usr/local/yangguang/software/zookeeper/bin../image/conf/zoo.cfg

Mode: follower

3.3 ZK集群启动停止脚本

(1)在master1的/home/root/bin目录下创建脚本

[atguigu@master1 bin]$ vim zk.sh

​ 在脚本中编写如下内容

#!/bin/bash

 

case $1 in

"start"){

    for i in slave1 slave2 slave3 slave4 slave5

    do

        echo ---------- zookeeper $i 启动 ------------

        ssh $i "/usr/local/yangguang/software/zookeeper/bin/zkServer.sh start"

    done

};;

"stop"){

    for i in slave1 slave2 slave3 slave4 slave5

    do

        echo ---------- zookeeper $i 停止 ------------    

        ssh $i "/usr/local/yangguang/software/zookeeper/bin/zkServer.sh stop"

    done

};;

"status"){

    for i in slave1 slave2 slave3 slave4 slave5

    do

        echo ---------- zookeeper $i 状态 ------------    

        ssh $i "/usr/local/yangguang/software/zookeeper/bin/zkServer.sh status"

    done

};;

esac

(2)增加脚本执行权限

[atguigu@master1 bin]$ chmod 777 zk.sh

(3)Zookeeper集群启动脚本

[atguigu@master1 module]$ sh zk.sh start

(4)Zookeeper集群停止脚本

[atguigu@master1 module]$ sh zk.sh stop

(5)Zookeeper集群状态脚本

[atguigu@master1 module]$ sh zk.sh status

3.4 客户端命令行操作

命令基本语法 功能描述
help 显示所有操作命令
ls path 使用 ls 命令来查看当前znode的子节点-w 监听子节点变化-s 附加次级信息
create 普通创建-s 含有序列-e 临时(重启或者超时消失)
get path 获得节点的值-w 监听节点内容变化-s 附加次级信息
set 设置节点的具体值
stat 查看节点状态
delete 删除节点
deleteall 递归删除节点

1)启动客户端

[atguigu@slave1 zookeeper]$ bin/zkCli.sh

三、安装 Hadoop

3.1 启动服务配置

网ip 内网ip 安装的服务
36.111.36.* 192.168.0.8 NameNode,DFSZKFailoverController,ResourceManager
36.111.36.* 192.168.0.9 NameNode,DFSZKFailoverController,ResourceManager
192.168.0.2 DataNode、NodeManager、JournalNode
192.168.0.3 DataNode、NodeManager、JournalNode
192.168.0.4 DataNode、NodeManager、JournalNode
192.168.0.5 DataNode、NodeManager、JournalNode
192.168.0.6 DataNode、NodeManager、JournalNode

3.2 配置hadoop-env.sh文件

[root@master1 ~]# cd /usr/local/yangguang/software/hadoop/etc/hadoop
[root@master1 hadoop]# vi hadoop-env.sh

配置如下:

export JAVA_HOME=/usr/local/yangguang/software/jdk

3.3 配置mapred-env.sh文件

[root@master hadoop]# vi mapred-env.sh

配置如下:

export JAVA_HOME=/usr/local/yangguang/software/jdk

3.4 配置yarn-env.sh文件

[root@master hadoop]# vi yarn-env.sh

配置如下:

export JAVA_HOME=/usr/local/yangguang/software/jdk

3.5 配置slaves文件(该文件下用来配置要启动 NameNode 的机器的 localhost)

[root@master hadoop]# vi slaves

配置如下:

slave1
slave2
slave3
slave4
slave5

3.6 配置core-site.xml文件

[root@master hadoop]# vi core-site.xml

配置如下:

<configuration>
   <property>
                <name>fs.defaultFS</name>
                <value>hdfs://master1:9000</value>
        </property>
        <!-- hadoop运行时存储路径 -->
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/yangguang/software/hadoop/data</value>
        </property>
        <property>
                <name>hadoop.proxyuser.root.hosts</name>
                <value>*</value>
        </property>
         <property>
                <name>ipc.client.connect.max.retries</name>
                <value>100</value>
        </property>
         <property>
                <name>ipc.client.connect.retry.interval</name>
                <value>10000</value>
        </property>
        <property>
                <name>hadoop.proxyuser.root.groups</name>
                <value>*</value>
        </property>
        <!-- 配置Zookeeper 管理HDFS -->
        <property>
                <name>ha.zookeeper.quorum</name>                      <value>slave1:2181,slave2:2181,slave3:2181,slave4:2181,slave5:2181</value>
        </property>

</configuration>

3.7 配置hdfs-site.xml文件

[root@master1 hadoop]# vi hdfs-site.xml

配置如下:

<configuration>
        <!-- 副本数(正常为3) -->
        <property>
                <name>dfs.replication</name>
                <value>3</value>
        </property>

        <!-- 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口 -->
        <property>
                <name>dfs.nameservices</name>
                <value>cluster1</value>
        </property>

        <!-- 设置集群中两台NameNode的名称为nn1和nn2 -->
        <property>
                <name>dfs.ha.namenodes.cluster1</name>
                <value>nn1,nn2</value>
        </property>

        <!-- nn1 rpc地址 -->
        <property>
                <name>dfs.namenode.rpc-address.cluster1.nn1</name>
                <value>master1:9000</value>
        </property>

        <!-- nn2 rpc地址 -->
        <property>
                <name>dfs.namenode.rpc-address.cluster1.nn2</name>
                <value>master2:9000</value>
        </property>
                
        <!-- nn1 http地址 -->
        <property>
        </property>

        <!-- nn2 http地址 -->
        <property>
                <name>dfs.namenode.http-address.cluster1.nn2</name>
                <value>master2:50070</value>
        </property>

        <!-- 启动故障自动恢复 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>

        <!-- journal配置 指定NameNode的edits元数据在JournalNode上的存放位置一般跟zookeeper部署在一起 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
                <value>qjournal://slave1:8485;slave2:8485;slave3:8485;slave4:8485;slave5:8485/cluster1</value>
        </property>

        <!-- 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 -->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/usr/local/yangguang/software/hadoop/journaldata/jn</value>
        </property>

        <!-- namenode高可用主备切换配置  -->

        <!-- 开启NameNode失败自动切换 -->
        <property>
                <name>dfs.ha.automatic-failover.enabled</name>
                <value>true</value>
        </property>

        <!-- 配置失败自动切换实现方式,使用内置的zkfc 客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点
是否活跃-->
        <property>
                <name>dfs.client.failover.proxy.provider.cluster1</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>

        <!-- 配置隔离机制 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>shell(/bin/true)</value>
        </property>

        <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/root/.ssh/id_rsa</value>
        </property>

        <!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->
        <property>
                <name>dfs.ha.fencing.ssh.connect-timeout</name>
                <value>30000</value>
        </property>

        <!-- 关闭权限检查-->
        <property>
                <name>dfs.permissions.enable</name>
                <value>false</value>
        </property>
</configuration>

在hadoop260目录下创建JournalNode集群数据存放目录:

[root@master hadoop]# mkdir -p journaldata/jn

3.8 配置mapred-site.xml文件

[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml

配置如下:

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>master:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>master:19888</value>
        </property>
</configuration>

3.9 配置yarn-site.xml文件

[root@master hadoop]# vi yarn-site.xml

配置如下:

<configuration>

<!-- Site specific YARN configuration properties -->
        <!-- reducer获取数据方式 -->
        <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.log-aggregation-enable</name>
                <value>true</value>
        </property>

        <!-- 日志保留时间设置7天 -->
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>

        <!-- 日志聚合HDFS目录 -->
        <property>
                <name>yarn.nodemanager.remote-app-log-dir</name>
                <value>/data/hadoop/yarn-logs</value>
        </property>

        <!-- 超时的周期 -->
        <property>
                <name>yarn.resourcemanager.connect.retry-interval.ms</name>
                <value>2000</value>
        </property>

        <!-- 打开高可用 -->
        <property>
                <name>yarn.resourcemanager.ha.enabled</name>
                <value>true</value>
        </property>

        <!-- 给yarn cluster 取个名字yarn-rm-cluster -->
        <property>
                <name>yarn.resourcemanager.cluster-id</name>
                <value>yarn-rm-cluster</value>
        </property>

        <!-- 给ResourceManager 取个名字 rm1,rm2 -->
        <property>
                <name>yarn.resourcemanager.ha.rm-ids</name>
                <value>rm1,rm2</value>
        </property>

        <!-- 配置ResourceManager rm1 hostname -->
        <property>
                <name>yarn.resourcemanager.hostname.rm1</name>
                <value>master1</value>
        </property>

        <!-- 配置ResourceManager rm2 hostname -->
        <property>
                <name>yarn.resourcemanager.hostname.rm2</name>
                <value>master2</value>
        </property>

        <!-- 启用resourcemanager 自动恢复 -->
        <property>
                <name>yarn.resourcemanager.recovery.enabled</name>
                <value>true</value>
        </property>

        <!-- 配置Zookeeper地址 -->
        <property>
                <name>yarn.resourcemanager.zk-address</name>
                <value>slave1:2181,slave2:2181,slave3:2181,slave4:2181,slave5:2181</value>
        </property>

        <!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面 -->
        <property>
                <name>yarn.resourcemanager.store.class</name>
                <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
        </property>
</configuration>

3.10 配置 hadoop 环境变量文件

[root@master hadoop]# vi /etc/profile.d/my_env.sh

配置如下:

export HADOOP_HOME=/usr/local/yangguang/software/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

3.11 分发 Hadoop 和环境变量文件

[root@master ~]# xsync /usr/local/yangguang/software/hadoop/

[root@master ~]# xsync /etc/profile.d/my_env.sh

[root@master ~]# xcall source /etc/profile.d/my_env.sh

配置没有问题

3.12 启动 hadoop ha 高可用集群一定要按着以下顺序步骤启动集群!!

①首先使用shell脚本启动zookeeper

[root@master ~]# zk start

②然后启动配置了DataNode的机器上的JournalNode

[root@slave1 ~]# source /etc/profile.d/env.sh
[root@slave1 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/yangguang/software/hadoop/logs/hadoop-root-journalnode-slave1.out
[root@slave2 ~]# source /etc/profile.d/env.sh
[root@slave2 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/yangguang/software/hadoop/logs/hadoop-root-journalnode-slave1.out
[root@slave3 ~]# source /etc/profile.d/env.sh
[root@slave3 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/yangguang/software/hadoop/logs/hadoop-root-journalnode-slave1.out

③查看journalnode集群

④重置第一台master机器的hdfs

[root@master ~]# hdfs namenode -format

⑤启动master上的NameNode

[root@master ~]# hadoop-daemon.sh start namenode

启动成功

⑥在第二台master2机器上同步第一台master上的NameNode节点信息

[root@master2 ~]# source /etc/profile.d/env.sh 
[root@master2 ~]# hdfs namenode -bootstrapStandby

⑦在master机器上重置ZK

[root@master ~]# hdfs zkfc -formatZK

⑧先关掉dfs.sh,然后重新启动

[root@master ~]# stop-dfs.sh 

[root@master ~]# start-dfs.sh

查看启动情况,dfs启动成功

⑨在配置了ResourceManager的其中一台机器上启动yarn

[root@master ~]# start-yarn.sh

查看ResourceManager和NodeManager是否启动成功

  我们可以看到 master2 上 ResourceManager 没有启动,因为这个需要我们自己手动启动。

启动master2上的ResourceManager

[root@master2 ~]# yarn-daemon.sh start resourcemanager

3.13 测试 hadoop ha 高可用集群

首先打开网页

http://master1:50070
http://master2:50070/

我们可以观察到 master 是 active 的,master2 是 standby 的。

输入测试命令,切换两个NameNode的active

[root@master1 ~]# hdfs haadmin -failover nn1 nn2

刷新网页,我们可以看到 master 变成了 standby 的,master2 变成了 active。

我们再次输入测试命令,切换两个NameNode的active

[root@master1 ~]# hdfs haadmin -failover nn2 nn1

这时我们可以观察到 master 又切换回了 active,master2 又切换成了 standby,所以 NameNode 高可用实现。

接下来测试ResourceManager是否高可用,首先打开网页

http://master1:8088/
http://master2:8088/

我们会发现我们只能打开一个网页,如下:

我们能看到 master 的 ResourceManager 是 active 的。接下来我们 kill 掉 master 的 ResourceManager,重新打开网页看看结果。

这时我们可以看到,master2 上的 ResourceManager 变成了 active,所以 ResourceManager 也高可用。到此,Hadoop ha 高可用机器搭建结束。


yg9538 2022年10月11日 09:10 884 收藏文档