Hadoop3.2.1集群搭建

  说明

1.1 环境说明

版本:Centos7 Haddop3.2.1 JDK1.8

 

1.2 准备工作:

在安装前先要确保三台服务器之间能够ping 通,已经安装了jdk ,主机名的设置以及hosts 文件的修改(ip 和主机名映射关系),还有各主机的免密登录以及关闭防火墙。

本次安装用到的三台虚拟机如下:

Ip/hostname

namenode

datanode

journalnode

ZKFC

ResourceManager

NodeManager

192.168.242.81/ hadoop1

*


*

*

*


192.168.242.82/ hadoop2

*

*

*

*

*

*

192.168.242.83/ hadoop3


*

*



*

 

 

下载jdk1.8

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

此处使用的版本为jdk-8u211-linux-x64.rpm

 

下载zookeeper 集群

http://zookeeper.apache.org/releases.html

此处使用的版本为3.6.1

 

下载hadoop 安装包:

https://hadoop.apache.org/releases.html

此处选择最新版本3.2.1 hadoop-3.2.1.tar.gz


 

 hdfs 环境准备

2.1 设置主机名称

[root@localhost ~]# hostnamectl set-hostname hadoop1
[root@localhost ~]# hostname
hadoop1
 
[root@localhost ~]# hostnamectl set-hostname hadoop2
[root@localhost ~]# hostname
hadoop2
 
[root@localhost ~]# hostnamectl set-hostname hadoop3
[root@localhost ~]# hostname
hadoop3

 

2.2 修改hosts 文件添加ip 映射关系

在三台机器中打开并编辑 vim /etc/hosts 文件并追加ip 和主机名的映射关系

192.168.242.81 hadoop1
192.168.242.82 hadoop2
192.168.242.83 hadoop3

如下图所示

 

2.3 配置免密登录

hadoop1 为例,我们执行如下命令生成密匙

ssh-keygen -t rsa

执行这条命令一直按回车即可,生成成功后出现如下界面:

[root@hadoop1 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:0xzCJTMDUiko2KINeCIf9gvFlt6NmVGYL+Wii2YcWxU root@hadoop1
The key's randomart image is:
+---[RSA 2048]----+
|o. o.oo** .      |
|O * *.E..*       |
|oX * o @o .      |
|. + o O ++ .     |
|   . + oS o      |
|  . +    .       |
| . = .           |
|  * .            |
| o               |
+----[SHA256]-----+

然后另外两台机器也要执行如上操作,这样三台机器就成功的生成了密匙,我这里使用的是root 用户,密匙生成在~/.ssh/ 目录下,接下来我们需要把三台服务器生成的公匙都追加到各服务器的~/.ssh/authorized_keys 文件中,操作如下:

 

# hadoop1 hadoop2 hadoop3 中都执行下面这三条命令

ssh-copy-id -i hadoop1
ssh-copy-id -i hadoop2
ssh-copy-id -i hadoop3

这样我们三台机器之间就可免密登录了。

 

2.4 关闭防火墙  

# 关闭防火墙

systemctl stop firewalld


# 禁止开机启用防火墙

systemctl disable firewalld

三台服务器都配置

至此,环境准备结束,接下里开始安装,

 

  安装jdk1.8

按照下面步骤安装jdk

3.1 安装jdk1.8

为了避免干扰,先卸载系统自带的open jkd

查看gcj的版本号:rpm -qa|grep jdk
卸载系统自带的open jkd:
rpm -e --nodeps `rpm -qa | grep java`
安装
rpm -ivh --prefix=/hadoop/jdk1.8 jdk-8u211-linux-x64.rpm

3.2 配置JAVA 环境变量  

vi /etc/profile
export JAVA_HOME=/hadoop/jdk1.8/jdk1.8.0_211-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}


  使环境变量生效

source /etc/profile


  搭建zookeeper 集群  

4.1 上传所需安装包到相应目录  

[root@hadoop1 ~]# cd /hadoop/soft/
[root@hadoop1 soft]# ls -rtl
total 538164
-rw-r--r--. 1 root root 179439263 Jun 27  2019 jdk-8u211-linux-x64.rpm
-rw-r--r--. 1 root root 359196911 Jun 23 14:34 hadoop-3.2.1.tar.gz
-rw-r--r--. 1 root root  12436328 Jun 23 15:34 apache-zookeeper-3.6.1-bin.tar.gz

 

4.2 解压zookeeper 到指定目录

[root@hadoop1 soft]# tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz -C /hadoop/zookeeper/

4.3 修改zookeeper 配置文件  

[root@hadoop1 soft]# cd /hadoop/zookeeper/apache-zookeeper-3.6.1-bin/conf/
[root@hadoop1 conf]# ls -rtl
total 12
-rw-r--r--. 1 hzmc hzmc 1148 Apr 21 22:59 zoo_sample.cfg
-rw-r--r--. 1 hzmc hzmc 3435 Apr 21 22:59 log4j.properties
-rw-r--r--. 1 hzmc hzmc  535 Apr 21 22:59 configuration.xsl
[root@hadoop1 conf]# cp zoo_sample.cfg zoo.cfg
[root@hadoop1 conf]# vi zoo.cfg

如下所示:


备注:

dataDir(目录提前建好)
dataLogDir(若不指定默认放在dataDir下,目录提前建好)
autopurge.snapRetainCount(自动清理保留文件数目 单位:个)
autopurge.purgeInterval(自动清理频率 单位:小时)
Server(根据实际情况配置)

4.4 创建myid 文件  

zookeeper一节点
[root@hadoop1 apache-zookeeper-3.6.1-bin]# echo "1" > ./data/myid
[root@hadoop1 apache-zookeeper-3.6.1-bin]# more data/myid 
1 
zookeeper二节点
[root@hadoop2 apache-zookeeper-3.6.1-bin]# echo "2" > ./data/myid
[root@hadoop2 apache-zookeeper-3.6.1-bin]# more data/myid
2 
zookeeper三节点
[root@hadoop3 apache-zookeeper-3.6.1-bin]# echo "3" > ./data/myid
[root@hadoop3 apache-zookeeper-3.6.1-bin]# more data/myid
3

4.5 启动zookeeper 服务( 三台服务器都需要启动)

[root@hadoop1 apache-zookeeper-3.6.1-bin]# cd bin
[root@hadoop1 bin]# ./zkServer.sh start
/usr/bin/java
ZooKeeper JMX enabled by default
Using config: /hadoop/zookeeper/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

三节点启动会有一个leader 以及两个follower

[root@hadoop1 bin]#  ./zkServer.sh status

/usr/bin/java

ZooKeeper JMX enabled by default

Using config: /hadoop/zookeeper/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg

Client port found: 2181. Client address: localhost.

Mode:  follower

 

[root@hadoop2 bin]# ./zkServer.sh status

/usr/bin/java

ZooKeeper JMX enabled by default

Using config: /hadoop/zookeeper/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg

Client port found: 2181. Client address: localhost.

Mode:  leader

 

[root@hadoop3 bin]# ./zkServer.sh status

/usr/bin/java

ZooKeeper JMX enabled by default

Using config: /hadoop/zookeeper/apache-zookeeper-3.6.1-bin/bin/../conf/zoo.cfg

Client port found: 2181. Client address: localhost.

Mode:  follower

 

4.6 配置环境变量

为了能够在任意目录启动zookeeper 集群,我们可以配置环境变量。

ps: 你也可以不配,这不是搭建集群的必要操作,只不过如果你不配置环境变量,那么每次启动zookeeper 需要到安装文件的 bin  目录下去启动。

首先进入到 /etc/profile  目录,添加相应的配置信息:

#set zookeeper environment

export ZK_HOME=/hadoop/zookeeper/apache-zookeeper-3.6.1-bin
export PATH=$PATH:$ZK_HOME/bin

使用命令

bin/zkCli.sh

连接到zk 集群

 

至此zookeeper 集群搭建完成


 

  搭建Hadoop 集群

5.1 上传所需介质并解压  

[root@hadoop1 soft]# tar -zxvf hadoop-3.2.1.tar.gz -C /hadoop/


5.2 修改配置文件

hadoop 的配置文件在hadoop 目录下的etc/hadoop 中,这里只修改其中一台服务器的,其他的也一样,只要拷贝过去就行。

修改hadoop-env.sh 文件,增加环境变量信息

[root@hadoop1 hadoop-3.2.1]# cd /hadoop/hadoop-3.2.1/etc/Hadoop

[root@hadoop1 hadoop-3.2.1]# vi hadoop-env.sh

 

在使用集群管理脚本的时候,由于使用ssh 进行远程登录时不会读取/etc/profile 文件中的环境变量配置,所以使用ssh 的时候java 命令不会生效,因此需要在配置文件中显式配置jdk 的绝对路径( 如果各个节点的jdk 路径不一样的话那hadoop-env.sh 中应改成本机的JAVA_HOME)

hadoop 3.x 中对角色权限进行了严格限制,相比于hadoop 2.x 要额外对角色的所属用户进行规定。

此处仅为搭建HDFS 集群,如果涉及到YARN 等内容的话应一并修改对应yarn-env.sh 等文件中的配置

 

添加如下配置:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre
export HADOOP_HOME=/hadoop/hadoop-3.2.1
export HDFS_NAMENODE_USER="root"
export HDFS_DATANODE_USER="root"
export HDFS_ZKFC_USER="root"
export HDFS_JOURNALNODE_USER="root"

 

注意:这两个目录是根据你的自己的配置而定的,不一定和我的一样

 

5.3 三台服务器上新建data 目录,命令为   

mkdir -p /hadoop/hadoop-3.2.1/data/tmp
mkdir -p /hadoop/hadoop-3.2.1/data/namenode
mkdir -p /hadoop/hadoop-3.2.1/data/datanode
mkdir -p /hadoop/hadoop-3.2.1/journalnode

5.4 修改core-site.xml 文件

注意fs.defaultFS 属性中的主机名需要和你配置的主机名保持一致

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

添加如下配置:


    # HDFS主入口,mycluster仅是作为集群的逻辑名称,可随意更改但务必与hdfs-site.xml中dfs.nameservices值保持一致
    
        fs.defaultFS
        hdfs://mycluster
    
    
    # 默认的hadoop.tmp.dir指向的是/tmp目录,将导致namenode与datanode数据全都保存在易失目录中,此处进行修改
    
        hadoop.tmp.dir
        /var/hadoop
    
 
    # 用户角色配置,不配置此项会导致web页面报错---待验证
    
        hadoop.http.staticuser.user
        root
    
 
    # zookeeper集群地址,这里只配置了单台,如是集群以逗号进行分隔
    
        ha.zookeeper.quorum
        zookeeper:2181
    

 

具体配置如下


    
        fs.defaultFS
        hdfs://mycluster
    
    
        hadoop.tmp.dir
        /hadoop/hadoop-3.2.1/data/tmp
    
    
        ha.zookeeper.quorum
        hadoop1:2181,hadoop2:2181,hadoop3:2181
    

5.5 修改hdfs-site.xml 文件

注意:这里把hdfs 中文件副本的数量设置为2 ,集群中副本数一定要小于等于从节点数

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

添加如下配置:


    # 副本数配置
    
        dfs.replication
        2
    
 
    # 集群名称,此值在接下来的配置中将多次出现务必注意同步修改
    
        dfs.nameservices
        mycluster
    
    # 所有的namenode列表,此处也只是逻辑名称,非namenode所在的主机名称
    
        dfs.ha.namenodes.mycluster
        nn1,nn2
    
 
    # namenode之间用于RPC通信的地址,value填写namenode所在的主机地址
    # 默认端口8020,注意mycluster与nn1要和上文的配置一致
    
        dfs.namenode.rpc-address.mycluster.nn1
        master:8020
    
    
        dfs.namenode.rpc-address.mycluster.nn2
        slave1:8020
    
 
    # namenode的web访问地址,默认端口9870
    
        dfs.namenode.http-address.mycluster.nn1
        master:9870
    
    
        dfs.namenode.http-address.mycluster.nn2
        slave1:9870
    
 
    #指定NameNode的元数据在JournalNode上的存放位置
    # journalnode主机地址,最少三台,默认端口8485
    # 格式为 qjournal://jn1:port;jn2:port;jn3:port/${nameservices}
    
        dfs.namenode.shared.edits.dir
        qjournal://master:8485;slave1:8485;slave2:8485/mycluster
    
 
    # 故障时自动切换的实现类,照抄即可
    
        dfs.client.failover.proxy.provider.mycluster
        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
    
 
    # 故障时相互操作方式(namenode要切换active和standby),这里我们选ssh方式
    
      dfs.ha.fencing.methods
      sshfence
    
    # 修改为自己用户的ssh key存放地址
    
      dfs.ha.fencing.ssh.private-key-files
      /root/.ssh/id_rsa

 
    #指定journalNode在本地磁盘存放数据的位置
    # namenode日志文件输出路径,即journalnode读取变更的位置
    
        dfs.journalnode.edits.dir
        /home/software/hadoop-3.2.1/journalnode
    
 
    # 启用自动故障转移
    
        dfs.ha.automatic-failover.enabled
        true
    


 

具体配置


    
        dfs.replication
        2
    
    
        dfs.nameservices
        mycluster
    
    
        dfs.ha.namenodes.mycluster
        nn1,nn2
    
    
        dfs.namenode.rpc-address.mycluster.nn1
        hadoop1:8020
    
    
        dfs.namenode.rpc-address.mycluster.nn2
        hadoop2:8020
    
    
        dfs.namenode.http-address.mycluster.nn1
        hadoop1:9870
    
    
        dfs.namenode.http-address.mycluster.nn2
        hadoop2:9870
    
    
        dfs.namenode.shared.edits.dir
        qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster
    
    
        dfs.client.failover.proxy.provider.mycluster
        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
    
    
      dfs.ha.fencing.methods
      sshfence
    
    
      dfs.ha.fencing.ssh.private-key-files
      /root/.ssh/id_rsa
    
    
        dfs.journalnode.edits.dir
        /hadoop/hadoop-3.2.1/journalnode
    
    
        dfs.ha.automatic-failover.enabled
        true
    

 

5.6 修改workers 文件

配置所有datanode 的主机地址,在hadoop 2.x 中这个文件叫slaves ,配置所有datanode 的主机地址,只需要把所有的datanode 主机名填进去就好了

[root@hadoop1 hadoop]# vi workers

首先删除文件中的默认localhost, 然后添加从节点的主机名:

hadoop2
hadoop3

 

将上面修改的文件传到其他两个节点

[root@hadoop1 hadoop]# scp core-site.xml hadoop2:/hadoop/hadoop-3.2.1/etc/hadoop/

core-site.xml                                                                                                                                     

[root@hadoop1 hadoop]# scp core-site.xml hadoop3:/hadoop/hadoop-3.2.1/etc/hadoop/

core-site.xml                                                                                                                                     

[root@hadoop1 hadoop]# scp hdfs-site.xml hadoop2:/hadoop/hadoop-3.2.1/etc/hadoop/

hdfs-site.xml                                                                                                                                      

[root@hadoop1 hadoop]# scp hdfs-site.xml hadoop3:/hadoop/hadoop-3.2.1/etc/hadoop/

hdfs-site.xml                                                                                                                                     

[root@hadoop1 hadoop]# scp workers hadoop2:/hadoop/hadoop-3.2.1/etc/hadoop/

workers                                                                                                                                           

[root@hadoop1 hadoop]# scp workers hadoop3:/hadoop/hadoop-3.2.1/etc/hadoop/

workers                                                                                                                                           

[root@hadoop1 hadoop]# scp hadoop-env.sh hadoop2:/hadoop/hadoop-3.2.1/etc/hadoop/

hadoop-env.sh                                                                                                                                     

[root@hadoop1 hadoop]# scp hadoop-env.sh hadoop3:/hadoop/hadoop-3.2.1/etc/hadoop/

 

5.7 配置环境变量

为了能够在任意目录启动hadoop 集群,我们可以配置环境变量。

ps: 你也可以不配,这不是搭建集群的必要操作,只不过如果你不配置环境变量,那么每次启动hadoop 需要到安装文件的 bin  目录下去启动。

首先进入到 /etc/profile  目录,添加相应的配置信息:

#set hadoop environment

export HADOOP_HOME=/hadoop/hadoop-3.2.1
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
export PATH=.:$JAVA_HOME/bin:$HADOOP_HOME/bin:$PATH

5.8 启动集群

到目前位置,集群得配置已经基本完成,接下来就是启动集群。

 

5.8.1 启动journalnode

在所有journalnode 节点上启动journalnode( 本例中是所有机器) hdfs --daemon start journalnode

[root@hadoop1 ~]# hdfs --daemon start journalnode
WARNING: /hadoop/hadoop-3.2.1/logs does not exist. Creating.
[root@hadoop1 ~]# ls -rtl /hadoop/hadoop-3.2.1/
total 184
-rw-rw-r--. 1 1001 1001   1361 Sep 10  2019 README.txt
-rw-rw-r--. 1 1001 1001  22125 Sep 10  2019 NOTICE.txt
-rw-rw-r--. 1 1001 1001 150569 Sep 10  2019 LICENSE.txt
drwxr-xr-x. 3 1001 1001   4096 Sep 10  2019 sbin
drwxr-xr-x. 3 1001 1001     20 Sep 10  2019 etc
drwxr-xr-x. 3 1001 1001     20 Sep 11  2019 lib
drwxr-xr-x. 2 1001 1001    203 Sep 11  2019 bin
drwxr-xr-x. 2 1001 1001    106 Sep 11  2019 include
drwxr-xr-x. 4 1001 1001   4096 Sep 11  2019 libexec
drwxr-xr-x. 4 1001 1001     31 Sep 11  2019 share
drwxr-xr-x. 5 root root     49 Jun 23 16:47 data
drwxr-xr-x. 2 root root      6 Jun 23 17:47 journalnode
drwxr-xr-x. 2 root root     92 Jun 23 19:05 logs


发现logs 目录已经   自动创建

查看日志

************************************************************/
2020-06-23 19:05:15,254 INFO org.apache.hadoop.hdfs.qjournal.server.JournalNode: registered UNIX signal handlers for [TERM, HUP, INT]
2020-06-23 19:05:16,045 INFO org.apache.hadoop.metrics2.impl.MetricsConfig: Loaded properties from hadoop-metrics2.properties
2020-06-23 19:05:16,312 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: Scheduled Metric snapshot period at 10 second(s).
2020-06-23 19:05:16,312 INFO org.apache.hadoop.metrics2.impl.MetricsSystemImpl: JournalNode metrics system started
2020-06-23 19:05:16,712 INFO org.apache.hadoop.hdfs.DFSUtil: Starting Web-server for journal at: http://0.0.0.0:8480
2020-06-23 19:05:16,791 INFO org.eclipse.jetty.util.log: Logging initialized @2932ms
2020-06-23 19:05:17,033 INFO org.apache.hadoop.security.authentication.server.AuthenticationFilter: Unable to initialize FileSignerSecretProvider, falling back to use random secret
s.
2020-06-23 19:05:17,069 INFO org.apache.hadoop.http.HttpRequestLog: Http request log for http.requests.journal is not defined
2020-06-23 19:05:17,102 INFO org.apache.hadoop.http.HttpServer2: Added global filter 'safety' (class=org.apache.hadoop.http.HttpServer2$QuotingInputFilter)
2020-06-23 19:05:17,107 INFO org.apache.hadoop.http.HttpServer2: Added filter static_user_filter (class=org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter) to context 
journal
2020-06-23 19:05:17,107 INFO org.apache.hadoop.http.HttpServer2: Added filter static_user_filter (class=org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter) to context 
logs
2020-06-23 19:05:17,108 INFO org.apache.hadoop.http.HttpServer2: Added filter static_user_filter (class=org.apache.hadoop.http.lib.StaticUserWebFilter$StaticUserFilter) to context 
static
2020-06-23 19:05:17,163 INFO org.apache.hadoop.http.HttpServer2: Jetty bound to port 8480
2020-06-23 19:05:17,165 INFO org.eclipse.jetty.server.Server: jetty-9.3.24.v20180605, build timestamp: 2018-06-06T01:11:56+08:00, git hash: 84205aa28f11a4f31f2a3b86d1bba2cc8ab69827
2020-06-23 19:05:17,248 INFO org.eclipse.jetty.server.handler.ContextHandler: Started o.e.j.s.ServletContextHandler@ffaa6af{/logs,file:///hadoop/hadoop-3.2.1/logs/,AVAILABLE}
2020-06-23 19:05:17,249 INFO org.eclipse.jetty.server.handler.ContextHandler: Started o.e.j.s.ServletContextHandler@316bcf94{/static,file:///hadoop/hadoop-3.2.1/share/hadoop/hdfs/w
ebapps/static/,AVAILABLE}
2020-06-23 19:05:17,895 INFO org.eclipse.jetty.server.handler.ContextHandler: Started o.e.j.w.WebAppContext@359df09a{/,file:///hadoop/hadoop-3.2.1/share/hadoop/hdfs/webapps/journal
/,AVAILABLE}{/journal}
2020-06-23 19:05:17,908 INFO org.eclipse.jetty.server.AbstractConnector: Started ServerConnector@1040be71{HTTP/1.1,[http/1.1]}{0.0.0.0:8480}
2020-06-23 19:05:17,909 INFO org.eclipse.jetty.server.Server: Started @4050ms
2020-06-23 19:05:17,915 INFO org.apache.hadoop.hdfs.qjournal.server.JournalNode: RPC server is binding to 0.0.0.0:8485
2020-06-23 19:05:17,996 INFO org.apache.hadoop.ipc.CallQueueManager: Using callQueue: class java.util.concurrent.LinkedBlockingQueue, queueCapacity: 500, scheduler: class org.apach
e.hadoop.ipc.DefaultRpcScheduler, ipcBackoff: false.
2020-06-23 19:05:18,018 INFO org.apache.hadoop.ipc.Server: Starting Socket Reader #1 for port 8485
2020-06-23 19:05:18,627 INFO org.apache.hadoop.ipc.Server: IPC Server Responder: starting
2020-06-23 19:05:18,630 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 8485: starting

  可以看到已经启动

 

尝试启动,提示已经running

[root@hadoop1 journalnode]# hdfs --daemon start journalnode

journalnode is running as process 5952.  Stop it first.

 

依次启动三个节点。

 

5.8.2 启动namenode

namenode( 随便哪一个都行) 上执行格式化:hdfs namenode -format ,出现successfully formated 即为执行成功,格式化只能进行一次,多次格式化会导致集群启动失败

[root@hadoop1 journalnode]#  hdfs namenode -format

 

启动刚刚格式化的namenode hdfs --daemon start namenode

[root@hadoop1 current]# hdfs --daemon start namenode

 

在其他namenode 节点上同步信息:hdfs namenode -bootstrapStandby ,出现以下信息即为同步成功

[root@hadoop2 ~]# hdfs namenode -bootstrapStandby

 

5.8.3 hadoop 集群注册到zookeeper

FC 是要和NN 一一对应的,两个NN 就要部署两个FC 。它负责监控NN 的状态,并及时的把状态信息写入ZK 。它通过一个独立线程周期性的调用NN 上的一个特定接口来获取NN 的健康状态。FC 也有选择谁作为Active NN 的权利,因为最多只有两个节点,目前选择策略还比较简单(先到先得,轮换)。

 

格式化zookeeper 节点:hdfs zkfc -formatZK ,出现以下信息即为执行成功

[root@hadoop1 current]# hdfs zkfc -formatZK

 

 

查看初始化成功:在zookeeper 下的bin 文件输入 ./zkCli.sh  :查看是否有创建的数据节点

 

5.8.4 启动HDFS 集群

启动HDFS 集群:start-dfs.sh

[root@hadoop1 ~]# start-dfs.sh
Starting namenodes on [hadoop1 hadoop2]
Last login: Tue Jun 23 20:53:30 CST 2020 from 192.168.51.61 on pts/0
hadoop1: namenode is running as process 6355.  Stop it first.
Starting datanodes
Last login: Tue Jun 23 20:54:20 CST 2020 on pts/0
Starting journal nodes [hadoop3 hadoop2 hadoop1]
Last login: Tue Jun 23 20:54:23 CST 2020 on pts/0
hadoop3: journalnode is running as process 5749.  Stop it first.
hadoop1: journalnode is running as process 5952.  Stop it first.
hadoop2: journalnode is running as process 5495.  Stop it first.
Starting ZK Failover Controllers on NN hosts [hadoop1 hadoop2]
Last login: Tue Jun 23 20:54:32 CST 2020 on pts/0


 

查看启动项,在每个节点上敲入jps

Hadoop1

[root@hadoop1 logs]# jps

18256 QuorumPeerMain

18433 JournalNode

19330 DFSZKFailoverController

18569 NameNode

19388 Jps

 

Hadoop2

[root@hadoop2 logs]# jps

18592 DataNode

18784 DFSZKFailoverController

18001 QuorumPeerMain

18148 JournalNode

18303 NameNode

18831 Jps

 

Hadoop3

[root@hadoop3 ~]# jps

18067 QuorumPeerMain

18198 JournalNode

18380 DataNode

18508 Jps

 

5.9 查看HDFS web 界面

 

http://192.168.242.81:9870/

 

分别访问两个namenode web 页面,可以查看到一个为active 一个为standby

 

 

查看Datanodes 节点运行正常!

 

查看zookeeper 集群中的节点信息,抢占成功的节点应与实际active 的一致。

 

 Yarn 高可用配置(HA

 

hdfs 集群启动后仅仅是一个分布式文件系统而已,并不具备计算的能力,因此引出yarn ,记录一下yarn HA 的搭建过程

 

首先需要注意一点,Yarn HDFS 属于两个不同的集群,一个负责文件存储,一个负责作业调度,二者之间没有必然关系,也不一定说Yarn 的某些节点必须要放在datanaode 上。通常会把nodemanager datanode 放在一起是因为要计算向数据移动,尽可能使计算作业就在存储节点上执行

 

一般会将namenode resourcemanager 分开在不同得机器上,因为他们消耗资源都比较大,不过这边机器有限,我们将他们放在相同得服务器上

 

6.1 修改hadoop-env.sh

 

vim hadoop-env.sh

由于hadoop3 限制必须要声明角色运行进程,在文件末尾加上以下两行:

export YARN_NODEMANAGER_USER="root"
export YARN_RESOURCEMANAGER_USER="root"

三个节点都添加

 

6.2 修改 mapred-site.xml

 

vim mapred-site.xml

 

配置如下


        
        
                mapreduce.framework.name
                yarn
        
        
        
                mapreduce.jobhistory.address
                hadoop1:10020
        
        
        
                mapreduce.jobhistory.webapp.address
                hadoop1:19888
        
        
                mapreduce.application.classpath
                /hadoop/hadoop-3.2.1/share/hadoop/mapreduce/*,/hadoop/hadoop-3.2.1/share/hadoop/mapreduce/lib/*
        


6.3 修改 yarn-site.xml

 

vim yarn-site.xml

 

配置如下(主要配置项的作用已在注释中说明)



       
        
                yarn.resourcemanager.ha.enabled
                true
        
        
        
                yarn.resourcemanager.cluster-id
                cluster-yarn1
        
        
        
                yarn.resourcemanager.ha.rm-ids
                rm1,rm2
        
        
        
                yarn.resourcemanager.hostname.rm1
                hadoop1
        
        
                yarn.resourcemanager.hostname.rm2
                hadoop2
        
        
                yarn.resourcemanager.recovery.enabled
                true
        
        
                yarn.resourcemanager.store.class
                org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
        
       
        
                yarn.resourcemanager.webapp.address.rm1
                hadoop1:8088
        
        
                yarn.resourcemanager.webapp.address.rm2
                hadoop2:8088
        
        
        
                yarn.resourcemanager.zk-address
                hadoop1:2181,hadoop2:2181,hadoop3:2181
        
        
                yarn.nodemanager.aux-services
                mapreduce_shuffle
        
 
        
        yarn.application.classpath
        
        /hadoop/hadoop-3.2.1/etc/hadoop,
        /hadoop/hadoop-3.2.1/share/hadoop/common/lib/*,
        /hadoop/hadoop-3.2.1/share/hadoop/common/*,
        /hadoop/hadoop-3.2.1/share/hadoop/hdfs,
        /hadoop/hadoop-3.2.1/share/hadoop/hdfs/lib/*,
        /hadoop/hadoop-3.2.1/share/hadoop/hdfs/*,
        /hadoop/hadoop-3.2.1/share/hadoop/mapreduce/lib/*,
        /hadoop/hadoop-3.2.1/share/hadoop/mapreduce/*,
        /hadoop/hadoop-3.2.1/share/hadoop/yarn,
        /hadoop/hadoop-3.2.1/share/hadoop/yarn/lib/*,
        /hadoop/hadoop-3.2.1/share/hadoop/yarn/*
        
        


6.4 将修改得文件传到其他两个节点

         

[root@hadoop1 hadoop]# scp mapred-site.xml hadoop2:/hadoop/hadoop-3.2.1/etc/hadoop/

mapred-site.xml                                                                                                                                   100% 1602   798.8KB/s   00:00   

[root@hadoop1 hadoop]# scp mapred-site.xml hadoop3:/hadoop/hadoop-3.2.1/etc/hadoop/

mapred-site.xml                                                                                                                                   100% 1602   806.0KB/s   00:00   

[root@hadoop1 hadoop]# scp yarn-site.xml hadoop3:/hadoop/hadoop-3.2.1/etc/hadoop/

yarn-site.xml                                                                                                                                     100% 3435     1.8MB/s   00:00   

[root@hadoop1 hadoop]# scp yarn-site.xml hadoop2:/hadoop/hadoop-3.2.1/etc/hadoop/

yarn-site.xml           

 

6.5 启动yarn 集群(hadoop1 上执行)

 

[root@hadoop1 hadoop]# start-yarn.sh

Starting resourcemanagers on [ hadoop1 hadoop2]

Last login: Thu Jul  2 16:56:03 CST 2020 from 192.168.51.61 on pts/1

Starting nodemanagers

Last login: Thu Jul  2 17:23:53 CST 2020 on pts/0

 

因为我这里 namenode   resourcemanager  在同一台机器上,因此启动 hdfs   yarn  也可以用一条命令 start-all.sh  来启动,但是建议分成两步启动,如果 namenode   resourcemanager  分开了就要分别在不同的机器上启动

 

6.6 启动 history  服务(Hadoop1 上执行)

[root@hadoop1 hadoop]# mr-jobhistory-daemon.sh start historyserver

 

查看服务状态

[root@hadoop1 hadoop]# yarn rmadmin -getServiceState rm1

active

[root@hadoop1 hadoop]# yarn rmadmin -getServiceState rm2

Standby

 

强制转换指令

yarn rmadmin –transitionToStandby rm2

 

6.7 检查服务状态

Hadoop1

[root@hadoop1 hadoop]# jps

18256 QuorumPeerMain

18433 JournalNode

19330 DFSZKFailoverController

23522 Jps

22504 NameNode

23213 ResourceManager

23469 JobHistoryServer

 

Hadoop2

[root@hadoop2 hadoop]# jps

18592 DataNode

18784 DFSZKFailoverController

18001 QuorumPeerMain

18148 JournalNode

21481 ResourceManager

21563 NodeManager

21724 Jps

18303 NameNode

 

Hadoop3

[root@hadoop3 hadoop]# jps

20016 NodeManager

18067 QuorumPeerMain

18198 JournalNode

20134 Jps

18380 DataNode

 

访问hadoop1:8088 页面和hadoop2:8088 页面,hadoop2:8088 页面会自动跳转到hadoop1:8088

http://192.168.242.81:8088/

 

 

 

备注:

standby 节点上,只有About 这个页面能看到本节点的信息,点击其他链接都会自动跳转到active 节点;

standby 节点看不到集群其他信息,比如任务数,vcpu 核数,节点数和内存容量,都会显示为0 ,只有active 节点上才能看到;

页面中显示的Cluster ID 并不是集群的id ,而是当前节点在集群中的id ,这里与大多数集群系统的显示有所差异,不要以为是配置文件写错了。

 

查看history  服务

http://192.168.242.81:19888/

 

6.8 测试集群的高可用性

 

 kill  命令强制结束正处于 active   namenode

刷新刚刚处于 standby  状态的 namenode  的页面,可以看到该节点变成 active 

 


 


请使用浏览器的分享功能分享到微信等