一 说明
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值保持一致 # 默认的hadoop.tmp.dir指向的是/tmp目录,将导致namenode与datanode数据全都保存在易失目录中,此处进行修改 fs.defaultFS hdfs://mycluster # 用户角色配置,不配置此项会导致web页面报错---待验证 hadoop.tmp.dir /var/hadoop # zookeeper集群地址,这里只配置了单台,如是集群以逗号进行分隔 hadoop.http.staticuser.user root 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 # 所有的namenode列表,此处也只是逻辑名称,非namenode所在的主机名称 dfs.nameservices mycluster # namenode之间用于RPC通信的地址,value填写namenode所在的主机地址 # 默认端口8020,注意mycluster与nn1要和上文的配置一致 dfs.ha.namenodes.mycluster nn1,nn2 dfs.namenode.rpc-address.mycluster.nn1 master:8020 # namenode的web访问地址,默认端口9870 dfs.namenode.rpc-address.mycluster.nn2 slave1:8020 dfs.namenode.http-address.mycluster.nn1 master:9870 #指定NameNode的元数据在JournalNode上的存放位置 # journalnode主机地址,最少三台,默认端口8485 # 格式为 qjournal://jn1:port;jn2:port;jn3:port/${nameservices} dfs.namenode.http-address.mycluster.nn2 slave1:9870 # 故障时自动切换的实现类,照抄即可 dfs.namenode.shared.edits.dir qjournal://master:8485;slave1:8485;slave2:8485/mycluster # 故障时相互操作方式(namenode要切换active和standby),这里我们选ssh方式 dfs.client.failover.proxy.provider.mycluster org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider # 修改为自己用户的ssh key存放地址 dfs.ha.fencing.methods sshfence #指定journalNode在本地磁盘存放数据的位置 # namenode日志文件输出路径,即journalnode读取变更的位置 dfs.ha.fencing.ssh.private-key-files /root/.ssh/id_rsa # 启用自动故障转移 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 界面
分别访问两个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
备注:
standby 节点上,只有About 这个页面能看到本节点的信息,点击其他链接都会自动跳转到active 节点;
standby 节点看不到集群其他信息,比如任务数,vcpu 核数,节点数和内存容量,都会显示为0 ,只有active 节点上才能看到;
页面中显示的Cluster ID 并不是集群的id ,而是当前节点在集群中的id ,这里与大多数集群系统的显示有所差异,不要以为是配置文件写错了。
查看history 服务
6.8 测试集群的高可用性
用 kill 命令强制结束正处于 active 的 namenode
刷新刚刚处于 standby 状态的 namenode 的页面,可以看到该节点变成 active 了