关注互联网应用及运维技术的个人博客

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

Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用,两者的实现基本类似,但 HDFS NameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多,所以它的实现也更加复杂。

集群规划

我这里用的是 Centos Linux 7.7,通过虚拟机进行链接克隆,总共是三台虚拟机。集群的规划如下:

节点名称NNJournalnodeDNZKFCRMZKNM
hadoop01 
hadoop02
Hadoop03 

基本配置

首先肯定是跟之前的 hadoop 分布式搭建相同,第一步做的都是关闭防火墙,修改主机名,配置 hosts 主机映射,然后再配置 ssh 免密登陆。

将三台虚拟机的防火墙关闭

systemctl stop firewalld

修改主机名使用如下命名修改主机名,完成之后exit登出虚拟机,然后重新登陆,修改完成。

hostnamectl set-hostname hadoop01
hostnamectl set-hostname hadoop02
hostnamectl set-hostname hadoop03

修改主机映射配置完成之后,最好用ping命令查看一下,检验是否配置成功。

vi /etc/hosts
192.168.56.119 hadoop01
192.168.56.120 hadoop02
192.168.56.121 hadoop03

配置 ssh 免密登陆首先到每一台的机子上使用第一个命令生成公钥/私钥对,然后再将本地生成的公钥拷贝到需要登陆的虚拟机上即可。其中第二个命令最好也给自己拷贝一份。配置完成之后可以使用ssh hostname检验是否成功。

1.ssh-keygen -t rsa
2.ssh-copy-id hostname

环境搭建

我将所需要用到的环境安装包统一放在/opt/software下,然后解压到/usr/local/apps/目录下。

lHwx4x.md.png

安装 JDK 环境

首先将 JDK 安装包解压,并修改文件夹名称

tar -zxvf jdk.tar.gz -C /usr/local/apps/
mv jdk1.8.0_131 jdk

配置环境变量

vi /etc/profile
export JAVA_HOME=/usr/local/apps/jdk
export PATH=$JAVA_HOME/bin:$PATH

装载配置文件

source /etc/profile 

然后使用 java -version查看 jdk 版本,jdk 配置完成。

将配置完成的 jdk 拷贝到另外两台虚拟机上

[[email protected] bin]# scp /etc/profile hadoop02:/etc/profile
[[email protected] bin]# scp /etc/profile hadoop03:/etc/profile
[[email protected] apps]# scp -r jdk/ hadoop02:$PWD
[[email protected] apps]# scp -r jdk/ hadoop03:$PWD
[[email protected] bin]# source /etc/profile
[[email protected] bin]# source /etc/profile

记得在另外两台虚拟机上创建 apps 文件夹,到此 jdk 的安装就完成了。

Zookeeper 集群搭建

首先安装 zookeeper 的环境, 搭建完成之后启动 zookeeper 集群。

安装 zookeeper 集群

首先将 zookeeer 安装包解压,并修改文件夹名称

tar -zxvf zookeeper-3.4.5.tar.gz -C /usr/local/apps/
mv zookeeper-3.4.5 zookeeper

在 zookeeper 目录下创建 data 和 log 文件夹

mkdir data
mkdir log

进入 zookeeper 的 conf 目录下修改 zoo.cfg

cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
  
dataDir=/usr/local/apps/zookeeper/data
dataLogDir=/usr/local/apps/zookeeper/log
  
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888

在 data 文件下创建 myid 文件

[[email protected] data]# echo 1 > myid

配置 zookeeper 的环境变量,并装载环境变量

export ZOOKEEPER_HOME=/usr/local/apps/zookeeper
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME:/bin:$PATH

将配置好的 zookeeper 发送到另外两台虚拟机上,并修改对应的 myid 文件

[[email protected] bin]# scp -r zookeeper/ hadoop02:$PWD
[[email protected] bin]# scp -r zookeeper/ hadoop03:$PWD
[[email protected] data]# echo 2 > myid
[[email protected] data]# echo 3 > myid
[[email protected] bin]# source /etc/profile
[[email protected] bin]# source /etc/profile

启动 zookeeper 集群

节点启动

[[email protected] bin]# ./zkServer.sh start

查看节点状态

安装 Hadoop 环境

hadoop 的搭建我分为两部分,一部分是环境配置,一部分是修改配置文件。

环境搭建

首相将 hadoop 安装包解压,并修改文件夹名称

[[email protected] apps]# mv hadoop-2.6.0 hadoop

配置环境变量,并装载

[[email protected] apps]# vi /etc/profile
export HADOOP_HOME=/usr/local/apps/hadoop
export PATH=$JAVA_HOME/bin:$ZOOKEEPER_HOME:/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
[[email protected] apps]# source /etc/profile

修改配置文件

hadoop-env.sh

export JAVA_HOME=/usr/local/apps/jdk

core-site.xml

<configuration>
        <property>
                <name>fs.defaultFS</name>
                <value>hdfs://mycluster</value>
        </property>
  
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/apps/hadoop/data/tmp</value>
        </property>
  
        <property>
                <name>ha.zookeeper.quorum</name>
                <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
        </property>
</configuration>

hdfs-site.xml

<configuration>
	<property>
		<name>dfs.replication</name>
		<value>2</value>
	</property>
  
	<property>
		<name>dfs.nameservices</name>
		<value>mycluster</value>
	</property>
  	
	<property>
		<name>dfs.namenode.name.dir</name>
		<value>/usr/local/apps/hadoop/dfs/namenode</value>
	</property>
  
	<property>
		<name>dfs.datanode.data.dir</name>
		<value>/usr/local/apps/hadoop/dfs/datanode</value>
	</property>
  
	<property>
		<name>dfs.ha.namenodes.mycluster</name>
		<value>nn1,nn2</value>
	</property>
  	
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn1</name>
		<value>hadoop01:8020</value>
	</property>
  	
	<property>
		<name>dfs.namenode.rpc-address.mycluster.nn2</name>
		<value>hadoop02:8020</value>
	</property>
  
	<property>
		<name>dfs.namenode.http-address.mycluster.nn1</name>
		<value>hadoop01:50070</value>
	</property>
  
	<property>
		<name>dfs.namenode.http-address.mycluster.nn2</name>
		<value>hadoop02:50070</value>
	</property>
  
	<property>
		<name>dfs.namenode.shared.edits.dir</name>
		<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
	</property>
  
	<property>
		<name>dfs.journalnode.edits.dir</name>
		<value>/usr/local/apps/hadoop/data/journalnode</value>
	</property>
  
	<property>
		<name>dfs.ha.fencing.methods</name>
		<value>
			sshfence
			shell(/bin/true)
		</value>
	</property>
    
        <property>
                <name>dfs.client.failover.proxy.provider.mycluster</name>
                <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
        </property>
    
	<property>
		<name>dfs.ha.automatic-failover.enabled</name>
		<value>true</value>
	</property>
  
</configuration>

Mapped-site.xml

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
</configuration>

yarn-site.xml

<configuration>
  
<!-- Site specific YARN configuration properties -->
	<property>
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property>		
  
	<property>
		<name>yarn.resourcemanager.ha.enabled</name>
		<value>true</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.cluster-id</name>
		<value>rmCluster</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.ha.rm-ids</name>
		<value>rm1,rm2</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.hostname.rm1</name>
		<value>hadoop02</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.hostname.rm2</name>
		<value>hadoop03</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.webapp.address.rm1</name>
		<value>hadoop02:8088</value>
	</property>	
  	
	<property>
		<name>yarn.resourcemanager.webapp.address.rm2</name>
		<value>hadoop03:8088</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.zk-address</name>
		<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
	</property>
  	
	<property>
		<name>yarn.resourcemanager.recovery.enabled</name>
		<value>true</value>
	</property>
  
	<property>
		<name>yarn.resourcemanager.store.class</name>
		<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
	</property>
  	
</configuration>

slaves

hadoop01
hadoop02
hadoop03

配置完成之后将 hadoop 文件夹和环境变量分发到另外两台虚拟机

[[email protected] apps]# scp -r hadoop/ hadoop02:$PWD
[[email protected] apps]# scp -r hadoop/ hadoop03:$PWD
[[email protected] hadoop]# scp /etc/profile hadoop02:/etc/profile
[[email protected] hadoop]# scp /etc/profile hadoop03:/etc/profile

启动集群

再配置的各个 journalnode 节点启动该进程

[[email protected] hadoop]# hadoop-daemon.sh start journalnode
[[email protected] hadoop]# hadoop-daemon.sh start journalnode
[[email protected] hadoop]# hadoop-daemon.sh start journalnode

在第一次 namenode 节点上格式化文件系统

[[email protected] hadoop]# hadoop namenode -format 

格式化 ZKFC

[[email protected] sbin]# hdfs zkfc -formatZK

启动 hadoop

[[email protected] sbin]# start-dfs.sh

同步两个 namenode 的元数据在 hadoop02 下执行一下命令:

[[email protected] sbin]# hadoop namenode -bootstrapStandby

到此 hdfs 的高可用已经搭建好了,可以去浏览器查看 ui 界面。

启动 yarn这里还需要另外在 hadoop03 上手动启动 yarn

[[email protected] bin]# start-yarn.sh
[[email protected] apps]# yarn-daemon.sh start resourcemanager

启动 mapreduce 任务历史服务器

[[email protected] apps]# mr-jobhistory-daemon.sh start historyserver
[[email protected] apps]# mr-jobhistory-daemon.sh start historyserver
[[email protected] apps]# mr-jobhistory-daemon.sh start historyserver
  • 检验高可用只需要kill -9 杀死对应的进程即可,standby 节点会自动成为 active 节点。
赞(0)
未经允许不得转载:飞天狒狒 » Hadoop HA 高可用分布式集群搭建

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址