zookeeper+Hadoop-3.2.1高可用(HA)环境搭建
第一步:搭建系统环境(前期准备)
1.服务器规划
准备三台Centos8服务器,系统安装规划如下:
|
节点 |
namenode |
datanode |
resourcemanager |
journalnode |
zookeeper |
zkfc |
|
hadoop-master |
√ |
√ |
√ |
√ |
√ |
√ |
|
hadoop-slave1 |
√ |
√ |
√ |
√ |
√ |
√ |
|
hadoop-slave2 |
|
√ |
|
√ |
√ |
|
2.安装JAVA环境(可选)
首先要确保每台服务器上已经正确安装JAVA环境。执行如下命令安装JAVA:
yum install java-1.8.0-openjdk-devel.x86_64
执行如下命令安装jdk-devel:
yum install jdk-devel
说明:若jdk-devel没有安装,则不能执行jps命令(jps命令是显示当前所有java进程的命令,可以查看hadoop相关进程是否已经启动);若jdk-devel已经安装,则不需要此步。
3.下载hadoop-3.2.1和zookeeper
下载hadoop-3.2.1,并上传到主服务器
执行命令解压:
tar -xzvf hadoop-3.2.1.tar.gz
将解压好的目录拷贝到/usr目录下:
cp -r hadoop-3.2.1 /usr
下载zookeeper.3.6.1,并上传到服务器:
执行解压命令:
tar -zxvf apache-zookeeper-3.6.1.tar.gz
将解压后的目录拷贝到/usr目录下
cp -r apache-zookeeper-3.6.1-bin /usr/zookeeper-3.6.1
提醒:下载zookeeper3.5.5以上版本,必须下载-bin版本
4.关闭系统防火墙:为保证系统的正常访问,先在每一台服务器上执行如下命令,关闭系统防火墙。
systemctl stop firewalld #关闭防火墙
systemctl disable firewalld #禁止开机启动
说明:查看防护墙状态使用命令:firewall-cmd –state
5.修改主机名
hostnamectl set-hostname hadoop-master #在主节点执行此命令
hostnamectl set-hostname hadoop-slave1 #在第二个节点执行此命令
hostnamectl set-hostname hadoop-slave2 #在第三个节点执行此命令
说明:主机名用户根据自己情况自己定义
6.添加主机解析
编辑每台主机上的/etc/hosts文件,在文件尾部填写如下内容
x.x.x.x hadoop-master
x.x.x.x hadoop-slave1
x.x.x.x hadoop-slave2
说明:x.x.x.x为服务器实际IP地址
7.设置免密登录
在所有NN(namenode)节点服务器上生成秘钥(执行如下命令),设置服务器之间免密登录。
ssh-****** #一路回车
将生成的公钥拷贝到其它节点(生成authorized_keys文件):
ssh-copy-id [email protected]
ssh-copy-id [email protected]
ssh-copy-id [email protected]
或者:
cp /root/.ssh/ id_rsa.pub /usr/.ssh/authorized_keys
scp /root/.ssh/ authorized_keys [email protected]:/root/.ssh/
scp /root/.ssh/ authorized_keys [email protected]:/root/.ssh/
8.设置目录路径
编辑/etc/profile文件,在文件尾添加如下内容:
export HADOOP_HOME=/usr/hadoop-3.2.1
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64/jre
export ZOOKEEPER_HOME=/usr/zookeeper-3.6.1
export PATH=$PATH:$JAVA_HOME:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin
说明:以上操作需要在每台服务器上完成;修改完成后执行命令source /etc/profile,使之立即生效。
第二步:配置zookeeper
1.修改配置文件
进入/usr/zookeeper-3.6.1/conf目录,拷贝zoo_sample.cfg文件为zoo.cfg
cd /usr/zookeeper-3.6.1/conf
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg文件,在文件中添加如下内容:
dataDir=/usr/zookeeper-3.6.1/data
dataLogDir=/usr/zookeeper-3.6.1/logs
server.1=hadoop-master:2888:3888
server.2=hadoop-slave1:2888:3888
server.3=hadoop-slave2:2888:3888
说明:server.id=host:port1:port2
其中id为一个数字,表示zk进程的id,这个id也是dataDir目录下myid文件的内容。
host是该zk进程所在的IP地址,port1表示follower和leader交换消息所使用的端口,port2表示选举leader所使用的端口。
2.生成myid文件
在dataDire目录下生成myid文件
echo ‘1’ > /usr/zookeeper-3.6.1/data/myid
说明:1为server.id=host:port1:port2中的id,在每台服务器上都要执行此命令,每台服务器myid文件内容为其所对应的id
3.拷贝zookeeper到其他服务器
scp -r /usr/zookeeper-3.6.1 [email protected]:/usr
scp -r /usr/zookeeper-3.6.1 [email protected]:/usr
说明:在hadoop-slave1和hadoop-slave2服务器上要修改myid文件的内容分别为2和3(文件均位于/usr/zookeeper-3.6.1/data目录下)
第三步:配置hadoop
在主节点服务器(hadoop-master)对hadaoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers文件进行配置。
1.配置hadoop-env.sh文件
在文件hadoop-env.sh中增加如下内容:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el8_1.x86_64/jre
说明:指定JAVA库所在主目录。
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export HDFS_RESOURCEMANAGER_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
export HDFS_JOURNALNODE_USER=root
说明:指定hadoop各模块均以root身份运行。
2.配置core-site.xml文件
在文件core-site.xml中增加以下内容:
<configuration>
<!--设置fs.defaultFS为nameservices的逻辑主机名-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdcluster</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop-3.2.1/tmp</value>
</property>
<!--指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop-master:2181,hadoop-slave1:2181,hadooop-slave2:2181</value>
</property>
</configuration>
说明:默认情况下hadoop的data和name目录在hadoop.tmp.dir指定目录下的dfs目录下,tmp目录需要手动建立,tmp目录下的dfs目录及dfs目录下的data和name目录系统会自动建立;也可在hdfs-site.xml文件中通过dfs.datanode.data.dir指定data目录,通过dfs.namenode.name.dir指定name目录。
3.配置hdfs-site.xml文件
在文件hdfs-site.xml中增加以下内容:
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.nameservices</name>
<value>hdcluster</value>
</property>
<property>
<name>dfs.ha.namenodes.hdcluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdcluster.nn1</name>
<value>hadoop-master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.hdcluster.nn2</name>
<value>hadoop-slave1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.hdcluster.nn1</name>
<value>hadoop-master:9870</value>
</property>
<property>
<name>dfs.namenode.http-address.hdcluster.nn2</name>
<value>hadoop-slave1:9870</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop-master:8485;hadoop-slave1:8485;hadoop-slave2:8485/hdcluster</value
>
</property>
<property>
<name>dfs.client.failover.proxy.provider.hdcluster</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>/usr/hadoop-3.2.1/tmp/jn</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled.hdcluster</name>
<value>true</value>
</property>
</configuration>
4.配置yarn-site.xml文件
在文件yarn-site.xml中增加以下内容:
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>hdcluster</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop-master</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop-slave1</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop-master:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop-slave1:8088</value>
</property>
<property>
<name>hadoop.zk.address</name>
<value>hadoop-master:2181,hadoop-slave1:2181,hadoop-slave2:2181</value>
</property>
</configuration>
5.配置mapred-site.xml文件
在文件mapred-site.xml文件中增加以下内容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
6.配置workers文件
在文件workers文件中增加以下内容:
hadoop-master
hadoop-slave1
hadoop-slave2
说明:workers文件中的主机为datanode节点主机名。
第四步:部署hadoop
hadoop配置文件修改好后,要将整个hadoop目录复制到其它所有服务器上。
scp -r /usr/Hadoop-3.2.1 [email protected]:/usr
scp -r /usr/Hadoop-3.2.1 [email protected]:/usr
第五步:启动hadoop高可用集群
1.启动zookeeper
在每台服务器上执行如下命令启动zookeeper:
zkServer.sh start
说明:启动hadoop高可用集群,首先要在每台服务器上启动zookeeper;zookeeper启动成功后可使用jps命令查看进程,如:
看到QuorumPeerMain表明zookeeper正在运行。
2.创建主备切换命名空间
在任意一台namenode上执行如下命令:
hdfs zkfc -formatZK
3.启动journalnode
在所有服务器上启动journalnode,执行如下命令:
hdfs –daemon start journalnode
4.格式化namenode
在主namenode上执行以下命令:
hdfs namenode -format
5.启动主备切换进程:
在每一台namenode节点服务器上执行如下命令:
hdfs –daemon start zkfc
说明:只有启动了主备切换进程DFSZKFailoverController,namenode才能自主切换主备;如果先启动了namenode,在启动DFSZKFailoverController进程,则哪个namenode为主节点是不确定的,因此,一般在启动namenode前先启动DFSZKFailoverController。
5.启动主集群
在主namenode上执行以下命令:
start-all.sh
执行成功后,在主和备namenode上使用jps会看到如下进程:
至此,一套高可用的hadoop环境搭建完成。可在浏览器中通过IP地址访问namenode和yarn集群,其中,namenode节点访问端口为:9870,yarn访问端口为:8088。