虛擬機搭建Hadoop集群
安裝包準備
操作系統:ubuntu-16.04.3-desktop-amd64.iso
軟件包:VirtualBox
安裝包:hadoop-3.0.0.tar.gz,jdk-8u161-linux-x64.tar.gz
1. 環境準備
使用VirtualBox和下載的ubuntu鏡像文件新建三個Ubuntu操作環境,具體配置如下:
用戶 | 內存(G) | 磁盤空間(G) |
---|---|---|
hadoop01 | 1.5 | 10 |
hadoop02 | 1.5 | 10 |
hadoop03 | 1.5 | 10 |
2. 網絡環境準備
點擊VirtualBox右側“全局工具->主機網絡管理器”,點擊新建,並且勾選DHCP服務器中的啟用服務器,其余的按照默認配置點擊應用即可,這個過程相當於在VirtualBox中創建了一個名稱為vboxnet0的路由器:
關閉創建的每一臺虛擬機,然後分別選中每一臺虛擬機,點擊“設置->網絡->網卡2”,啟用網絡連接,並且選擇連接方式為“僅主機(Host-Only)網絡”,界面名稱為剛剛創建的vboxnet0。
這裏需要註意一定要在關閉虛擬機的狀態下配置網卡2,因為在運行過程中的虛擬機是不允許配置網卡的。另外,這裏網卡1和網卡2的區別在於網卡1用於供給虛擬機連接外部網絡的,虛擬機通過網卡1連接VirtualBox,再通過VirtualBox連接外網;網卡2則相當於提供了一個路由器,供給三臺虛擬機相互之間以及與主機之間進行連接的。
打開一臺虛擬機,執行以下命令安裝vim(默認情況下,Ubuntu是不帶vim的):
sudo apt-get install -y vim
執行以下命令查看當前網絡地址:
ifconfig
將如下配置添加到/etc/network/interfaces
文件中,為當前虛擬機配置靜態ip:
auto enp0s8
iface enp0s8 inet static
address 192.168.56.4
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 202.120.111.3
如此按照上述方式對另外兩臺虛擬機配置網絡環境即可。
這裏三臺虛擬機的用戶與ip分別配置如下:
用戶 | ip |
---|---|
hadoop01 | 192.168.56.4 |
hadoop02 | 192.168.56.3 |
hadoop03 | 192.168.56.8 |
3. SSH免密登錄
由於Ubuntu沒有ssh客戶端,可以執行如下命令為每臺虛擬機安裝ssh客戶端:
sudo apt-get install -y openssh-server
安裝完成後執行如下命令生成ssh公鑰:
ssh-keygen -t rsa
該命令執行期間一直按回車即可。公鑰生成後會在用戶目錄~
下生成一個.ssh文件夾,裏面包含id_rsa
和id_rsa.pub
兩個文件。
將三臺虛擬機生成的id_rsa.pub
文件中的內容都復制到同一個文件中,命名為authorized_keys,並且將該文件在每臺虛擬機的.ssh文件夾下都創建一份,該文件相當於為其中的每個公鑰所指代的機器提供ssh登錄的權限,由於三臺虛擬機的authorized_keys都有各自的公鑰,因而其相互之間可以通過ssh免密登錄。示例authorized_keys文件如下:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFez1asGIktruVI53uJHT3s8UZHoIi3X98G5mFV/7+MAs8xXeXV7HbHfi2FfJnMl/qTY/W4VZWdoFLizDBrtUDHTtigVxs5uK4re8qlvSApmqy9Xi0c+qpLKHSeFBpCSqKgngrwE/+DOFnkkTSH/hv6bIpGPTYArpOXdY203vyt6/MM/HKed0WeAcDbCdfKjke4Q2IHi6APghwjML3oD1N0rNGU28SRc8iGdg+vGp6Ajkr034VZCx7fY/BmjYhxPvJ6c5hnVSwqik05xdw2Dh+6eLkiOOnO1LknFw7KdFqa1435sOxxHhar8+ELiKu/mYzVcZMizN0AiPQGxjP96fl hadoop01@hadoop01
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDCXKskhH0VFzh8KrJt3PmbR/Yxbgv5le4iEdvIPWWXAC7XDuPGrz1XH/ZYlZWauyV/LsMN3qjbeHzyfeuuNuV6Skpy/lofsIO88/XH0NFYcAxQtIQfSLwbOGVWziibOPY+gI8Bnzeb7hAYk10V2cI26hKWMpEHxOu/lCxcNuM5Y+CBs2kx2KzzvwgUjF12P6Jz4+SguCERi+Cz1JQ0YuXHBRLXGgwXMRyYUlC3KxIvyeZzI0+Gpew4nTFFXBoDIEaWn9Ma8+AcHNm9ejnO9ChSCN3zXJf7nnaXKUmi5jyQu88e+qmhDt2Pzj0E/kaKRkxso7e+sgHMBp8eXpJu/eT hadoop02@hadoop02
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCm4yk0TVpfhU0jSf4PMH60fOhMYrxCI9DeG/tcs0LTAUHGatuY3XRd6X3B5tShUlCvr9M1DVRgszk0Nz9VOzgqFsIXUxJLAir4dQIj+nVY0QcyTwzwbqm93YDZfaoYrO9xgEriZ6XVK78bWc8bMWpc9z35Kp4U6ytTQUufVwnsVXgAcBN6rQ/ZZFiJvCwnsZDtNsT/zVNWdrnVMKFbm+0rQHzt+jQEgfunwQeEkj8G21iPMpG9MxuHLmzOx+7XaxNLl/P2oHto8lQJgm0DYLJy6JLPa3rkd+NuBxYoqRxr1A1eC/7f3480bz+HHym5e0dSh8HuG3XJihIoR1SLm1Sd hadoop03@hadoop03
按照上述配置完成之後,可使用如下命令在一臺虛擬機上登錄另外兩臺虛擬機(這裏hadoop02和hadoop03為目標機器的用戶,@符號後的內容為目標機器的ip地址):
ssh [email protected]
ssh [email protected]
這裏需要註意,如此配置之後即可按照上述方式使用ssh登錄免密登錄其他機器,但是這種配置還不完全夠,因為在後續使用hive和hbase的過程中,其集群內部是使用如下方式登錄的:
ssh hadoop02
ssh hadoop03
這種登錄方式其實可以理解為別名登錄,其將hadoop02指代為[email protected],在ssh中可以通過配置config文件來設置別名,該config文件放置在.ssh文件夾下即可,具體的配置如下:
Host hadoop02
hostname 192.168.56.3
user hadoop02
Host hadoop03
hostname 192.168.56.8
user hadoop03
4. jdk和Hadoop安裝
需要說明的是如下jdk和hadoop安裝只是一臺虛擬機上的配置,其余兩臺虛擬機的配置方式與其類似。
將下載的jdk和Hadoop安裝包使用tar命令解壓,如:
tar -zxvf jdk-8u161-linux-x64.tar.gz
使用ln命令為jdk和hadoop解壓包創建軟連接,創建軟連接的優點在於如果後續需要更改jdk或者Hadoop的版本,只需要把軟連接指向新的解壓目錄即可,而不需要到處更改配置的環境變量,因為環境變量都是基於軟連接配置的:
ln -s jdk1.8.0_161 jdk
ln -s hadoop-3.0.0 hadoop
創建軟連接之後的目錄結構如下所示:
drwxrwxr-x 5 hadoop01 hadoop01 4096 2月 23 17:46 ./
drwxr-xr-x 19 hadoop01 hadoop01 4096 2月 23 20:46 ../
lrwxrwxrwx 1 hadoop01 hadoop01 12 2月 22 22:24 hadoop -> hadoop-3.0.0/
drwxr-xr-x 12 hadoop01 hadoop01 4096 2月 23 10:24 hadoop-3.0.0/
lrwxrwxrwx 1 hadoop01 hadoop01 12 2月 22 22:06 jdk -> jdk1.8.0_161/
drwxr-xr-x 8 hadoop01 hadoop01 4096 12月 20 08:24 jdk1.8.0_161/
編輯用戶目錄下的.profile
文件,在其中加上如下內容:
export JAVA_HOME=/home/hadoop01/xufeng.zhang/jdk
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export HADOOP_HOME=/home/hadoop01/xufeng.zhang/hadoop
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CLIENT_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/native"
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
保存之後,使用如下source
命令才能使編輯的環境變量生效:
source ~/.profile
使用java -version
命令查看配置的Java運行環境是否正常:
hadoop01@hadoop01:~/xufeng.zhang$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
使用hadoop version
命令查看Hadoop是否配置正確:
hadoop01@hadoop01:~/xufeng.zhang$ hadoop version
Hadoop 3.0.0
Source code repository https://git-wip-us.apache.org/repos/asf/hadoop.git -r c25427ceca461ee979d30edd7a4b0f50718e6533
Compiled by andrew on 2017-12-08T19:16Z
Compiled with protoc 2.5.0
From source with checksum 397832cb5529187dc8cd74ad54ff22
This command was run using /home/hadoop01/xufeng.zhang/hadoop-3.0.0/share/hadoop/common/hadoop-common-3.0.0.jar
對於另外兩臺虛擬機,可以按照上述方式進行類似的配置即可。
5. Hadoop集群環境的搭建
Hadoop集群的配置,主要有如下幾個文件需要修改:
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
hadoop-env.sh
core-site.xml的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://192.168.56.3:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop01/xufeng.zhang/hadoop/tmp</value>
</property>
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
</configuration>
hdfs-site.xml的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.permissions.enabled</name>
<value>false</value>
</property>
<property>
<name>dfs.http.address</name>
<value>192.168.56.3:50070</value>
</property>
<property>
<name>dfs.secondary.http.address</name>
<value>192.168.56.4:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>/home/hadoop01/xufeng.zhang/hadoop/data/namenode</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/home/hadoop01/xufeng.zhang/hadoop/data/datanode</value>
</property>
</configuration>
mapred-site.xml的配置
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>192.168.56.3:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>192.168.56.3:19888</value>
</property>
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
</configuration>
這裏需要註意的是,yarn.app.mapreduce.am.env
,mapreduce.map.env
和mapreduce.reduce.env
三個參數一定要配上,否則在運行MapReduce任務時會報如下錯誤:
Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
yarn-site.xml的配置
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>192.168.56.4</value>
</property>
<property>
<name>yarn.web-proxy.address</name>
<value>192.168.56.4:8888</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.application.classpath</name>
<value>
$HADOOP_CLIENT_CONF_DIR,
$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/*,
$HADOOP_COMMON_HOME/lib/*,
$HADOOP_HDFS_HOME/*,
$HADOOP_HDFS_HOME/lib/*,
$YARN_HOME/*,
$YARN_HOME/lib/*
</value>
</property>
</configuration>
hadoop-env.sh的配置
這裏需要著重強調hadoop-env.sh
的配置,因為該配置是比較容易掉的配置,而且在執行任務的過程中沒有該配置則會報找不到環境變量的錯誤。該配置文件中主要需要配置JAVA_HOME參數,如:
# The java implementation to use. By default, this environment
# variable is REQUIRED on ALL platforms except OS X!
export JAVA_HOME=/home/hadoop01/xufeng.zhang/jdk
可以看到,在該文件中已經說明了除了OS X操作系統可以部配該變量外,其余的操作系統都需要配置。
如此,單個虛擬機上的Hadoop集群環境配置即完成了,其余的虛擬機集群環境配置和上述操作基本一致。這裏有一個簡便的方式,即將當前虛擬機上的配置文件拷貝到另外兩臺虛擬機,並且替換其Hadoop的配置文件,替換後只需要更改其中有關路徑的配置,如core-site.xml
的hadoop.tmp.dir
更改為對應虛擬機的路徑即可。
6. 集群啟動
集群啟動之前需要對集群每個節點的NameNode進行格式化,即初始化NameNode的相關存儲環境信息。格式化命令如下:
hadoop namenode -format
格式化完成之後,分別在每臺機器上執行如下命令即可啟動Hadoop,該命令是Hadoop的sbin目錄下的一個命令,在進行環境變量配置時已將其添加到了PATH裏了:
start-all.sh
如果需要關閉Hadoop,可執行如下命令:
stop-all.sh
啟動完成後可以使用如下命令在每臺機器上查看Hadoop是否成功啟動了:
jps
各節點的啟動信息如下:
hadoop01@hadoop01:~/xufeng.zhang/hadoop/etc/hadoop$ jps
3680 Jps
3154 NodeManager
2627 DataNode
2788 SecondaryNameNode
3381 WebAppProxyServer
3038 ResourceManager
hadoop02@hadoop02:~$ jps
2883 Jps
2035 NameNode
2659 NodeManager
2152 DataNode
hadoop03@hadoop03:~$ jps
2083 DataNode
2759 Jps
2525 NodeManager
可以看到這裏hadoop02機器為主NameNode節點,hadoop01為副NameNode節點;hadoop01,hadoop02和hadoop03都為DataNode節點。這裏也可以打開如下鏈接查看各個節點的運行情況:
http://192.168.56.4:8088/
http://192.168.56.3:50070/
7. 結語
本文主要講解了如何通過虛擬機搭建一個有三個DataName,一個主NameNode和一個SecondaryNameNode的Hadoop集群,並且講解了在配置過程中可能會出現的問題。本人在集群的搭建過程中出現了很多問題,通過不斷的查資料,最終將集群搭建起來並成功運行了MapReduce任務。這裏做一個總結,一是分享給閱讀者,以減少其出錯的概率,二是方便後續自己再次搭建時有資料可查。
虛擬機搭建Hadoop集群