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

我這裡是在虛拟機上建立的系統,即裝系統的時候将每個系統的下面這個界面的使用者名填成一樣的
一、開發環境
硬體環境:ubuntu-16.04.3 伺服器3台(一台 master 結點,兩台 slave 結點),在虛拟機中搭建
軟體環境:jdk1.8.0_144,hadoop-2.8.1
jdk下載下傳(下載下傳對應版本以“.tar.gz”結尾的檔案)
hadoop下載下傳(選擇圖中标記出來的位置的連結)
二、叢集拓撲圖
三、與本地Win7系統共享本地檔案
ps:省去在虛拟機中下載下傳檔案,友善很多
1、虛拟機設定
虛拟機菜單欄 -> 虛拟機 -> 設定 -> 選項 -> 共享檔案夾 -> 總是啟用 -> 添加(我将添加的共享目錄命名為Shared) ->确定
2、VMware Tools安裝
(1)虛拟機菜單欄 -> 虛拟機 -> 安裝VMware Tools
(2)等一會虛拟機會自己打開VMware Tools檔案夾
(3)在該目錄下,右鍵打開指令行,将壓縮檔案拷貝到桌面上,再到桌面上将其解壓縮
cp VMwareTools--tar.gz /home/hadoop/Desktop/
cd /home/hadoop/Desktop/
tar -xzvf VMwareTools--tar.gz
(4)成功之後以管理者root身份執行解壓縮之後檔案目錄裡的vmware-install.pl檔案即可進行安裝
sudo vmware-tools-distrib/vmware-install.pl
(5)一路回車
醬紫就裝好了
(6)共享檔案在 /mnt/hgfs/Shared 檔案夾下
ps:Shared是剛添加共享目錄時自己起的名字
3、将下載下傳好的軟體包放到共享檔案夾下
四、JDK的安裝與配置
1、解壓縮
(1)把壓縮包拷貝到你想要安裝的位置,我要裝在 /usr/local 目錄下
sudo cp jdk-u144-linux-x64.tar.gz /usr/local
(2)進到對應目錄下解壓縮
cd /usr/local
sudo tar -zxvf jdk-u144-linux-x64.tar.gz
2、配置環境變量
(1)修改配置檔案
sudo vi /etc/profile
在末尾添加如下配置(Linux指令:G -> o(字母小o) - > 輸入以下内容)
export JAVA_HOME=/usr/local/jdk1._144
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
(Linux指令:Esc鍵 - > 輸入“:wq”退出)
(2)重新加載/etc/profile,使配置生效
source /etc/profile
(3)檢查是否配置成功
echo $PATH
java -version
五、HOST檔案配置
修改叢集中每台伺服器的 hosts 檔案,配置主機名和 ip 位址的映射
vi /etc/hosts
六、SSH的安裝與配置
1、軟體安裝
(1)首先更新源(要确定系統可以聯網,可以先打開浏覽器通路以下百度首頁,如果沒連上網,可以試試到Win7系統上 “右鍵計算機 -> 管理 -> 服務和應用程式 -> 服務 -> 找到VMware相關的所有服務 -> 右鍵 -> 啟動”)
sudo apt-get update
(2)安裝 openssh
- 服務端安裝
- 用戶端安裝
ps:如何區分該裝服務端還是用戶端?
如果 slave1 系統想要登入 slave2 系統,那麼 slave1 裝用戶端, slave2 裝服務端,如果想要互相都能登入,就服務端和用戶端都裝
(3)測試是否可以登入
ssh -l hadoop .
(ssh -l [使用者名] [遠端ip])
( ip 可以用 ifconfig 指令檢視)
到現在,我們已經可以通過密碼登入了
2、配置免密碼登入
原理是驗證公鑰而不驗證密碼
(1)配置本機無密碼登入
三台伺服器均做如下設定
1)進入到宿主目錄下,生成本機秘鑰同時設定免密登入,注意,這裡不能使用 root 使用者生成秘鑰,而是要使用你想要設定免密登入的使用者
cd /home/hadoop/
ssh-keygen -t rsa -P ""
一路回車
2)将公鑰追加到 authorized_keys 檔案中
cat .ssh/id_rsa.pub >> .ssh/authorized_keys
賦予 authorized_keys 檔案權限
chmod .ssh/authorized_keys
3)驗證是否成功
ssh localhost
(2)配置 master 無密碼登入 slave1 伺服器
以下操作均在 slave1 伺服器上操作
1)複制 master 的公鑰到 slave1 上
scp hadoop@192..:/home/hadoop/.ssh/id_rsa.pub /home/hadoop
(scp [email protected]_ip:master_file slave1 _folder)
2)将 master 公鑰追加到 slave1 的 authorized_keys 檔案中,删除 master 公鑰檔案
cat /home/hadoop/id_rsa.pub >> .ssh/authorized_keys
rm /home/hadoop/id_rsa.pub
3)驗證是否成功(在master伺服器上操作)
ssh slave1
(ssh ip 在 /etc/hosts 檔案中我們已經将 ip 和主機名做了映射,是以可以直接用主機名代替 ip)
(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
修正分割線———————————–
(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-.tar.gz /data
到 /data 目錄下解壓檔案
cd /data
sudo tar -zxvf hadoop-..tar.gz
将解壓完的 hadoop-2.8.1 檔案的所有者及所屬組改為 hadoop 使用者,并删除壓縮包
sudo chown -R hadoop:hadoop /data/hadoop-
sudo rm -rf hadoop-.tar.gz
3、配置hadoop環境
(1)修改配置檔案
sudo vi /etc/profile
在 JAVA_HOME 前面添加如下配置(Linux指令:G ->k(上移到 JAVA_HOME 那一行) -> o(字母小o) - > 輸入以下内容)
修改 PATH 條目為
export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin
(Linux指令:Esc鍵 - > 輸入“:wq”退出)
(2)重新加載 /etc/profile,使配置生效
source /etc/profile
(3)檢查是否配置成功
hadoop
(4)修改 hadoop-env.sh 檔案
hadoop 環境是基于 JVM 環境的,故需在 hadoop-env.sh 配置檔案中指定 JDK 環境
sudo vi hadoop-./etc/hadoop/hadoop-env.sh
找到 JAVA_HOME 修改
(Linux 指令:L -> j(下移兩三行就能找到) -> I -> # -> Esc鍵 -> o (字母小o)-> 輸入)
export JAVA_HOME=/usr/local/jdk1._144
儲存退出(Linux 指令:Esc鍵 -> :wq!)
(5)修改下列檔案
在Linux系統桌面上建立以下檔案,并修改相應内容(檔案内容與上面的建立的 /data 檔案夾有關)
1)core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<!--
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" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<!--
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" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" ?>
<!--
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-/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 .
(7)修改 slaves 檔案
sudo vi slaves
為
slave1
slave2
(Linux 指令:D -> i -> 輸入即可)
儲存退出(Linux 指令:Esc鍵 -> :wq!)
(8)複制到 slave1 和 slave2 伺服器上
分别在 slave1 和 slave2 伺服器上執行以下語句
sudo scp -r hadoop@master:/data/hadoop-. /data
(9)删除 slave1 和 slave2 伺服器上的 slaves 檔案,并更改 /data 檔案夾的所有者及所屬組為 hadoop 使用者,分别在 slave1 和 slave2 伺服器上執行以下語句
sudo rm slaves
sudo chown -R hadoop:hadoop /data
4、運作Hadoop
除特殊說明外,隻在 master 上執行
(1)格式化NameNode
注意:這一步可能會出現問題,最好從頭到尾看一遍以确定格式化成功
(2)啟動HDFS檔案管理系統
這邊要保證三台伺服器上的hadoop-2.8.1檔案夾的所有者都是hadoop使用者
(sudo chown hadoop /data/hadoop-2.8.1)
可以照着 log 的儲存路徑檢視一下 log 日志,尤其是,如果出現了什麼錯誤,日志裡會寫的很清楚
(3)檢視啟動程序
在 master 上執行
jps
master伺服器:
ps:SecondaryNameNode 線程沒啟動起來的話有可能是因為 hadoop 使用者沒有對 /data/hdfs 及其下的子檔案夾的寫權限
slave1伺服器:
slave2伺服器:
缺任何一個都是有問題的
5、測試Hadoop
(1)檢視叢集狀态
(2)測試叢集
在master上建立個新檔案夾
hdfs dfs -mkdir /user
分别在三台伺服器上檢視剛建立的檔案夾是否成功
hdfs dfs -ls /
master伺服器:
slave1伺服器:
slave2伺服器:
(3)測試yarn
ip 是master 伺服器的 ip ,端口是在前面修改的檔案中指定的
(4)測試 mapreduce
Hadoop 安裝包裡有提供現成的 mapreduce 例子,在 Hadoop 的share/hadoop/mapreduce 目錄下。運作例子:
bin/hadoop jar /data/hadoop-/share/hadoop/mapreduce/hadoop-mapreduce-examples-.jar pi
截圖中是還沒運作完畢的代碼,如果電腦記憶體不是很大的話,他會在這裡卡很久,我的電腦是8G,虛拟機配置設定的記憶體是1.5G(配置設定2G的話電腦就會卡到動不了。。。)
運作了n遍都失敗之後,決定最後運作一遍,然後扔那運作我就幹别的去了。。。一個多小時之後回來發現。。。竟然成功了,失敗的原因是,電腦性能跟不上
然後重新整理剛才的網頁
(5)檢視HDFS
唔哈哈哈哈哈~~~好啦,大功告成了,差不多花了一周的時間,踩了無數個坑才完成,激動!!!
日後可能遇到的問題
1、namenode沒有啟動,每次開機都得重新格式化一下namenode才可以
參考答案:
http://blog.csdn.net/bychjzh/article/details/7830508
2、hadoop運作到mapreduce.job: Running job後停止運作
參考答案:
http://blog.csdn.net/zhangchaokun/article/details/49105037