基於樹莓派和台式機搭建集群,但是樹莓派的性能特別差,不建議使用,但還是記錄下來,拓展到多台機器大同小異。
搭建過程參考廈門大學數據庫實驗室的網站。http://dblab.xmu.edu.cn/blog/install-hadoop-cluster/
用到的設備有關Centos系統的筆記本,centos系統的樹莓派兩個,ubuntu的台式機一個,網線四根,交換機一個。
安裝總體過程:
- 選定一台機器作為 Master
- 在 Master 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
- 在 Master 節點上安裝 Hadoop,並完成配置
- 在其他 Slave 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
- 將 Master 節點上的 /usr/local/hadoop 目錄復制到其他 Slave 節點上
- 在 Master 節點上開啟 Hadoop
1.創建Hadoop賬戶
如果你安裝 CentOS 的時候不是用的 “hadoop” 用戶,那么需要增加一個名為 hadoop 的用戶。
打開終端
su # 上述提到的以 root 用戶登錄 useradd -m hadoop -s /bin/bash # 創建新用戶hadoop
接着使用如下命令修改密碼,按提示輸入兩次密碼,可簡單的設為 “hadoop”(密碼隨意指定,若提示“無效的密碼,過於簡單”則再次輸入確認就行):
passwd hadoop
可為 hadoop 用戶增加管理員權限,方便部署,修改文件內容
visudo
添加上一行內容后,先按一下鍵盤上的 ESC
鍵,然后輸入 :wq
(輸入冒號還有wq,這是vi/vim編輯器的保存方法),再按回車鍵保存退出就可以了。
最后注銷當前用戶(點擊屏幕右上角的用戶名,選擇退出->注銷),在登陸界面使用剛創建的 hadoop 用戶進行登陸。(如果已經是 hadoop 用戶,且在終端中使用 su
登錄了 root 用戶,那么需要執行 exit
退出 root 用戶狀態)
2安裝SSH
集群、單節點模式都需要用到 SSH 登陸(類似於遠程登陸,你可以登錄某台 Linux 主機,並且在上面運行命令),一般情況下,CentOS 默認已安裝了 SSH client、SSH server
若需要安裝,則可以通過 yum 進行安裝(安裝過程中會讓你輸入 [y/N],輸入 y 即可):
sudo yum install openssh-clients sudo yum install openssh-server
接着執行如下命令測試一下 SSH 是否可用:
ssh localhost
此時會有如下提示(SSH首次登陸提示),輸入 yes 。然后按提示輸入密碼 hadoop,這樣就登陸到本機了。
但這樣登陸是需要每次輸入密碼的,我們需要配置成SSH無密碼登陸比較方便。
首先輸入 exit
退出剛才的 ssh,就回到了我們原先的終端窗口,然后利用 ssh-keygen 生成密鑰,並將密鑰加入到授權中:
exit # 退出剛才的 ssh localhost cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost ssh-keygen -t rsa # 會有提示,都按回車就可以 cat id_rsa.pub >> authorized_keys # 加入授權 chmod 600 ./authorized_keys # 修改文件權限
此時再用 ssh localhost
命令,無需輸入密碼就可以直接登陸了,如下圖所示。
3安裝Java
sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
查看安裝路徑,紅色以前的部分為安裝路徑
rpm -ql java-1.7.0-openjdk-devel | grep '/bin/javac'
接着需要配置一下 JAVA_HOME 環境變量,為方便,我們在 ~/.bashrc 中進行設置
vim ~/.bashrc
在文件最后面添加如下單獨一行(指向 JDK 的安裝位置),並保存下面的第一行:
使變量生效
source ~/.bashrc # 使變量設置生效
檢驗是否正確
echo $JAVA_HOME # 檢驗變量值 java -version $JAVA_HOME/bin/java -version # 與直接執行 java -version 一樣
此時,其他的節點也要作如上的操作。
4配置局域網
使用交換機和網線將電腦連接起來。
添加網絡,配置ip,每個節點都要設置網絡,例如主節點設置的ip為192.168.0.1,其他節點可以三192.168.0.2等,子網掩碼為255.255.255.0,網關設置為和主節點的ip一樣。
添加完后可以ping命令,,檢查是否在一個局域網內。
為了便於區分,可以修改各個節點的主機名(在終端標題、命令行中可以看到主機名,以便區分)。在 Ubuntu/CentOS 7 中,我們在 Master 節點上執行如下命令修改主機名(即改為 Master,注意是區分大小寫的):
sudo vim /etc/hostname
然后執行如下命令修改自己所用節點的IP映射:
sudo vim /etc/hosts
我們在 /etc/hosts 中將該映射關系填寫上去即可,如下圖所示(一般該文件中只有一個 127.0.0.1,其對應名為 localhost,如果有多余的應刪除,特別是不能有 “127.0.0.1 Master” 這樣的記錄).
修改完成后需要重啟一下,重啟后在終端中才會看到機器名的變化。接下來的教程中請注意區分 Master 節點與 Slave 節點的操作。
5 SSH無密碼登陸節點
這個操作是要讓 Master 節點可以無密碼 SSH 登陸到各個 Slave 節點上。
首先生成 Master 節點的公匙,在 Master 節點的終端中執行(因為改過主機名,所以還需要刪掉原有的再重新生成一次):
cd ~/.ssh # 如果沒有該目錄,先執行一次ssh localhost rm ./id_rsa* # 刪除之前生成的公匙(如果有) ssh-keygen -t rsa # 一直按回車就可以
在Master節點上運行
cat ./id_rsa.pub >> ./authorized_keys
完成后可執行 ssh Master
驗證一下(可能需要輸入 yes,成功后執行 exit
返回原來的終端)。接着在 Master 節點將上公匙傳輸到 全部的Slave 節點:
scp ~/.ssh/id_rsa.pub hadoop@Slave1:/home/hadoop/
scp 是 secure copy 的簡寫,用於在 Linux 下進行遠程拷貝文件,類似於 cp 命令,不過 cp 只能在本機中拷貝。執行 scp 時會要求輸入 Slave1 上 hadoop 用戶的密碼(hadoop),輸入完成后會提示傳輸完畢。
接着在 Slave1 節點上,將 ssh 公匙加入授權:
mkdir ~/.ssh # 如果不存在該文件夾需先創建,若已存在則忽略 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys rm ~/id_rsa.pub # 用完就可以刪掉了
如果有其他 Slave 節點,也要執行將 Master 公匙傳輸到 Slave 節點、在 Slave 節點上加入授權這兩步。
這樣,在 Master 節點上就可以無密碼 SSH 到各個 Slave 節點了,可在 Master 節點上執行如下命令進行檢驗,如下圖所示:
6安裝Hadoop
下載時請下載 hadoop-2.x.y.tar.gz 這個格式的文件,這是編譯好的
我們選擇將 Hadoop 安裝至 /usr/local/ 中:
sudo tar -zxf ~/下載/hadoop-2.6.0.tar.gz -C /usr/local # 解壓到/usr/local中 cd /usr/local/ sudo mv ./hadoop-2.6.0/ ./hadoop # 將文件夾名改為hadoop sudo chown -R hadoop:hadoop ./hadoop # 修改文件權限
Hadoop 解壓后即可使用。輸入如下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本信息:
cd /usr/local/hadoop ./bin/hadoop version
將 Hadoop 安裝目錄加入 PATH 變量中,這樣就可以在任意目錄中直接使用 hadoo、hdfs 等命令了,如果還沒有配置的,需要在 Master 節點上進行配置。首先執行 vim ~/.bashrc
,加入一行:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
保存后執行 source ~/.bashrc
使配置生效。
7配置集群/分布式環境
集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5個配置文件,更多設置項可點擊查看官方說明,這里僅設置了正常啟動所必須的設置項: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
1, 文件 slaves,將作為 DataNode 的主機名寫入該文件,每行一個,默認為 localhost,所以在偽分布式配置時,節點即作為 NameNode 也作為 DataNode。分布式配置可以保留 localhost,也可以刪掉,讓 Master 節點僅作為 NameNode 使用。
本教程讓 Master 節點僅作為 NameNode 使用,因此將文件中原來的 localhost 刪除,只添加一行內容:Slave1。
2, 文件 core-site.xml 改為下面的配置:
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://Master:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/usr/local/hadoop/tmp</value> <description>Abase for other temporary directories.</description> </property> </configuration>
3, 文件 hdfs-site.xml,dfs.replication 一般設為 3,但我們只有一個 Slave 節點,所以 dfs.replication 的值還是設為 1:
<configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>Master:50090</value> </property> <property> <name>dfs.replication</name> <value>1</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/usr/local/hadoop/tmp/dfs/data</value> </property> </configuration>
4, 文件 mapred-site.xml (可能需要先重命名,默認文件名為 mapred-site.xml.template),然后配置修改如下:
<configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>Master:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>Master:19888</value> </property> </configuration>
5, 文件 yarn-site.xml:
<configuration> <property> <name>yarn.resourcemanager.hostname</name> <value>Master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
配置好后,將 Master 上的 /usr/local/Hadoop 文件夾復制到各個節點上。因為之前有跑過偽分布式模式,建議在切換到集群模式前先刪除之前的臨時文件。在 Master 節點上執行:
cd /usr/local sudo rm -r ./hadoop/tmp # 刪除 Hadoop 臨時文件 sudo rm -r ./hadoop/logs/* # 刪除日志文件 tar -zcf ~/hadoop.master.tar.gz ./hadoop # 先壓縮再復制 cd ~ scp ./hadoop.master.tar.gz Slave1:/home/hadoop
在 Slave1 節點上執行:注意上面最后一行的Slave1,其他節點可改為Slave2,3,4等,同樣下面也要在不同的節點允許
sudo rm -r /usr/local/hadoop # 刪掉舊的(如果存在) sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local sudo chown -R hadoop /usr/local/hadoop
同樣,如果有其他 Slave 節點,也要執行將 hadoop.master.tar.gz 傳輸到 Slave 節點、在 Slave 節點解壓文件的操作。
首次啟動需要先在 Master 節點執行 NameNode 的格式化:
hdfs namenode -format # 首次運行需要執行初始化,之后不需要
關閉防火牆centos7
systemctl stop firewalld.service # 關閉firewall
systemctl disable firewalld.service # 禁止firewall開機啟動
接着可以啟動 hadoop 了,啟動需要在 Master 節點上進行:
start-dfs.sh start-yarn.sh mr-jobhistory-daemon.sh start historyserver
通過命令 jps
可以查看各個節點所啟動的進程。正確的話,在 Master 節點上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 進程,如下圖所示:
缺少任一進程都表示出錯。另外還需要在 Master 節點上通過命令 hdfs dfsadmin -report
查看 DataNode 是否正常啟動,如果 Live datanodes 不為 0 ,則說明集群啟動成功。例如我這邊一共有 3個 Datanodes:
1, 從分布式切換到偽分布式時,不要忘記修改 slaves 配置文件;
2, 在兩者之間切換時,若遇到無法正常啟動的情況,可以刪除所涉及節點的臨時文件夾,這樣雖然之前的數據會被刪掉,但能保證集群正確啟動。所以如果集群以前能啟動,但后來啟動不了,特別是 DataNode 無法啟動,不妨試着刪除所有節點(包括 Slave 節點)上的 /usr/local/hadoop/tmp 文件夾,再重新執行一次 hdfs namenode -format
,再次啟動試試。
8運行示例
以wordcount為例
在Master的home文件夾,建立file文件夾,里面放幾個文本文件。可參考網上的教程
#新建文件夾
hadoop fs -mkdir input2
#查看文件夾
hadoop fs -ls
#將home文件夾中的file1文件夾內的文件放到input2中 hadoop fs -put ~/file1/file*.txt input2 #允許wordcount示例程序,輸出到output3中,需要自定義,更改文件夾名稱 hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.1.jar wordcount input2 output3 #將結果輸出,更改路徑 hadoop fs -cat output3/part-r-00000
有樹莓派時,運行較慢
把連接樹莓派的網線去掉,並stop-all.sh,start-all.sh重新啟動hadoop
如果在安全模式,則可以等待或者強制關閉安全模式
hadoop dfsadmin -safemode leave
重啟hadoop只有一個datanode,只需要二十幾s即可計算完畢。
查看結果,這個文件是Centos的瀏覽器歡迎界面復制了很多遍,因此單詞個數很有規律。
可以想象,如果硬件配置更好,節點更多時,處理效率會更高。被樹莓派折騰了好久,折騰了樹莓派好久。
9 問題集錦
1. 問題:卡住沒有mapreduce進度,且DataNode節點Java進程占用大量CPU
解決方案:在master節點關閉Hadoop集群,在slave節點用top命令查看Java是否大量占用內存,如果占用則根據其pid關閉進程,即kill 32540(32540為pid,下圖的紅圈所示),再次啟動Hadoop集群,且注意輸出目錄不要和已經存在的目錄的重復。