零零散散两周时间,终于在单机环境下搭建起来了一个4节点的hadoop集群。在这篇文章中,我将分成如下部分进行分享
- 使用vagrant在本地运行虚拟机
- 使用vagrant在本地搭建多机网络
- Hadoop 基础环境搭建
- Hadoop 集群的简单验证
- Hadoop HA 模式搭建及验证
- 搭建过程中遇到的问题,及解决方案
1. 使用vagrant在本地运行虚拟机
vagrant是一个用于创建和部署虚拟化开发环境的工具,它能很方便地在本地生成多个虚拟机器,进而帮助我们在本地实现集群搭建。
1.1 vagrant 安装
vagrant下载
1.2 vagrant box 下载安装
首先在这里找到你想要的box: https://app.vagrantup.com/boxes/search
1.2.1 vagrant 命令下载安装
使用vagrant之前,先在本地新建一个文件夹 ~/hadoop-full/vagrant
。后续所有的操作都在此文件加下进行。
vagrant init centos/7
vagrant up
vagrant init 会创建一个VagrantFile文件,vagrant up会在启动的时候下载一个centos/7的虚拟机。该方式下载的比较慢,比较推荐使用第二种方式安装box
1.2.2 手动下载安装
在搜索列表里面点击自己想要下载的box进入详情页,然后点击选择想要下载的版本,进入该版本的详情页。在详情页URL的后面加上/providers/virtualbox.box
(例如:https://app.vagrantup.com/centos/boxes/7/versions/2004.01/providers/virtualbox.box), 即可下载该版本的box。
下载完后,就可以用vagrant来添加box了。 将下载下来的box转移到~/hadoop-full/vagrant
,然后使用 vagrant box add
命令 添加box
vagrant box add CentOS-7 CentOS-7-x86_64-Vagrant-2004_01.VirtualBox.box
添加完box后,使用vagrant box list
来查看box是否添加成功。在确定box添加成功后,就可以初始化box了 vagrnat init CentOS-7
(注意这里的CentOS-7就是在添加box的时候指定的boxName)。在初始化之后,会生成一个VagrantFile文件,该文件包含了虚拟机的各种配置信息,在后面我们会用到。接下来,我们就可以使用vagrant up
启动虚拟机啦。
Note: 更多关于vagrant的使用细节,可以去访问vagrant的官网。这里我做减法,只介绍如何使用vagrant在本地搭建集群
2 使用vagrant在本地搭建多机网络
要想在本地搭建起一个4节点的hadoop集群,就需要使用vagrant创建四个虚拟机节点,并保证四节点之间可以相互通信。在上面的介绍中我们知道,vagrant在启动虚拟机时,会去读取VagrantFile文件配置,那么我们只需要在VagrantFile里面配置好四台虚拟机,并指定它们的网络模式,就能启动4台虚拟机。
2.1 VagrantFIle配置
boxes = [
{
:name => "hadoop1",
:mem => "1024",
:cpu => "1"
},
{
:name => "hadoop2",
:mem => "1024",
:cpu => "1"
},
{
:name => "hadoop3",
:mem => "1024",
:cpu => "1"
},
{
:name=> "hadoop4",
:mem => "1024",
:cpu => "1"
}
]
Vagrant.configure("2") do |config|
# box名称
config.vm.box = "CentOS-7"
# 循环设置每台虚拟机
boxes.each do |opts|
config.vm.define opts[:name] do |config|
# 配置 hostname
config.vm.hostname = opts[:name]
# 配置内存和CPU
config.vm.provider "virtualbox" do |v|
v.customize ["modifyvm", :id, "--memory", opts[:mem]]
v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
end
# 配置 IP
config.vm.network "private_network", type: "dhcp"
end
end
end
注意:为了简单起见,这里的网络模式选择"private_network", ip地址自动分配。如果只想快速搭建集群,可以不用花很多时间研究网络模式这块。当然vagrant官网已经给出了很详尽的介绍,感兴趣的可以去看看。
配置完VagrantFile后,可以vagrant up 启动虚拟就,此刻你就会发现,在你本地有4台虚拟机启动,每台都分配有一个ip地址。
2.2 虚拟机相互通信
首先使用vagrant ssh hadoop1 登陆到名字为hadoop1的虚拟机中(名称是在VagrantFile中指定的)。新启动的虚拟机,有很多功能未安装,可以使用yum进行安装。比如 yum -y install net-tools
. 在安装完net-tools后,就可以使用ifconfig查看hadoop1虚拟机的IP了;依照此方法一次得到4台虚拟机的IP
节点名 | IP地址 |
---|---|
hadoop1 | 172.28.128.3 |
hadoop2 | 172.28.128.4 |
hadoop3 | 172.28.128.5 |
hadoop4 | 172.28.128.6 |
在确定完各台虚拟机的IP后,就可以使用ping 命令来检查各虚拟机之间的通信状况了,如:ping 172.28.128.4
为了简化后续的网路连接操作,我们可以在每台虚拟机的 /etc/hosts中添加ip映射关系,如
172.28.128.3 hadoop1
172.28.128.4 hadoop2
172.28.128.5 hadoop3
172.28.128.6 hadoop4
还有一点非常重要,就是一定要关闭每台虚拟机的防火墙设置,因为后续节点之间要相互通信,如果没能关闭防火墙,集群的之间的通信就会受阻,从而集群搭建失败。可以使用如下命令关闭防火墙
firewall-cmd --state #检查防火墙状态
sudo systemctl stop firewalld.service #停止firewall
sudo systemctl disable firewalld.service #禁止firewall开机启动
3. Hadoop 集群环境搭建
3.1 下载Hadoop安装包
这里我选择的是hadoop 3.2.1 版本https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.1/hadoop-3.2.1.tar.gz
将安装包放在放在~/hadoop-full/vagrant
目录下,这样当启动虚拟机时,每台虚拟机的/vagrant目录下,就会有Hadoop的安装包。然后解压安装包tar -xzvf hadoop-3.2.1.tar.gz
3.2 下载java包
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
注意要选择linux版本。将下载下来的安装包放到~/hadoop-full/vagrant
下,并解压。
3.3 Hadoop环境搭建
3.3.1 hadoop,java 配置
环境搭建主要是为各虚拟机配置hadoop环境和 java环境,首先在~/hadoop-full/vagrant
目录下,使用vagrant up
启动虚拟机。
依次进入到hadoop1, hadoop2, hadoop3, hadoop4 在/etc/profile文件中添加hadoop 和java 配置
export JAVA_HOME=/vagrant/jdk1.8.0_261
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export HADOOP_HOME=/vagrant/hadoop-3.2.1
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:
并执行source etc/profile 使之生效。接下来可以使用下面的命令来验证安装配置是否成功
java -version
hadoop version
最后进入/vagrant/hadoop-3.2.1/etc/hadoop/hadoop-env.sh, 在里面为Hadoop增加Java配置 export JAVA_HOME=/vagrant/jdk1.8.0_261
3.3.2 虚拟机之间免密登陆
首先确保各台虚拟机能免密登陆自己. 在每台虚拟机上执行下面的命令
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
然后将主机hadoop1的公钥分发到hadoop2,hadoop3, hadoop4
scp id_dsa.pub hadoop2:~/.ssh/hadoop1.pub
接着将hadoop1.pub 公钥添加到hadoop2,hadoop3,hadoop3 的 authorized_keys中
cat ~/.ssh/hadoop1.pub >> ~/.ssh/authorized_keys
3.3.3 Hadoop集群配置
进入虚拟机/vagrant/hadoop-3.2.1/etc/hadoop
目录下
3.3.3.1 core-site.xml
fs.defaultFS
hdfs://hadoop1:9000
hadoop.tmp.dir
/data/hadoop/tmp
3.3.3.2 hdfs-site.xml
dfs.namenode.name.dir
/data/hadoop/tmp/name
为了保证元数据的安全一般配置多个不同目录
dfs.datanode.data.dir
/data/hadoop/tmp/data
datanode 的数据存储目录
dfs.replication
3
HDFS 的数据块的副本存储个数, 默认是3
dfs.secondary.http.address
hadoop3:50090
secondarynamenode 运行节点的信息,和 namenode 不同节点
在指定dataNode、nameNode文件夹的时候,一定要自己先创建 /data/hadoop/tmp/data
和 /data/hadoop/tmp/name
文件夹,并赋予文件权限
sudo mkdir -p /data/hadoop/tmp/data
sudo mkdir -p /data/hadoop/tmp/name
sudo chmod -R 777 /data
sudo chown -R vagrant /data
3.3.3.3 mapred-site.xml
mapreduce.framework.name
yarn
3.3.3.4 workers
在workers文件中,添加slaves机器
hadoop2
hadoop3
hadoop4
3.3.3.5 masters
添加masters文件, 指定集群master服务器
hadoop1
3.3.3.6初始化hdfs并启动
hdfs namenode -format
start-all.sh
然后打开网页验证:172.28.128.3:9870
4. Hadoop HA搭建
集群分配
虚拟机 | NN | DN | JN | ZKFC | ZK | RM | NM |
---|---|---|---|---|---|---|---|
hadoop1 | * | * | * | ||||
hadoop2 | * | * | * | * | * | * | |
hadoop3 | * | * | * | * | * | ||
hadoop4 | * | * | * | * |