Hadoop之分布式搭建高可用集群

一、Hadoop分布式环境搭建

1.虚拟机环境准备

  1. 准备一台虚拟机,操作系统centos7.x
  2. 配置虚拟机的静态ip
  3. 修改主机名为hadoop101并进行端口映射
[root@master ~]# vi /etc/hostname
master
[root@master ~]# vi /etc/hosts
192.168.247.200 master

此时需要重启机器 reboot

  1. 关闭防火墙
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld

禁用selinux

[root@master ~]# vi /etc/selinux/config

将selinux=enforcing改成selinux=disabled
在这里插入图片描述

  1. 配置时钟同步

(1) ntp服务安装

[root@master ~]# yum -y install ntp
[root@master ~]# rpm -qa|grep ntp
ntpdate-4.2.6p5-29.el7.centos.2.x86_64
ntp-4.2.6p5-29.el7.centos.2.x86_64

(2) 修改ntp配置文件
写一个定时同步网络时间到硬件的脚本

[root@master ~]# crontab -e

编辑模式下输入

*/1 * * * * /usr/sbin/ntpdate -u pool.ntp.org;clock -w

保存退出
(3) 重新启动ntpd

[root@master ~]# systemctl stop ntpd
[root@master ~]# systemctl start ntpd

(4) 设置为开机启动

[root@master ~]# systemctl enable ntpd.service
  1. 创建文件夹
    在/opt目录下创建download、software文件夹,分别用来存放安装包和程序
[root@master ~]# cd /opt/
[root@master opt]# mkdir download software
[root@master opt]# ls
download  software

2.安装jdk1.8

(1) 如果已经安装jdk1.8以上版本,可忽略此操作
(2) 用Xftp工具将jdk安装包导入到/opt/download目录下
(3) 将安装包解压到/opt/software下

[root@master hadoop]# tar -zxvf jdk-8u111-linux-x64.tar.gz -C /opt/software
[root@master opt]# cd software/
[root@master software]# ls
jdk1.8.0_111

(4) 给文件重命名,更加简洁

[root@master software]# mv jdk1.8.0_111/ jdk180
[root@master software]# ls
jdk180

(5) 进入jdk目录,复制jdk所在路径

[root@master software]# cd jdk180/
[root@master jdk180]# pwd
/opt/software/jdk180

(6) 配置jdk环境变量

[root@master software]# vi /etc/profile

在文件最后加入环境变量,然后保存退出

export JAVA_HOME=/opt/software/jdk180
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar

在这里插入图片描述
(7) 验证
先source /etc/profile激活环境变量,然后查看jdk版本

[root@master jdk180]# source /etc/profile
[root@master jdk180]# java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)

3.安装Hadoop

先让本机能够免密登录linux ssh 免密登录

(1) 下载
Hadoop下载地址
用Xftp工具将hadoop-2.6.0-cdh5.14.2.tar.gz导入到/opt/download/hadoop目录下
(2) 解压
进入hadoop压缩包所在目录,执行解压命令,解压到/opt/software目录下

[root@master hadoop]# tar -zxvf hadoop-2.6.0-cdh5.14.2.tar.gz -C /opt/software

(3) 查看是否解压成功并重命名

[root@master hadoop]# cd ../../software/
[root@master software]# ls
hadoop-2.6.0-cdh5.14.2  jdk180
[root@master software]# mv hadoop-2.6.0-cdh5.14.2/ hadoop260
[root@master software]# ls
hadoop260  jdk180

把download里的native包,解压到software下hadoop里的lib/native目录下

(4) 将hadoop添加到环境变量

[root@master software]# cd hadoop260/
[root@master hadoop260]# pwd
/opt/software/hadoop260
[root@master hadoop260]# vi /etc/profile

在最后加入下面的环境变量

export HADOOP_HOME=/opt/software/hadoop260
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin

记得source /etc/profile查看结果

[root@master hadoop260]# hadoop version
Hadoop 2.6.0-cdh5.14.2
Subversion http://github.com/cloudera/hadoop -r 5724a4ad7a27f7af31aa725694d3df09a68bb213
Compiled by jenkins on 2018-03-27T20:40Z
Compiled with protoc 2.5.0
From source with checksum 302899e86485742c090f626a828b28
This command was run using /opt/software/hadoop260/share/hadoop/common/hadoop-common-2.6.0-cdh5.14.2.jar

(5) 配置集群
Hadoop的配置文件全部在$HADOOP_HOME/etc/hadoop目录下,下面不再说明

切换目录

[root@master hadoop260]# cd $HADOOP_HOME/etc/hadoop

先配置hdfs
(a)配置:hadoop-env.sh
Linux系统中获取jdk的安装路径:
可以通过echo $JAVA_HOME查看

[root@master hadoop260]# vi hadoop-env.sh

修改JAVA_HOME 路径:

export JAVA_HOME=/opt/software/jdk180

(b)配置:core-site.xml
在hadoop260下创建/data/tmp

[root@master hadoop260]# vi core-site.xml

在< configuration></ configuration>之间写入配置信息

<configuration>
<!-- 指定HDFS中NameNode的地址 -->
<property>
	<name>fs.defaultFS</name>
    <value>hdfs://192.168.247.200:9000</value>
</property>

<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
	<name>hadoop.tmp.dir</name>
	<value>/opt/software/hadoop260/data/tmp</value>
</property>
</configuration>

(c)配置:hdfs-site.xml

[root@master hadoop260]# vi hdfs-site.xml

在< configuration></ configuration>之间写入配置信息

<configuration>
<!-- 指定HDFS副本的数量 -->
	<property>
		<name>dfs.replication</name>
		<value>1</value>
	</property>
</configuration>

再配置yarn
(a)配置mapred-site.xml

[root@master hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

(b)配置yarn-site.xml

[root@master hadoop]# vi yarn-site.xml
<configuration>
    <!-- reducer取数据的方式是mapreduce_shuffle -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
</configuration>

(6) 启动集群

(a)格式化NameNode(第一次启动时格式化,以后就不要格式化,多次格式化会导致namenode无法启动)

[root@master hadoop]# hdfs namenode -format

(b)启动集群

[root@master hadoop]# start-dfs.sh
[root@master hadoop]# jps

在这里插入图片描述

[root@master hadoop]# start-yarn.sh

在这里插入图片描述
(c)web端查看HDFS文件系统
http://192.168.247.200:50070
在这里插入图片描述
此时分布式环境搭建完成


二、ZooKeeper完全分布式环境搭建

(1) 解压zookeeper

[root@master hadoop]# tar -zxvf zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/software/

(2) 进入安装目录,改名

[root@master software]# ls
hadoop260  jdk180  zookeeper-3.4.5-cdh5.14.2
[root@master software]# mv zookeeper-3.4.5-cdh5.14.2/ zookeeper345
[root@master software]# ls
hadoop260  jdk180  zookeeper345

(3) zookeeper目录下创建mydata文件夹,mydata下创建一个myid文件,myid里只需要写机器序号

(4) 进入conf目录,拷贝一份zoo_sample.cfg 命名为zoo.cfg 防止配置时写错

[root@master zookeeper345]# cd conf/
[root@master conf]# cp zoo_sample.cfg zoo.cfg
[root@master conf]# vi zoo.cfg

修改如图所标注的地方
在这里插入图片描述
(5) 配置环境变量

[root@master conf]# vi /etc/profile

在这里插入图片描述
激活环境变量

[root@master conf]# source /etc/profile

(6) 启动zookeeper
在这里插入图片描述
zookeeper配置完成!


三、Hadoop高可用集群搭建

1.准备

(a) 搭建好一个Hadoop完全分布式集群(可以未进行namenode格式化),此处用到三台机器master、slave1、slave2
(b) ZooKeeper完全分布式环境已经安装完成


2.HDFS-HA(High Available)

a.配置 HDFS-HA 集群

master slave1 slave2
NameNode NameNode
ResourceManager ResourceManager
ZKFC ZKFC
DataNode DataNode DataNode
JournalNode JournalNode JournalNode
NodeManager NodeManager NodeManager
ZooKeeper ZooKeeper ZooKeeper

(1) 在第一台机器 (master) 配置core-site.xml

<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
		<property>
			<name>fs.defaultFS</name>
        	<value>hdfs://mycluster</value>
		</property>

		<!-- 指定hadoop运行时产生文件的存储目录 -->
		<property>
			<name>hadoop.tmp.dir</name>
			<value>/opt/software/hadoop260/data/tmp</value>
		</property>
</configuration>

(2) 在第一台机器 (master) 配置hdfs-site.xml

<configuration>
        <!-- 完全分布式集群名称 -->
        <property>
                <name>dfs.nameservices</name>
                <value>mycluster</value>
        </property>

        <!-- 集群中NameNode节点都有哪些,这里是nn1和nn2 -->
        <property>
                <name>dfs.ha.namenodes.mycluster</name>
                <value>nn1,nn2</value>
        </property>

        <!-- nn1的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn1</name>
                <value>master:9000</value>
        </property>

        <!-- nn2的RPC通信地址 -->
        <property>
                <name>dfs.namenode.rpc-address.mycluster.nn2</name>
                <value>slave1:9000</value>
        </property>

        <!-- nn1的http通信地址 -->
        <property>
                <name>dfs.namenode.http-address.mycluster.nn1</name>
                <value>master:50070</value>
        </property>

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

        <!-- 指定NameNode元数据在JournalNode上的存放位置 -->
        <property>
                <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>

        <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应,多个机制用换行分割,即每个机制占用一行 -->
        <property>
                <name>dfs.ha.fencing.methods</name>
                <value>
                        sshfence
                        shell(/bin/true)
                </value>
        </property>

        <!-- 使用隔离机制时需要ssh无秘钥登录-->
        <property>
                <name>dfs.ha.fencing.ssh.private-key-files</name>
                <value>/home/hadoop/.ssh/id_rsa</value>
        </property>

        <!-- 声明journalnode服务器存储目录-->
        <property>
                <name>dfs.journalnode.edits.dir</name>
                <value>/opt/software/hadoop260/data/jn</value>
        </property>

        <!-- 关闭权限检查-->
        <property>
                <name>dfs.permissions.enable</name>
                <value>false</value>
        </property>

        <!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
        <property>
                <name>dfs.client.failover.proxy.provider.mycluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
</configuration>

(3) 拷贝配置好的hadoop环境到其他节点

[root@master hadoop]# scp core-site.xml root@slave1:$PWD
[root@master hadoop]# scp hdfs-site.xml root@slave1:$PWD

b.启动 HDFS-HA 集群

(1) 在各个JournalNode节点上,输入以下命令启动journalnode服务

$HADOOP_HOME/sbin/hadoop-daemon.sh start journalnode

(2) 在[nn1]上,对其进行格式化,并启动
(如果之前已经格式化过,此处格式化会导致namenode和datanode VRESION中的clusterID不一致,进而导致datanode无法启动。解决方案:修改datanode中的clusterID与namenode中的clusterID相同)

[root@master tmp]# $HADOOP_HOME/bin/hdfs namenode -format
[root@master tmp]# $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

(3) 在[nn2]上,同步nn1的元数据信息

[root@slave1 tmp]# $HADOOP_HOME/bin/hdfs namenode -bootstrapStandby

(4) 启动[nn2]

[root@slave1 tmp]# $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode

(5) 查看web页面显示
在这里插入图片描述
在这里插入图片描述
(6) 在[nn1]上,启动所有datanode

[root@master tmp]# $HADOOP_HOME/sbin/hadoop-daemons.sh start datanode

(7) 将[nn1]切换为Active

[root@master tmp]# $HADOOP_HOME/bin/hdfs haadmin -transitionToActive nn1

(8) 查看是否Active

[root@master tmp]# $HADOOP_HOME/bin/hdfs haadmin -getServiceState nn1

在这里插入图片描述

c.配置 HDFS-HA 自动故障转移

  1. 具体配置
    (1) 在hdfs-site.xml中增加
<property>
	<name>dfs.ha.automatic-failover.enabled</name>
	<value>true</value>
</property>

(2) 在core-site.xml文件中增加

<property>
	<name>ha.zookeeper.quorum</name>
	<value>master:2181,slave1:2181,slave2:2181</value>
</property>

  1. 启动

(1) 关闭所有HDFS服务

stop-dfs.sh

(2) 启动Zookeeper集群

zkServer.sh start

(3) 初始化 HA 在 Zookeeper 中状态

hdfs zkfc -formatZK

(4) 启动HDFS服务

start-dfs.sh

(5) 在各个NameNode节点上启动DFSZK Failover Controller,先在哪台机器启动,哪个机器的NameNode就是Active NameNode(默认start-dfs.sh已经自动启动,以下是单独启动的命令)

hadoop-daemon.sh start zkfc

  1. 验证

(1) 将Active NameNode进程kill

kill -9 namenode的进程id

(2) 将Active NameNode机器断开网络

service network stop

3.YARN-HA

a.配置YARN-HA集群

  1. 规划集群
master slave
ResourceManager ResourceManager
  1. 具体配置

(1) yarn-site.xml

<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>

    <!--启用resourcemanager ha-->
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property>

    <!--声明两台resourcemanager的地址-->
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>cluster-yarn1</value>
    </property>

    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>master</value>
    </property>

    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>slave1</value>
    </property>

    <!--指定zookeeper集群的地址-->
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>master:2181,slave1:2181,slave2:2181</value>
    </property>

    <!--启用自动恢复-->
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>

    <!--指定resourcemanager的状态信息存储在zookeeper集群-->
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>

</configuration>

(2) 同步更新其他节点的yarn-site.xml配置信息

[root@master hadoop]# scp yarn-site.xml root@slave1:$PWD

b.启动yarn

(1) 在 master 中执行

start-yarn.sh

(2) 在 slave1 中执行

yarn-daemon.sh start resourcemanager

(3) 查看服务状态

yarn rmadmin -getServiceState rm1

在这里插入图片描述
(4) 查看web端显示
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_48482704/article/details/110950177
今日推荐