最近在自己的笔记本电脑上搭建了Apache Hadoop分布式集群,采用了最新的稳定版本2.8,并配置了NameNode、ResourceManager的HA高可用,方便日常对Hadoop的研究与测试工作。详细的搭建过程如下:
1、安装docker,创建docker容器,用于搭建hadoop节点
docker真是个好东西啊,当要在自己的笔记本上搭建分布式集群时,由于CPU、内存、磁盘有限,无法在VMware上虚拟出太多节点,这时使用docker创建几个容器,就能轻松搭建一个分布式集群了。
(1)先在VMware上安装centos6.9,作为宿主机,然后安装docker,具体过程见我另一篇博文:Centos6.9安装docker
(2)然后再docker hub中拉取centos镜像,用于创建分布式集群的节点,推荐在docker中安装centos6(docker中的centos7有坑,被坑过,呜呜),具体过程见我另一篇博文:docker中安装centos6
(3)centos镜像准备好后,就开始创建docker容器,用于搭建hadoop的节点
# 创建4个节点,用于搭建hadoop
docker run -it --name hadoopcentos1 centos:6 /bin/bash
docker run -it --name hadoopcentos2 centos:6 /bin/bash
docker run -it --name hadoopcentos3 centos:6 /bin/bash
docker run -it --name hadoopcentos4 centos:6 /bin/bash
# 启动容器
docker start hadoopcentos1
docker start hadoopcentos2
docker start hadoopcentos3
docker start hadoopcentos4
注意:这时要把宿主机的防火墙关掉、selinux设为不可用
# 关掉防火墙
chkconfig iptables off
service iptables stop
# 设置 selinux 为不可用,在config文件中修改SELINUX配置项
vi /etc/selinux/config
SELINUX=disabled
2、规划hadoop集群
本次共创建了4个hadoop节点,并实现NameNode HA、ResourceManager HA,节点规划如下
hadoop集群节点规划
Docker 容器 | ip地址 | 主机名 | 节点进程 |
---|---|---|---|
hadoopcentos1 | 172.17.0.1 | hd1 | NameNode(active)、JournalNode、Zookeeper、ZKFC |
hadoopcentos2 | 172.17.0.2 | hd2 | NameNode(standby)、JournalNode、Zookeeper、ZKFC、NodeManager、DataNode |
hadoopcentos3 | 172.17.0.3 | hd3 | ResourceManager(active)、JournalNode、Zookeeper、NodeManager、DataNode |
hadoopcentos4 | 172.17.0.4 | hd4 | ResourceManager(standby)、NodeManager、DataNode |
NameNode HA部署在hd1、hd2,ResourceManager HA部署在hd3、hd4,其它进程见上表
3、配置Docker容器基本环境
由于在Docker中拉取的centos 6镜像是精简版本,很多指令没有,因此,先安装一些软件,配置基本环境
进入Docker容器,例如hadoopcentos1
docker exec -it hadoopcentos1 bin/bash
更换yum国内源(每个节点)
curl http://mirrors.aliyun.com/repo/Centos-6.repo > /etc/yum.repos.d/CentOS-Base-6-aliyun.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
yum clean all
yum makecache
安装相关的软件(每个节点)
yum install -y net-tools which openssh-clients openssh-server iproute.x86_64
编辑sshd_config文件,将其中的UsePAM改成no
vi /etc/ssh/sshd_config
启动ssh(每个节点)
chkconfig sshd on
service sshd start
创建用于安装apache hadoop的组、账号
groupadd ahadoop
useradd -m -g ahadoop ahadoop
配置主机名映射表
vi /etc/hosts
172.17.0.1 hd1.hdsite hd1
172.17.0.2 hd2.hdsite hd2
172.17.0.3 hd3.hdsite hd3
172.17.0.4 hd4.hdsite hd4
172.17.0.1 31d48048cb1e
172.17.0.2 1620d6ed305d
172.17.0.3 ed3702f8924e
172.17.0.4 ee8319514df6
其中,最后4行的随机字符串,就是docker容器自动生成的主机名了,每生成一个docker容器就会自动生成一个主机名
4、安装 JDK
从oracle的官网上面下载 JDK 1.8 Linux x64
创建java目录,并解压安装(使用root用户,方便以后别的程序也可以用)
mkdir /usr/java
cd /usr/java
tar -zxvf jdk-8u131-linux-x64.tar.gz
5、下载 apache hadoop
从apache hadoop的官网上面下载最新的稳定版本 apache hadoop 2.8
切换到 ahadoop 用户,将hadoop 2.8放于 /home/ahadoop 目录中,并解压
su ahadoop
cd /home/ahadoop
tar -zxvf hadoop-2.8.0.tar.gz
6、配置zookeeper
要实现hadoop namenode HA高可用,且实现故障的自动切换,则要借助于zookeeper
注意:如果只是实现namenode HA高可用,是可以不用zookeeper的,只要配置hadoop的journalnode节点即可实现高可用。而配置zookeeper集群,主要是为了监控心跳,实现故障时自动切换,这才是我们配置HA高可用的重要目标。
(1)下载zookeeper
到apache zookeeper官方下载最新版本的 zookeeper-3.4.10.tar.gz
(2)配置zookeeper
配置之前,建议阅读下apache zookeeper官方的配置安装介绍
zookeeper集群只能配置奇数个节点,例如3、5、7……,至少要3个及以上,这跟zookeeper的保障机制有关,要确保大多数节点可用,即(n-1)/2,因此节点数必须是奇数
解压zookeeper(hd1,hd2,hd3)
cd /home/ahadoop
tar -zxvf zookeeper-3.4.10.tar.gz
创建zookeeper数据文件(hd1,hd2,hd3),其中不同的节点使用myid进行区分,一般使用1、2、3……
mkdir /home/ahadoop/zookeeper-data
echo '1' > /home/ahadoop/zookeeper-data/myid
echo '2' > /home/ahadoop/zookeeper-data/myid
echo '3' > /home/ahadoop/zookeeper-data/myid
配置zoo.cfg配置文件
vi /home/ahadoop/zookeeper-3.4.10/conf/zoo.cfg
dataDir=/home/ahadoop/zookeeper-data # 修改zookeeper数据目录
clientPort=2181 # 默认端口
server.1=hd1:2888:3888
server.2=hd2:2888:3888
server.3=hd3:2888:3888
其中 server.1、server.2、server.3 里面的 server.x 最后的序号则是不同节点的myid文件里面的id
到此,zookeeper已经配置完毕,使用 zkServer.sh start 命令在每个节点启动zookeeper(hd1,hd2,hd3)
使用 zkServer.sh status 即可查看节点的状态,最后的Mode表示该节点在集群中的角色,一个zookeeper集群只有一个leader,其它都是follower
[ahadoop@31d48048cb1e ~]$ zkServer.sh start &
[1] 6855
[ahadoop@31d48048cb1e ~]$ ZooKeeper JMX enabled by default
Using config: /home/ahadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[1]+ Done zkServer.sh start
[ahadoop@1620d6ed305d ~]$
[ahadoop@1620d6ed305d ~]$
[ahadoop@1620d6ed305d ~]$ zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /home/ahadoop/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
7、配置hadoop的配置文件
配置hadoop集群前,建议先阅读下apache hadoop官网的集群配置说明,虽然是英文文档,但是简单易懂,有助于进一步了解hadoop集群知识,官方的配置介绍如下(p.s. 参照官网里面的配置说明进行配置,发现有小部分错误,直到实际配置时才发现,下面会介绍):
apache hadoop namenode HA(基于QJM)配置官方介绍
apache hadoop resourcemanager HA 配置官方介绍
(1)创建相应的文件夹(每个节点)
mkdir /home/ahadoop/hadoop-data
mkdir /home/ahadoop/hadoop-data/name
mkdir /home/ahadoop/hadoop-data/data
mkdir /home/ahadoop/hadoop-data/checkpoint
mkdir /home/ahadoop/hadoop-data/tmp
mkdir /home/ahadoop/hadoop-data/log
mkdir /home/ahadoop/hadoop-data/journalnode
主文件夹为hadoop-data,其中:
name:存放namenode的数据
data:存放datanode的数据
checkpoint:存在namenode的checkpoint数据
tmp:临时文件
log:存放日志
journalnode:存在jounalnode的数据
(2)配置core-site.xml配置文件
官方提供了默认的 core-default.xml 配置文件可供参考,但内容很多,我们可根据需要进行配置
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://hdcluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/ahadoop/hadoop-data/journalnode</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/ahadoop/hadoop-data/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>65536</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>