零零散散兩周時間,終于在單機環境下搭建起來了一個4節點的hadoop集群。在這篇文章中,我將分成如下部分進行分享
- 使用vagrant在本地運行虛擬機
- 使用vagrant在本地搭建多機網絡
- Hadoop 基礎環境搭建
- Hadoop 集群的簡單驗證
- Hadoop HA 模式搭建及驗證
- 搭建過程中遇到的問題,及解決方案
1. 使用vagrant在本地運行虛擬機
vagrant是一個用于創建和部署虛擬化開發環境的工具,它能很方便地在本地生成多個虛擬機器,進而幫助我們在本地實現集群搭建。
1.1 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 <boxName> <boxFilePath>
命令 添加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
<property>
<name>fs.defaultFS</name>
<value>hdfs://hadoop1:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
</property>
3.3.3.2 hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.name.dir</name>
<value>/data/hadoop/tmp/name</value>
<description>為了保證元數據的安全一般配置多個不同目錄</description>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/data/hadoop/tmp/data</value>
<description>datanode 的數據存儲目錄</description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
<description>HDFS 的數據塊的副本存儲個數, 默認是3</description>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>hadoop3:50090</value>
<description>secondarynamenode 運行節點的信息,和 namenode 不同節點</description>
</property>
</configuration>
在指定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
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
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 | * | * | * | * |