首页 > 大数据 > Hadoop > Hadoop3.2.1集群搭建
版本:Centos7 Haddop3.2.1 JDK1.8
在安装前先要确保三台服务器之间能够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
[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
在三台机器中打开并编辑 vim /etc/hosts 文件并追加ip 和主机名的映射关系
192.168.242.81 hadoop1 192.168.242.82 hadoop2 192.168.242.83 hadoop3
如下图所示
以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
这样我们三台机器之间就可免密登录了。
# 关闭防火墙
systemctl stop firewalld
# 禁止开机启用防火墙
systemctl disable firewalld
三台服务器都配置
至此,环境准备结束,接下里开始安装,
按照下面步骤安装jdk
为了避免干扰,先卸载系统自带的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
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
[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
[root@hadoop1 soft]# tar -zxvf apache-zookeeper-3.6.1-bin.tar.gz -C /hadoop/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(根据实际情况配置)
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
[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
为了能够在任意目录启动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 集群搭建完成
[root@hadoop1 soft]# tar -zxvf hadoop-3.2.1.tar.gz -C /hadoop/
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"
注意:这两个目录是根据你的自己的配置而定的,不一定和我的一样
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
注意fs.defaultFS 属性中的主机名需要和你配置的主机名保持一致
[root@hadoop1 hadoop]# vi core-site.xml
添加如下配置:
<configuration> # HDFS主入口,mycluster仅是作为集群的逻辑名称,可随意更改但务必与hdfs-site.xml中dfs.nameservices值保持一致 <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> # 默认的hadoop.tmp.dir指向的是/tmp目录,将导致namenode与datanode数据全都保存在易失目录中,此处进行修改 <property> <name>hadoop.tmp.dir</name> <value>/var/hadoop</value> </property> # 用户角色配置,不配置此项会导致web页面报错---待验证 <property> <name>hadoop.http.staticuser.user</name> <value>root</value> </property> # zookeeper集群地址,这里只配置了单台,如是集群以逗号进行分隔 <property> <name>ha.zookeeper.quorum</name> <value>zookeeper:2181</value> </property> </configuration>
具体配置如下
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/hadoop/hadoop-3.2.1/data/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value> </property> </configuration>
注意:这里把hdfs 中文件副本的数量设置为2 ,集群中副本数一定要小于等于从节点数
[root@hadoop1 hadoop]# vi hdfs-site.xml
添加如下配置:
<configuration>
# 副本数配置
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
# 集群名称,此值在接下来的配置中将多次出现务必注意同步修改
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
# 所有的namenode列表,此处也只是逻辑名称,非namenode所在的主机名称
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
# namenode之间用于RPC通信的地址,value填写namenode所在的主机地址
# 默认端口8020,注意mycluster与nn1要和上文的配置一致
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave1:8020</value>
</property>
# namenode的web访问地址,默认端口9870
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave1:9870</value>
</property>
#指定NameNode的元数据在JournalNode上的存放位置
# journalnode主机地址,最少三台,默认端口8485
# 格式为 qjournal://jn1:port;jn2:port;jn3:port/${nameservices}
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>
# 故障时自动切换的实现类,照抄即可
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
# 故障时相互操作方式(namenode要切换active和standby),这里我们选ssh方式
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
# 修改为自己用户的ssh key存放地址
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
#指定journalNode在本地磁盘存放数据的位置
# namenode日志文件输出路径,即journalnode读取变更的位置
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/software/hadoop-3.2.1/journalnode</value>
</property>
# 启用自动故障转移
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
具体配置
<configuration> <property> <name>dfs.replication</name> <value>2</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop1:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop2:9870</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop1:8485;hadoop2:8485;hadoop3:8485/mycluster</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.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/hadoop/hadoop-3.2.1/journalnode</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
配置所有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/
为了能够在任意目录启动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
到目前位置,集群得配置已经基本完成,接下来就是启动集群。
在所有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.
依次启动三个节点。
在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

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 :查看是否有创建的数据节点

启动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
分别访问两个namenode 的web 页面,可以查看到一个为active 一个为standby


查看Datanodes 节点运行正常!

查看zookeeper 集群中的节点信息,抢占成功的节点应与实际active 的一致。
hdfs 集群启动后仅仅是一个分布式文件系统而已,并不具备计算的能力,因此引出yarn ,记录一下yarn HA 的搭建过程
首先需要注意一点,Yarn 与HDFS 属于两个不同的集群,一个负责文件存储,一个负责作业调度,二者之间没有必然关系,也不一定说Yarn 的某些节点必须要放在datanaode 上。通常会把nodemanager 和datanode 放在一起是因为要“ 计算向数据移动” ,尽可能使计算作业就在存储节点上执行
一般会将namenode 和resourcemanager 分开在不同得机器上,因为他们消耗资源都比较大,不过这边机器有限,我们将他们放在相同得服务器上
vim hadoop-env.sh
由于hadoop3 限制必须要声明角色运行进程,在文件末尾加上以下两行:
export YARN_NODEMANAGER_USER="root" export YARN_RESOURCEMANAGER_USER="root"
三个节点都添加
vim mapred-site.xml
配置如下
<configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- 配置 MapReduce JobHistory Server 地址 ,默认端口10020 --> <property> <name>mapreduce.jobhistory.address</name> <value>hadoop1:10020</value> </property> <!-- 配置 MapReduce JobHistory Server web ui 地址, 默认端口19888 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>hadoop1:19888</value> </property> <property> <name>mapreduce.application.classpath</name> <value>/hadoop/hadoop-3.2.1/share/hadoop/mapreduce/*,/hadoop/hadoop-3.2.1/share/hadoop/mapreduce/lib/*</value> </property> </configuration>
vim yarn-site.xml
配置如下(主要配置项的作用已在注释中说明)
<configuration> <!-- Site specific YARN configuration properties --> <!-- 开启RM高可靠 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn1</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址。因为他们都要占用大量资源,可以把namenode和resourcemanager分开到不同的服务器上 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop2</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <!-- RM对外暴露的web http地址,用户可通过该地址在浏览器中查看集群信息 --> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>hadoop1:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>hadoop2:8088</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.application.classpath</name> <value> /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/* </value> </property> </configuration>
[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
[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 分开了就要分别在不同的机器上启动
[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
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 服务

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

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

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29956245/viewspace-2933087/ ,如需转载,请注明出处,否则将追究法律责任。