前面我搭建的Hadoop都是單機偽分布式的,並不能真正感受到Hadoop的最大特點,分布式存儲和分布式計算。所以我打算在虛擬機中同時開啟3台機器,實現分布式的Hadoop群集。
1.准備3台Ubuntu Server
1.1復制出3台虛擬機
我們可以用之前編譯和安裝好Hadoop的虛擬機作為原始版本,在VirtualBox中復制三台新的虛擬機出來,也可以完全重新安裝一台全新的Ubuntu Server,然后在VirtualBox中復制出2台,就變成了3台虛擬機。
1.2修改主機名
主機名保存在/etc/hostname文件中,我們可以運行
sudo vi /etc/hostname
命令,然后為三台機器起不同的名字,這里我們就分別起名:
master
slave01
slave02
1.3修改為固定IP
Ubuntu的IP地址保存到/etc/network/interfaces文件中,我們需要為3台虛擬機分別改為固定的IP,這里我的環境是在192.168.100.*網段,所以我打算為master改為192.168.100.40,操作如下:
sudo vi /etc/network/interfaces
然后可以看到每個網卡的配置,我這里網卡名是叫enp0s3,所以我改對應的內容為:
# The primary network interface
auto enp0s3
iface enp0s3 inet static
address 192.168.100.40
gateway 192.168.100.1
netmask 255.255.255.0
對slave01改為192.168.100.41,slave02改為192.168.100.42。
1.4修改Hosts
由於三台虛擬機是使用的默認的DNS,所以我們需要增加hosts記錄,才能直接用名字相互訪問。hosts文件和Windows的Hosts文件一樣,就是一個域名和ip的對應表。
編輯hosts文件:
sudo vi /etc/hosts
增加三條記錄:
192.168.100.40 master
192.168.100.41 slave01
192.168.100.42 slave02
1.5重啟
這一切修改完畢后我們重啟一下三台機器,然后可以試着各自ping master,ping slave01 ping slave02看能不能通。按照上面的幾步操作,應該是沒有問題的。
1.6新建用戶和組
這一步不是必須的,就采用安裝系統后的默認用戶也是可以的。
sudo addgroup hadoop
sudo adduser --ingroup hadoop hduser
為了方便,我們還可以把hduser添加到sudo這個group中,那么以后我們在hduser下就可以運行sudo xxx了。
sudo adduser hduser sudo
切換到hduser:
su – hduser
1.7配置無密碼訪問SSH
在三台機器上首先安裝好SSH
sudo apt-get install ssh
然后運行
ssh-keygen
默認路徑,無密碼,會在當前用戶的文件夾中產生一個.ssh文件夾。
接下來我們先處理master這台機器的訪問。我們進入這個文件夾,
cd .ssh
然后允許無密碼訪問,執行:
cp id_rsa.pub authorized_keys
然后要把slave01和slave02的公鑰傳給master,進入slave01
scp ~/.ssh/id_rsa.pub hduser@master:/home/hduser/.ssh/id_rsa.pub.slave01
然后在slave02上也是:
scp ~/.ssh/id_rsa.pub hduser@master:/home/hduser/.ssh/id_rsa.pub.slave02
將 slave01 和 slave02的公鑰信息追加到 master 的 authorized_keys文件中,切換到master機器上,執行:
cat id_rsa.pub.slave01 >> authorized_keys
cat id_rsa.pub.slave02 >> authorized_keys
現在authorized_keys就有3台機器的公鑰,可以無密碼訪問任意機器。只需要將authorized_keys復制到slave01和slave02即可。在master上執行:
scp authorized_keys hduser@slave01:/home/hduser/.ssh/authorized_keys
scp authorized_keys hduser@slave02:/home/hduser/.ssh/authorized_keys
最后我們可以測試一下,在master上運行
ssh slave01
如果沒有提示輸入用戶名密碼,而是直接進入,就說明我們配置成功了。
同樣的方式測試其他機器的無密碼ssh訪問。
2.安裝相關軟件和環境
如果是直接基於我們上一次安裝的單機Hadoop做的虛擬機,那么這一步就可以跳過了,如果是全新的虛擬機,那么就需要做如下操作:
2.1配置apt source,安裝JDK
sudo vi /etc/apt/sources.list
打開后把里面的us改為cn,如果已經是cn的,就不用再改了。然后運行:
sudo apt-get update
sudo apt-get install default-jdk
2.2下載並解壓Hadoop
去Hadoop官網,找到最新穩定版的Hadoop下載地址,然后下載。當然如果是X64的Ubuntu,我建議還是本地編譯Hadoop,具體編譯過程參見這篇文章。
wget http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz
下載完畢后然后是解壓
tar xvzf hadoop-2.7.3.tar.gz
最后將解壓后的Hadoop轉移到正式的目錄下,這里我們打算使用/usr/local/hadoop目錄,所以運行命令:
sudo mv hadoop-2.7.3 /usr/local/hadoop
3.配置Hadoop
3.1配置環境變量
編輯.bashrc或者/etc/profile文件,增加如下內容:
# Java Env
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
# Hadoop Env
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
3.2進入Hadoop的配置文件夾:
cd /usr/local/hadoop/etc/hadoop
(1)修改hadoop-env.sh
增加如下配置:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export HADOOP_PREFIX=/usr/local/hadoop
(2)修改core-site.xml
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hduser/temp</value>
<description>A base for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
這里我們指定了一個臨時文件夾的路徑,這個路徑必須存在,而且有權限訪問,所以我們在hduser下創建一個temp目錄。
(3)hdfs-site.xml
設置HDFS復制的數量
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
(4)mapred-site.xml
這里可以設置MapReduce的框架是YARN:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
(5)配置YARN環境變量,打開yarn-env.sh
里面有很多行,找到JAVA_HOME,設置:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
(6)配置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.hostname</name>
<value>master</value>
</property>
</configuration>
(7)最后打開slaves文件,設置有哪些slave節點。
由於我們設置了3份備份,把master即是Name Node又是Data Node,所以我們需要設置三行:
master
slave01
slave02
3.3配置slave01和slave02
在slave01和slave02上做前面3.1 3.2相同的設置。
一模一樣的配置,這里不再累述。
4.啟動Hadoop
回到Master節點,我們需要先運行
hdfs namenode –format
格式化NameNode。
然后執行
start-all.sh
這里Master會啟動自己的服務,同時也會啟動slave01和slave02上的對應服務。
啟動完畢后我們在master上運行jps看看有哪些進程,這是我運行的結果:
2194 SecondaryNameNode
2021 DataNode
1879 NameNode
3656 Jps
2396 ResourceManager
2541 NodeManager
切換到slave01,運行jps,可以看到如下結果:
1897 NodeManager
2444 Jps
1790 DataNode
切換到slave02也是一樣的有這些服務。
那么說明我們的服務網都已經啟動成功了。
現在我們在瀏覽器中訪問:
應該可以看到Hadoop服務已經啟動,切換到Datanodes可以看到我們啟動的3台數據節點: