AlexRomeo
发布于 2024-05-25 / 51 阅读
1
0

HadoopHA搭建

Hadoop的HA环境介绍

因为在教学环境中,所能够使用的电脑性能问题导致,不能开出更多虚拟机进行操作,故此使用3台来进行模拟集群。

节点1(Hadoop01)节点2(Hadoop02)节点3(Hadoop03)
NN1NN2
ZKFCZKFC
JNJNJN
ZKZKZK
DNDNDN

部署

检查阶段

  • 检查每台服务器是否都安装了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状态。


评论