Hadoop完全分布式集群搭建 高可用ha6节点

Hadoop完全分布式集群搭建

一、CentOS 7 准备

1. 配置主机名、密码

主机名和ip地址设置

10.1.75.26 hadoop1
10.1.75.27 hadoop2
10.1.75.19 hadoop3
10.1.75.32 hadoop4
10.1.75.33 hadoop5
10.1.75.40 hadoop6
vim /etc/hosts

image-20220713085755988

密码统一设置为了111111

2. 免密登录

生成公匙

ssh-keygen -t rsa

配置到其他电脑的免密登录

ssh-copy-id root@hadoop1
ssh-copy-id root@hadoop2
ssh-copy-id root@hadoop3
ssh-copy-id root@hadoop4
ssh-copy-id root@hadoop5
ssh-copy-id root@hadoop6

3. 创建我的命令

mkdir /mybin

在这里存放我自己的sh脚本

添加环境变量

vim /etc/profile

在文件末尾添加

export PATH="/mybin/:$PATH"

刷新配置

source /etc/profile

4. 创建脚本命令执行

vim todo

输入命令

#!/bin/bash

if (($#==0)); then
  echo "nothing to do";
  exit
fi
echo --------------------$*----------------------
for i in hadoop1 hadoop2 hadoop3 hadoop4 hadoop5 hadoop6
do
    echo ---------------------$i-------------------
    ssh $i "$@"
done

image-20220713093443698

添加可执行权限

image-20220713093516881

接下来只需要输入

todo 任何命令

即可任意执行

5. 文件同步

脚本名:tongbu

#!/bin/bash

pcount=$#
if((pcount==0));then
echo "nothing to do";
exit;
fi

p1=$1 fname=`basename $p1`
echo fname=$fname

pdir=`cd -P $(dirname $p1); pwd`
echo pdir=$pdir

user=`whoami`

for i in hadoop1 hadoop2 hadoop3 hadoop4 hadoop5 hadoop6; do
  echo --------------- $i ----------------
  rsync -av $pdir/$fname $user@$i:$pdir
done

二、安装JDK和HADOOP环境

1. 上传软件安装包

创建目录/opt/software/opt/modules

mkdir /opt/software
mkdir /opt/modules

使用mobaXterm上传安装包apache-hive-3.1.3-bin.tar.gzhadoop-3.3.3.tar.gzjdk-8u11-linux-x64.tar.gz

image-20220713151636750

2. 解压缩文件

tar -zxf jdk-8u11-linux-x64.tar.gz -C /opt/modules/
tar -zxvf hadoop-3.3.3.tar.gz -C /opt/modules/

3. 配置环境变量

创建配置文件
vim /etc/profile.d/my_env.sh
配置环境变量
# 配置jdk环境变量
export JAVA_HOME=/opt/modules/jdk1.8.0_11
# 配置Hadoop环境变量
export HADOOP_HOME=/opt/modules/hadoop-3.3.3
# 拼接系统 PATH 路径
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
刷新环境配置
source /etc/profile

三、Hadoop的节点分配

搭配经典HA集群,使用六台Centos进行搭建。

1. zookeeper安装

zookeeper下载

Apache Downloads

image-20220713184424111

上传文件后解压
tar -zxvf apache-zookeeper-3.8.0-bin.tar.gz -C /opt/modules
切换路径并更名
cd /opt/modules/
mv apache-zookeeper-3.8.0-bin/ zookeeper-3.8.0
配置zoo.cfg

zoo_sample.cfg中添加,删除原有的dataDir,然后更名为zoo.cfg

cd /opt/modules/zookeeper-3.8.0/conf
mv zoo_sample.cfg zoo.cfg
vim zoo.cfg
# zookeeper 数据路径
dataDir=/opt/modules/zookeeper-3.8.0/zkData
server.1=hadoop1:2888:3888
server.2=hadoop2:2888:3888
server.3=hadoop3:2888:3888
配置myid

创建目录/opt/modules/zookeeper-3.8.0/zkData

与前面配置的路径相同,也就是配置的数据路径进行创建

cd /opt/modules/zookeeper-3.8.0/zkData
vim myid

输入与之前的id:1(同样2、3)

同步到2、3主机

复制脚本tongbu,更改为只同步到2、3机上。

cd /opt/modules/
tongbu23 zookeeper-3.8.0

image-20220713191351204

修改myid为对应的2/3
ssh root@hadoop2
cd /opt/modules/zookeeper-3.8.0/zkData
vim myid
# 改为2
ssh root@hadoop3
cd /opt/modules/zookeeper-3.8.0/zkData
vim myid
# 改为3
配置环境变量ZOOKEEPER_HOME
cd /etc/profile.d
vim my_env.sh

添加环境变量

# 配置Zookeeper环境变量
# 配置jdk环境变量
export JAVA_HOME=/opt/modules/jdk1.8.0_11
# 配置Hadoop环境变量
export HADOOP_HOME=/opt/modules/hadoop-3.3.3
# 配置Zookeeper环境变量
export ZOOKEEPER_HOME=/opt/modules/zookeeper-3.8.0
# 拼接系统 PATH 路径
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_H
OME/bin

同步并刷新配置

tongbu23 /etc/profile
todo source /etc/profile

2. 配置hadoop

配置Hadoop-env.sh
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim hadoop-env.sh

添加如下

export JAVA_HOME=/opt/modules/jdk1.8.0_11
export HADOOP_CONF_DIR = /opt/modules/hadoop-3.3.3/etc/hadoop
配置core-site.xml
cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim core-site.xml

更改内容

<configuration>

    <!--用来指定hdfs的主节点,ns为固定属性名,表示两个namenode-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://ns</value>
    </property>
    
    <!--用来指定hadoop运行时产生文件的存放目录-->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/modules/hadoop-3.3.3/data</value>
    </property>

    <!--执行zookeeper地址-->
    <property>
        <name>ha.zookeeper.quorum</name>
      <value>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    </property>
</configuration>

3. 配置hdfs-site.xml

cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim hdfs-site.xml
<configuration>
 
    <!--执行hdfs的nameservice为ns,和core-site.xml保持一致-->
    <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>hadoop1:9000</value>
    </property>
 
    <!--nn1的http通信地址-->
    <property>
        <name>dfs.namenode.http-address.ns.nn1</name>
        <value>hadoop1:50070</value>
    </property>
 
    <!--nn2的RPC通信地址-->
    <property>
        <name>dfs.namenode.rpc-address.ns.nn2</name>
        <value>hadoop2:9000</value>
    </property>

    <!--nn2的http通信地址-->
    <property>
        <name>dfs.namenode.http-address.ns.nn2</name>
        <value>hadoop2:50070</value>
    </property>

    <!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以从jn集群里获取
         最新的namenode的信息,达到热备的效果-->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop4:8485;hadoop5:8485;hadoop6:8485/ns</value>
    </property>

    <!--指定JournalNode存放数据的位置-->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/opt/modules/hadoop-3.3.3/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数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///opt/modules/hadoop-3.3.3/data/namenode</value>
    </property>

    <!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///opt/modules/hadoop-3.3.3/data/datanode</value>
        </property>
    
    <!--配置block副本数量-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>

    <!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件-->
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
 
</configuration>

4. 配置mapred-site.xml

cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim mapred-site.xml
<configuration>
    <property>
        <!--指定mapreduce运行在yarn上-->
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5. 配置yarn-site.xml

cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim yarn-site.xml
<configuration>
    <!-- 开启YARN HA -->
    <property>
       <name>yarn.resourcemanager.ha.enabled</name>
       <value>true</value>
    </property>

    <!-- 指定两个resourcemanager的名称 -->
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <!-- 配置rm1,rm2的主机 -->
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>hadoop1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>hadoop3</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>hadoop1:2181,hadoop2:2181,hadoop3:2181</value>
    <description>For multiple zk services, separate them with comma</description>
    </property>

    <!-- 指定YARN HA的名称 -->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-ha</value>
    </property>
    
    <property>
    <!--指定yarn的老大 resoucemanager的地址-->
    <name>yarn.resourcemanager.hostname</name>
    <value>hadoop1</value>
    </property>

    <property>
    <!--NodeManager获取数据的方式-->
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

</configuration>

6. 配置 workers文件

没有就自己建,填写数据节点主机名

cd /opt/modules/hadoop-3.3.3/etc/hadoop
vim workers
hadoop4
hadoop5
hadoop6

出现问题,在hadoop2.x中,此处应该建立的是文件slaves,但在hadoop3.x中已经换为了workers,让我好找,出现问题就是datanode和nodemanager都不启动

7. 根据配置文件创建对应文件夹

cd /opt/modules/hadoop-3.3.3
mkdir journal
mkdir -p data/namenode data/datanode

8. 文件统一

cd /opt/modules
tongbu hadoop-3.3.3
tongbu  jdk1.8.0_11

image-20220713203053337

建议内网尝试?

四、Hadoop初次集群启动

1. zookeeper启动

zkServer.sh start

image-20220713203438659

报错1

修正前方错误,要求zookeeper下的zoo_sample.cfg中添加配置,并且改名为zoo.cfg

image-20220713203950192

原以为启动成功,使用myjps发现只有Hadoop1上成功启动,检查日志

image-20220713210223111

报错2

image-20220713210338541

启动的时候!需要在每台节点上启动,真的无语子

todo zkServer.sh start

2. 格式化zookeeper

todo zkServer.sh status

查看那台电脑是leader,切换到其上

image-20220714085950660

ssh hadoop2
hdfs zkfc -formatZK

image-20220714090051582

3. 启动journalnode集群(在4,5,6上)

ssh hadoop4
hadoop-daemon.sh start journalnode
ssh hadoop5
hadoop-daemon.sh start journalnode
ssh hadoop6
hadoop-daemon.sh start journalnode

image-20220714090416259

4. 格式化hadoop1 namenode

ssh hadoop1
hdfs namenode -format

image-20220714092535286

5. 启动hadoop1 上的namenode

ssh hadoop
hadoop-daemon.sh start namenode

6. 把hadoop2上的namenode节点变为standby namenode节点

ssh hadoop2
hdfs namenode -bootstrapStandby

image-20220714095159904

7. 启动hadoop2上的namenode节点

ssh hadoop2
hadoop-daemon.sh start namenode

image-20220714095426709

8. 启动4、5、6上的datanode

ssh hadoop4
hadoop-daemon.sh start datanode
ssh hadoop5
hadoop-daemon.sh start datanode
ssh hadoop6
hadoop-daemon.sh start datanode

image-20220714095742579

9. 启动zkfc(FalioverControllerActive)

在hadoop1、hadoop2上执行

ssh hadoop1
hadoop-daemon.sh start zkfc
ssh hadoop2
hadoop-daemon.sh start zkfc

10. 在hadoop1上启动 主ResourceManger

ssh hadoop1
start-yarn.sh

报错!信息:

image-20220714103602094

原因是没有添加YARN的设置路径等,在start-yarn.sh和stop-yarn.sh中添加第一行添加配置

YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

为了解决类似问题还需要再start-dfs.sh和stop-dfs.sh中第一行添加配置

HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root
HDFS_JOURNALNODE_USER=root
HDFS_ZKFC_USER=root

11. 在hadoop3上启动副resourcemanger

ssh hadoop3
arn-daemon.sh start resourcemanager

五、后续集群集群

启动

ssh hadoop1
todo zkServer.sh start
start-all.sh

停止

ssh hadoop1
stop-all.sh
todo zkServer.sh stop

六、集群测试

1. myjps

ssh hadoop1
myjps

image-20220714140312981

2. 查看namenode信息

输入网址查看standby节点数据:

Hadoop1 namenode信息 http://10.1.75.26:50070

image-20220714135932914

输入 输入网址查看active节点数据:

Hadoop2 namenode信息 http://10.1.75.27:50070

image-20220714140112046

3. 停掉正在运行的namenode

ssh hadoop2
hadoop-daemon.sh stop namenode

image-20220714140401551

hadoop1 从standby变为active

image-20220714140421165

4. 查看yarn的管理地址

输入网址查看standby节点数据:

Hadoop1 yarn信息 http://10.1.75.26:8088

image-20220714140634966

此时应该不能访问hadoop3上的resourcemanager

image-20220714140751334

停掉Hadoop1的yarn

ssh hadoop1
yarn-daemon.sh stop resourcemanager

image-20220714140948594

此时发生自动切换

image-20220714141252106

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值