1. 程式人生 > >(超詳細)從零開始安裝與配置hadoop完全分散式環境

(超詳細)從零開始安裝與配置hadoop完全分散式環境

強調!!!

使用者名稱稱要相同,否則可能出現稀奇古怪的錯誤!!!(我就因為這個問題,在後面快裝完的時候不得不從頭再來)
原因:Hadoop要求所有機器上Hadoop的部署目錄結構要求相同(因為在啟動時按與主節點相同的目錄啟動其它任務節點),並且都有一個相同的使用者名稱賬戶。參考各種文件上說的是所有機器都建立一個hadoop使用者,使用這個賬戶來實現無密碼認證。
0

我這裡是在虛擬機器上新建的系統,即裝系統的時候將每個系統的下面這個介面的使用者名稱填成一樣的

同名

一、開發環境

硬體環境:ubuntu-16.04.3 伺服器3臺(一臺 master 結點,兩臺 slave 結點),在虛擬機器中搭建
軟體環境:jdk1.8.0_144,hadoop-2.8.1

jdk下載(下載對應版本以“.tar.gz”結尾的檔案)
jdk

二、叢集拓撲圖

叢集拓撲圖

三、與本地Win7系統共享本地檔案

ps:省去在虛擬機器中下載檔案,方便很多

1、虛擬機器設定

虛擬機器選單欄 -> 虛擬機器 -> 設定 -> 選項 -> 共享資料夾 -> 總是啟用 -> 新增(我將新增的共享目錄命名為Shared) ->確定

1

2、VMware Tools安裝

(1)虛擬機器選單欄 -> 虛擬機器 -> 安裝VMware Tools
(2)等一會虛擬機器會自己開啟VMware Tools資料夾
(3)在該目錄下,右鍵開啟命令列,將壓縮檔案拷貝到桌面上,再到桌面上將其解壓縮

cp VMwareTools-10.1.6-5214329.tar.gz /home/hadoop/Desktop/
cd /home/hadoop/Desktop/
tar -xzvf VMwareTools-10.1.6-5214329.tar.gz

2

(4)成功之後以管理員root身份執行解壓縮之後檔案目錄裡的vmware-install.pl檔案即可進行安裝

sudo vmware-tools-distrib/vmware-install.pl

3

(5)一路回車

醬紫就裝好了

4

(6)共享檔案在 /mnt/hgfs/Shared 資料夾下
ps:Shared是剛新增共享目錄時自己起的名字

3、將下載好的軟體包放到共享資料夾下

四、JDK的安裝與配置

1、解壓縮

(1)把壓縮包拷貝到你想要安裝的位置,我要裝在 /usr/local 目錄下

sudo cp jdk-8u144-linux-x64.tar.gz /usr/local

2

(2)進到對應目錄下解壓縮

cd /usr/local
sudo tar -zxvf jdk-8u144-linux-x64.tar.gz

3

2、配置環境變數

(1)修改配置檔案

sudo vi /etc/profile

在末尾新增如下配置(Linux命令:G -> o(字母小o) - > 輸入以下內容)

export JAVA_HOME=/usr/local/jdk1.8.0_144
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH

(Linux命令:Esc鍵 - > 輸入“:wq”退出)

4

(2)重新載入/etc/profile,使配置生效

source /etc/profile

(3)檢查是否配置成功

echo $PATH
java -version

5

五、HOST檔案配置

修改叢集中每臺伺服器的 hosts 檔案,配置主機名和 ip 地址的對映

vi /etc/hosts

hosts

六、SSH的安裝與配置

1、軟體安裝

(1)首先更新源(要確定系統可以聯網,可以先開啟瀏覽器訪問以下百度主頁,如果沒連上網,可以試試到Win7系統上 “右鍵計算機 -> 管理 -> 服務和應用程式 -> 服務 -> 找到VMware相關的所有服務 -> 右鍵 -> 啟動”)

sudo apt-get update

(2)安裝 openssh

  • 服務端安裝
sudo apt-get install openssh-server

1

  • 客戶端安裝
sudo apt-get install openssh-client

2

ps:如何區分該裝服務端還是客戶端?
如果 slave1 系統想要登入 slave2 系統,那麼 slave1 裝客戶端, slave2 裝服務端,如果想要互相都能登入,就服務端和客戶端都裝

(3)測試是否可以登入

ssh -l hadoop 192.168.195.133

(ssh -l [使用者名稱] [遠端ip])
( ip 可以用 ifconfig 命令檢視)

3

到現在,我們已經可以通過密碼登入了

2、配置免密碼登入

原理是驗證公鑰而不驗證密碼

(1)配置本機無密碼登入

三臺伺服器均做如下設定

1)進入到宿主目錄下,生成本機祕鑰同時設定免密登入,注意,這裡不能使用 root 使用者生成祕鑰,而是要使用你想要設定免密登入的使用者

cd /home/hadoop/
ssh-keygen -t rsa -P ""

一路回車

4

2)將公鑰追加到 authorized_keys 檔案中

cat .ssh/id_rsa.pub >> .ssh/authorized_keys

賦予 authorized_keys 檔案許可權

chmod 600 .ssh/authorized_keys

5

3)驗證是否成功

ssh localhost

6

(2)配置 master 無密碼登入 slave1 伺服器

以下操作均在 slave1 伺服器上操作

1)複製 master 的公鑰到 slave1 上

scp hadoop@192.168.195.130:/home/hadoop/.ssh/id_rsa.pub /home/hadoop

(scp [email protected]_ip:master_file slave1 _folder)

3

2)將 master 公鑰追加到 slave1 的 authorized_keys 檔案中,刪除 master 公鑰檔案

cat /home/hadoop/id_rsa.pub >> .ssh/authorized_keys
rm /home/hadoop/id_rsa.pub

8

3)驗證是否成功(在master伺服器上操作)

ssh slave1

(ssh ip 在 /etc/hosts 檔案中我們已經將 ip 和主機名做了對映,所以可以直接用主機名代替 ip)

4

(3)參照上一步,完成以下配置
1)master -> slave2
2)slave1 -> master
3)slave2 -> master
4)slave1 -> slave2
5)slave2 -> slave1

七、Hadoop完全分散式環境的安裝與配置

除特別說明外,以下操作均在 master 伺服器上操作

1、建立檔案目錄

為了便於管理,給master的hdfs的NameNode、DataNode及臨時檔案,在根目錄下建立目錄:
/data/hdfs/name
/data/hdfs/data
/data/hdfs/tmp

sudo mkdir /data
sudo mkdir /data/hdfs
sudo mkdir /data/hdfs/name
sudo mkdir /data/hdfs/data
sudo mkdir /data/hdfs/tmp

5

修正分割線———————————–
(ps:對之前看了這篇部落格,照著搭建完出現問題的小夥伴表示萬分抱歉,我也是在執行例項的時候找了好久才弄明白這個地方的錯誤的,求原諒T_T)

這裡建立完各資料夾之後,記得要把資料夾的所有者和所屬組改成 hadoop 使用者,否則後面 hadoop 使用者沒有許可權寫入,會出錯,我遇到的錯誤是 second 執行緒啟動不起來,因為沒有許可權建立它所需要的資料夾及寫入檔案

sudo chown hadoop /data
sudo chown hadoop /data/hdfs
sudo chown hadoop /data/hdfs/name
sudo chown hadoop /data/hdfs/data
sudo chown hadoop /data/hdfs/tmp

修正分割線———————————–

分別在 slave1 和 slave2 伺服器上執行以下命令

sudo scp -r hadoop@master:/data /

2、解壓縮

(1)將共享目錄下的軟體包拷貝到 /data 目錄下

sudo cp /mnt/hgfs/Shared/hadoop-2.8.1.tar.gz /data

到 /data 目錄下解壓檔案

cd /data
sudo tar -zxvf hadoop-2.8.1.tar.gz

將解壓完的 hadoop-2.8.1 檔案的所有者及所屬組改為 hadoop 使用者,並刪除壓縮包

sudo chown -R hadoop:hadoop /data/hadoop-2.8.1
sudo rm -rf hadoop-2.8.1.tar.gz

3、配置hadoop環境

(1)修改配置檔案

sudo vi /etc/profile

在 JAVA_HOME 前面新增如下配置(Linux命令:G ->k(上移到 JAVA_HOME 那一行) -> o(字母小o) - > 輸入以下內容)

export HADOOP_HOME=/data/hadoop-2.8.1

修改 PATH 條目為

export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin

(Linux命令:Esc鍵 - > 輸入“:wq”退出)

6

(2)重新載入 /etc/profile,使配置生效

source /etc/profile

(3)檢查是否配置成功

hadoop

7

(4)修改 hadoop-env.sh 檔案

hadoop 環境是基於 JVM 環境的,故需在 hadoop-env.sh 配置檔案中指定 JDK 環境

sudo vi hadoop-2.8.1/etc/hadoop/hadoop-env.sh

8

找到 JAVA_HOME 修改
(Linux 命令:L -> j(下移兩三行就能找到) -> I -> # -> Esc鍵 -> o (字母小o)-> 輸入)

export JAVA_HOME=/usr/local/jdk1.8.0_144

儲存退出(Linux 命令:Esc鍵 -> :wq!)

9

(5)修改下列檔案

在Linux系統桌面上新建以下檔案,並修改相應內容(檔案內容與上面的新建的 /data 資料夾有關)

1)core-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
  <name>io.file.buffer.size</name>
  <value>131072</value>
</property>
<property>
  <name>fs.default.name</name>
  <value>hdfs://master:9000</value>
</property>
<property>
  <name>hadoop.tmp.dir</name>
  <value>/data/hdfs/tmp</value>
</property>
</configuration>

注意: hadoop.tmp.dir 的 value 填寫對應前面建立的目錄

2)hdfs-site.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>
<property>
<name>dfs.replication</name>
  <value>2</value>
</property>
<property>
  <name>dfs.namenode.name.dir</name>
  <value>file:/data/hdfs/name</value>
  <final>true</final>
</property>
<property>
<name>dfs.blocksize</name>
  <value>268435456</value>
</property>
<property>
  <name>dfs.namenode.handler.count</name>
  <value>100</value>
</property>
<property>
  <name>dfs.datanode.data.dir</name>
  <value>file:/data/hdfs/data</value>
  <final>true</final>
</property>
</configuration>

注意: dfs.namenode.name.dir 和 dfs.datanode.data.dir 的 value 填寫對應前面建立的目錄

3)mapred-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License. See accompanying LICENSE file.
-->

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
<property>
  <name>mapreduce.map.memory.mb</name>
  <value>1536</value>
</property>
<property>
  <name>mapreduce.map.java.opts</name>
  <value>-Xmx1024M</value>
</property>
<property>
  <name>mapreduce.reduce.memory.mb</name>
  <value>3072</value>
</property>
<property>
  <name>mapreduce.reduce.java.opts</name>
  <value>-Xmx2560M</value>
</property>
<property>
  <name>mapreduce.task.io.sort.mb</name>
  <value>512</value>
</property>
<property>
  <name>mapreduce.task.io.sort.factor</name>
  <value>100</value>
</property>
<property>
  <name>mapreduce.reduce.shuffle.parallelcopies</name>
  <value>50</value>
</property>
<property>
  <name>mapred.healthChecker.script.path</name>
  <value></value>
</property>
</configuration>

4)yarn-site.xml

<?xml version="1.0"?>

<!--
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
   http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS,

  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  See the License for the specific language governing permissions and

  limitations under the License. See accompanying LICENSE file.

-->

<configuration>
<!-- Site specific YARN configuration properties -->

<property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.resourcemanager.address</name>
  <value>master:8032</value>
</property>
<property>
 <name>yarn.resourcemanager.scheduler.address</name>
  <value>master:8030</value>
</property>
<property>
  <name>yarn.resourcemanager.resource-tracker.address</name>
  <value>master:8031</value>
</property>
</configuration>

(6)替換掉 hadoop-2.8.1 資料夾下的相應檔案

cd hadoop-2.8.1/etc/hadoop/
sudo rm yarn-site.xml 
sudo rm hdfs-site.xml 
sudo rm core-site.xml 
sudo mv /home/hadoop/Desktop/yarn-site.xml  .
sudo mv /home/hadoop/Desktop/hdfs-site.xml .
sudo mv /home/hadoop/Desktop/core-site.xml .
sudo mv /home/hadoop/Desktop/mapred-site.xml .

10

(7)修改 slaves 檔案

sudo vi slaves

slave1
slave2

(Linux 命令:D -> i -> 輸入即可)

11

儲存退出(Linux 命令:Esc鍵 -> :wq!)

(8)複製到 slave1 和 slave2 伺服器上

分別在 slave1 和 slave2 伺服器上執行以下語句

sudo scp -r hadoop@master:/data/hadoop-2.8.1 /data

(9)刪除 slave1 和 slave2 伺服器上的 slaves 檔案,並更改 /data 資料夾的所有者及所屬組為 hadoop 使用者,分別在 slave1 和 slave2 伺服器上執行以下語句

sudo rm slaves
sudo chown -R hadoop:hadoop /data

18

4、執行Hadoop

除特殊說明外,只在 master 上執行

(1)格式化NameNode

hadoop namenode -format

12

13
注意:這一步可能會出現問題,最好從頭到尾看一遍以確定格式化成功

(2)啟動HDFS檔案管理系統

cd /data/hadoop-2.8.1/

這邊要保證三臺伺服器上的hadoop-2.8.1資料夾的所有者都是hadoop使用者
(sudo chown hadoop /data/hadoop-2.8.1)

sbin/start-all.sh

14
可以照著 log 的儲存路徑檢視一下 log 日誌,尤其是,如果出現了什麼錯誤,日誌裡會寫的很清楚

(3)檢視啟動程序
在 master 上執行

jps

master伺服器:
jps
ps:SecondaryNameNode 執行緒沒啟動起來的話有可能是因為 hadoop 使用者沒有對 /data/hdfs 及其下的子資料夾的寫許可權

slave1伺服器:
1

slave2伺服器:
21

缺任何一個都是有問題的

5、測試Hadoop

(1)檢視叢集狀態

hadoop dfsadmin -report

22
23

(2)測試叢集
在master上建立個新資料夾

hdfs dfs -mkdir /user

24

分別在三臺伺服器上檢視剛新建的資料夾是否成功

hdfs dfs -ls /

master伺服器:
25

slave1伺服器:
26

slave2伺服器:
27

(3)測試yarn
ip 是master 伺服器的 ip ,埠是在前面修改的檔案中指定的

http://192.168.195.130:18088/cluster

28

(4)測試 mapreduce
Hadoop 安裝包裡有提供現成的 mapreduce 例子,在 Hadoop 的share/hadoop/mapreduce 目錄下。執行例子:

bin/hadoop jar /data/hadoop-2.8.1/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.8.1.jar pi 5 10

29

截圖中是還沒執行完畢的程式碼,如果電腦記憶體不是很大的話,他會在這裡卡很久,我的電腦是8G,虛擬機器分配的記憶體是1.5G(分配2G的話電腦就會卡到動不了。。。)

1
2
3
4
5

運行了n遍都失敗之後,決定最後執行一遍,然後扔那執行我就幹別的去了。。。一個多小時之後回來發現。。。竟然成功了,失敗的原因是,電腦效能跟不上

然後重新整理剛才的網頁
30

(5)檢視HDFS

http://192.168.195.130:50070/dfshealth.html#tab-overview

31

唔哈哈哈哈哈~~~好啦,大功告成了,差不多花了一週的時間,踩了無數個坑才完成,激動!!!

日後可能遇到的問題