Hadoop的HA环境介绍
因为在教学环境中,所能够使用的电脑性能问题导致,不能开出更多虚拟机进行操作,故此使用3台来进行模拟集群。
节点1(Hadoop01) | 节点2(Hadoop02) | 节点3(Hadoop03) |
---|---|---|
NN1 | NN2 | |
ZKFC | ZKFC | |
JN | JN | JN |
ZK | ZK | ZK |
DN | DN | DN |
部署
检查阶段
- 检查每台服务器是否都安装了JDK、Zookeeper、Hadoop,并且配置了环境变量。
- 检查Hosts文件中是否与当前环境所用的服务器都做了映射关系
- 检查集群之间的免密登录功能是否成功,三台之间必须能够实现互相访问时免密访问。
- 检查主机名是否进行(不改也,但不便于区分主机信息)
- 关闭防火墙
部署阶段
由于当前集群环境是3台,其工作量并不是很大,所以在进行部署的时候,可以优先对其第一台进行配置,此后将配置文件发送给其他两台。
配置三台的免密登录
在01服务器上进行证书的生成
ssh-keygen
01服务器向自身进行注册
ssh-copy-id root@hadoop01
将私钥证书文件及注册后保存的文件发送给02和03
scp -r /root/.ssh/ root@hadoop02:/root
scp -r /root/.ssh/ root@hadoop03:/root
上述内容中需要输入服务器的密码
发送hosts文件
scp /etc/hosts root@hadoop02:/etc/
scp /etc/hosts root@hadoop03:/etc/
配置zookeeper
它的运行需要JDK的支持,此时就必须要求安装Zookeeper的服务器上面有JDK。
Zookeeper解压之后就拥有了所有的文件,进入到Zookeeper才conf目录。
cd /opt/software_package/zookeeper-3.4.8/conf
复制模板文件
cp zoo_sample.cfg zoo.cfg
编辑配置文件
vim zoo.cfg
修改12行的内容如下:
dataDir=/opt/software_package/zookeeper-3.4.8/tmp
接着在文件的末尾进行追加内容:
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
在Zookeeper的根目录下创建tmp目录,并且进入该目录
mkdir /opt/software_package/zookeeper-3.4.8/tmp
在zk的tmp目录下创建myid文件
echo 1 > myid
分发软件到02、03
先通过命令远程创建目录
ssh root@hadoop02 'mkdir /opt/software_package'
ssh root@hadoop03 'mkdir /opt/software_package'
发送软件
scp -r {jdk1.8.0_131,zookeeper-3.4.8} root@hadoop02:/opt/software_package/
scp -r {jdk1.8.0_131,zookeeper-3.4.8} root@hadoop03:/opt/software_package/
发送系统环境配置文件
scp /etc/profile root@hadoop02:/etc
scp /etc/profile root@hadoop03:/etc
分别在02、03上面进行myid的内容修改,按照集群的序号进行修改数字即可。
# 在02执行
echo 2 > myid
# 在03执行
echo 3 > myid
启动Zookeeper集群
启动zk,进入zk的bin目录下执行命令,其执行顺序是在01、02、03,分别需要在这三台上面执行命令。
./zkServer.sh start
当zk集群还未启动过半时,整个集群处于不能用的状态。查询节点状态时,会显示没有运行。
集群启动成功后,没有特殊情况的话01、03节点属于follower状态,02为leader节点。
配置Hadoop集群
hadoop-evn.sh
# 在文件的第一行新增内容:
source /etc/profile
# 第34行文件修改成如下:
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
执行命令,使其生效
source hadoop-env.sh
core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--指定HDFS的nameservice,为了整个集群起一个别名-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<!--指定Hadoop的数据存放目录-->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/software_package/hadoop-2.7.1/tmp</value>
</property>
<!--指定Zookeeper的地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<!-- Put site-specific property overrides in this file. -->
<configuration>
<!--执行HDFS的NameServices为ns,需要此处的ns是和core-site文件中保持一致的-->
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<!--ns集群中有两个namenode,分别为nn1,nn2-->
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<!--配置nn1的rpc通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>hadoop01:9000</value>
</property>
<!--配置nn1的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>hadoop01:50070</value>
</property>
<!--配置nn2的rpc通信地址-->
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>hadoop02:9000</value>
</property>
<!--配置nn2的http通信地址-->
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>hadoop02:50070</value>
</property>
<!--指定NameNode1的元数据存放在JournalNode上面,NameNode2可以从JournalNode上面获取信息,从而达到热备的效果-->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/ns</value>
</property>
<!--配置JournalNode的数据存放在本地磁盘上-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/software_package/hadoop-2.7.1/tmp/journal</value>
</property>
<!--开启NameNode的故障转移-->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!--自动切换的实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.ns</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!--配置隔离机制-->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!--namenode存储的元数据目录-->
<property>
<name>dfs.namenode.name.dir</name>
<value>file:///opt/software_package/hadoop-2.7.1/tmp/hdfs/name</value>
</property>
<!--datanode存储的元数据目录-->
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///opt/software_package/hadoop-2.7.1/tmp/hdfs/data</value>
</property>
<!--配置副本数量-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!--设定hdfs的用户操作权限,false表示关闭验证-->
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml
此文件默认不存在,需要执行命令创建出来
cp mapred-site.xml.template mapred-site.xml
编写mapred-site.xml文件
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
yarn-site.xml
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<!--配置yarn的高可用-->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!--指定两个resourcemaneger的名称-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!--配置rm1的主机-->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop01</value>
</property>
<!--配置rm2的主机-->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<!--开启yarn恢复机制-->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!--执行rm恢复机制实现类-->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<!--配置zookeeper的地址-->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<!--执行yarn集群的别名-->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>ns-yarn</value>
</property>
<!-- 指定nodemanager启动时加载server的方式为shuffle server -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定resourcemanager地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
</configuration>
slaves
hadoop01
hadoop02
hadoop03
启动Hadoop集群
因为是集群环境,在启动之前,需要将配置好的Hadoop分发给02、03节点。
scp -r hadoop-2.7.1 root@hadoop02:/opt/software_package/
scp -r hadoop-2.7.1 root@hadoop03:/opt/software_package/
在zk的leader节点上执行格式化命令
hdfs zkfc -formatZK
启动JN节点
hadoop-daemons.sh start journalnode
此命令运行结束后,在三台服务器上会出现JournalNode节点信息。
在第一台节点上进行格式化NameNode
hadoop namenode -format
当在第一台上面执行格式化成功之后,立即在第一台上面执行启动Hadoop的namenode
hadoop-daemon.sh start namenode
在第二台节点上进行格式化NameNode
hdfs namenode -bootstrapStandby
在第二台节点上进行启动Namenode
hadoop-daemon.sh start namenode
启动三台的DataNode节点
hadoop-daemons.sh start datanode
在第一台和第二台节点上,启动zkfc(请注意,两台都要执行此命令)
hadoop-daemon.sh start zkfc
在第一台上面启动yarn.sh
start-yarn.sh
在第三台节点上,启动ResourceManager
yarn-daemon.sh start resourcemanager
至此,Hadoop的HA高可用已完成部署。可以通过kill掉其中一台Active状态的NameNode节点来测试第二台NameNode节点是否自动进入Active状态。