完全分散式Hadoop叢集的安裝搭建和配置(4節點)
Hadoop版本:hadoop-2.5.1-x64.tar.gz
學習參考了給力星http://www.powerxing.com/install-hadoop-cluster/的兩個節點的hadoop搭建過程,我用VirtualBox開了四個Ubuntu(版本15.10)虛擬機器,搭建了四個節點的Hadoop分散式叢集,並配置了HA,適合首次搭建的同學參考,節點設計如下:
一、準備工作
在Master節點完成基本工作,包括配置Hadoop使用者,安裝配置ssh,安裝配置java環境,這個階段給力星同學寫得很詳細,每一步都有解釋。1、新建hadoop使用者
建議安裝虛擬機器時使用hadoop使用者名稱,如果不是,新增一個hadoop使用者:sudo useradd -m hadoop -s /bin/bash
為hadoop使用者設定密碼,建議所有密碼都設定為hadoop:
sudo passwd hadoop
為hadoop使用者增加管理員許可權:
sudo adduser hadoop sudo
最後登出當前使用者(點選螢幕右上角的齒輪,選擇登出),在登陸介面使用剛建立的 hadoop使用者進行登陸。用 hadoop 使用者登入後,我們先更新一下 apt,方便後續安裝軟體:
sudo apt-get update
安裝Vim進行文字編輯:
sudo apt-get install vim
2、安裝配置ssh
叢集、單節點模式都需要用到 SSH 登陸(類似於遠端登陸,你可以登入某臺 Linux 主機,並且在上面執行命令),Ubuntu 預設已安裝了 SSH client,此外還需要安裝 SSH server:
sudo apt-get install openssh-server
配置ssh無密碼登入的步驟我們後邊再做。
3、安裝配置java環境
直接通過命令安裝 OpenJDK7:
sudo apt-get install openjdk-7-jre openjdk-7-jdk
安裝好 OpenJDK 後,需要找到相應的安裝路徑,這個路徑是用於配置 JAVA_HOME 環境變數的。執行如下命令:
dpkg -L openjdk-7-jdk | grep '/bin/javac'
該命令會輸出一個路徑,除去路徑末尾的 “/bin/javac”,剩下的就是正確的路徑了。如輸出路徑為/usr/lib/jvm/java-7-openjdk-amd64/bin/javac,則我們需要的路徑為/usr/lib/jvm/java-7-openjdk-amd64。接著配置 JAVA_HOME 環境變數,為方便,我們在 ~/.bashrc 中進行設定:
vim ~/.bashrc
在檔案最前面新增如下單獨一行(注意 = 號前後不能有空格),將“JDK安裝路徑”改為上述命令得到的路徑,並儲存:
export JAVA_HOME=JDK安裝路徑
接著還需要讓該環境變數生效,執行如下程式碼:
source ~/.bashrc # 使變數設定生效
【在 Linux系統中,~代表的是使用者的主資料夾,即“/home/使用者名稱”這個目錄,如你的使用者名稱為hadoop,則 ~就代表 “/home/hadoop/”。】
4、克隆節點
我把Master節點在Virtualbox中克隆了3次,分別命名Slave1,Slave2和Slave3,網路連線方式改為橋接,在所有節點上都要做如下2件事:
修改主機名,和我們設定的節點名稱對應(重啟系統生效):vim /etc/hostname
把你的所有主機名和對應的ip地址加進去(ifconfig檢視本機ip)
vim /etc/hosts
所有節點都完成後,測試一下能不能ping通。
ping Slave1 -c 3 # ping Slave1節點,-c3表示只ping 3次,按Ctrl+c中斷命令
5、配置ssh無密碼登入
在Master節點執行:cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost,然後使用exit退出
ssh-keygen -t rsa # 會有提示,都按回車就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授權
此時再用 ssh localhost 命令,無需輸入密碼就可以直接登陸了。接著在 Master 節點將公匙傳輸到 Slave1 節點:
scp ~/.ssh/id_rsa.pub [email protected]:/home/hadoop/
然後在Slave1節點上操作,將 ssh 公匙加入授權:
mkdir ~/.ssh # 如果不存在該資料夾需先建立,若已存在則忽略
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 用完就可以刪掉了
在別的Slave節點上也要做傳輸和授權公鑰的步驟!
這樣,在 Master 節點上就可以無密碼 SSH 到各個 Slave 節點了。
【scp 是 secure copy 的簡寫,用於在 Linux 下進行遠端拷貝檔案,類似於 cp 命令,不過 cp 只能在本機中拷貝。如果在scp傳檔案時報錯,出現permission denied,到目標檔案修改許可權就行了:
sudo chown –R hadoop 路徑
如果修改許可權時報錯:/etc/sudoers屬於使用者id1000應為0或沒有找到有效的sudoers資源,把上述命令中的sudo去掉就行了】
二、安裝配置Hadoop
1、主節點安裝和配置hadoop
我使用的是2.5.1的64位版本,安裝包放在了“~/下載”這個路徑下,Master節點下執行:
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 # 修改檔案許可權
【./為當前的路徑下的檔案,而/為根目錄,比如我在/usr/local/hadoop路徑下執行cd ./bin就是進入/usr/local/hadoop/bin/hadoop目錄。Ps:cd ..是回上一層目錄】裝完後要改配置檔案,Hadoop 的配置檔案位於 /usr/local/hadoop/etc/hadoop/ 中,在主節點Master上述目錄下修改core-site.xml和hdfs-site.xml和slaves這三個配置檔案:
vim core-site.xml
新增如下內容(myhadoop這一項是自己隨便取的,叫什麼都可以):<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://myhadoop</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>Master:2181,Slave1:2181,Slave2:2181</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop2</value>
</property>
</configuration>
然後修改另一個:vim hdfs-site.xml
新增如下內容:
<configuration>
<property>
<name>dfs.nameservices</name>
<value> myhadoop </value>
</property>
<property>
<name>dfs.ha.namenodes. myhadoop </name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.myhadoop.nn1</name>
<value>Master:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.myhadoop.nn2</name>
<value>Slave1:8020</value>
</property>
<property>
<name>dfs.namenode.http-address. myhadoop.nn1</name>
<value>Master:50070</value>
</property>
<property>
<name>dfs.namenode.http-address. myhadoop.nn2</name>
<value>Slave1:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://Slave1:8485;Slave2:8485;Slave3:8485/ myhadoop </value>
</property>
<property>
<name>dfs.client.failover.proxy.provider. myhadoop </name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/jn/data</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
</configuration>
最後修改這個:
vim slaves
新增如下內容(標示DataNode節點):
Slave1
Slave2
Slave3
2、把配好的hadoop傳給別的節點
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
scp ./hadoop.master.tar.gz Slave2:/home/hadoop
scp ./hadoop.master.tar.gz Slave3:/home/hadoop
然後在所有Slave節點執行:
sudo rm -r /usr/local/hadoop # 刪掉舊的(如果存在)
sudo tar -zxf ~/hadoop.master.tar.gz -C /usr/local
sudo chown -R hadoop /usr/local/hadoop
三、配置HA和啟動
1、zookeeper
下載zookeeper包(我用的3.4.6版本)解壓到/user/local並改成簡單的名子zookeeper(這個過程的操作和裝Hadoop包那一步是一樣的),複製這個目錄下的conf目錄裡的zoo_sample.cfg檔案,重新命名為zoo.cfg儲存在同目錄,命令如下:
cp -a zoo_sample.cfg zoo.cfg
然後修改zoo.cfg,命令如下:
vim zoo.cfg
修改dataDir後的路徑為/opt/zookeeper(這是在opt目錄建立一個zookeeper的檔案),接著在最後新增如下三行(就是在這三個節點上配置zookeeper):
server.1=Master:2888:3888
server.2=Slave1:2888:3888
server.3=Slave2:2888:3888
然後在opt目錄下建立zookeeper檔案,在檔案內新建一個myid檔案並修改:
mkdir /opt/zookeeper
cd /opt/zookeeper/
vim myid
新增一個數字1就行,然後把zookeeper目錄傳到別的zk節點(即slave1和2)的相同目錄(和傳ssh公鑰的操作相同),並修改myid.(Slave1修改為2,Slave2修改為3)
然後給zk新增Path變數(這一步各個zk節點都要做,也就是要做3次):
vim /etc/profile
新增這麼一行:
export PATH=$PATH:/usr/local/zookeeper/bin
然後使之生效:
source /etc/profile
然後就能在任意目錄下啟動zk了(這也就是給zk新增PATH變數的原因):
zkServer.sh start
輸入jps命令檢視一下,有QuorumPeerMain就說明zookeeper啟動成功了。
【如果防火牆沒關,可能會報錯,關防火牆指令:service iptables stop】
2、JournalNode
可在所有Slave節點上啟動journalnode:
hadoop-daemon.sh start journalnode
3、配置Hadoop的PATH路徑
因為hadoop很多命令都是在安裝目錄下執行的,所以我們可以將 Hadoop 安裝目錄加入 PATH 變數中,這樣就可以在任意目錄中直接使用hdfs等命令了,如果還沒有配置的,需要在 Master 節點上進行配置。首先執行 vim ~/.bashrc,加入一行:
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
儲存後執行 source ~/.bashrc 使配置生效。
4、主備NameNode
首次啟動hadoop需要先在 Master 節點執行 NameNode 的格式化:
hdfs namenode -format # 首次執行需要執行初始化,之後不需要
因為Slave1是備用的NameNode節點,它要複製主節點的元資料(儲存在Master的/opt/hadoop2/dfs/name/current中),在複製之前,要先開啟Master節點的NameNode:
hadoop-daemon.sh start namenode
然後再Slave1節點執行:
hdfs namenode -bootstrapStandby
然後Slave1可以啟動NameNode了。5、zkfc
啟動前要先格式化:
hdfs zkfc -formatZK
沒有error就行,然後可以把所有的都啟動起來了:
start-dfs.sh
各個節點執行jps,Master節點應該有jps、NameNode、QuorumPeerMain、DFSZKFailoverConteroller四個服務,Slave1節點應該有前邊4個外加DataNode和journalnode共6個,Slave2節點應該有jps、QuorumPeerMain、DataNode和journalnode四個服務,Slave3節點應該有jps、DataNode和journalnode三個服務。
【如果出現所有的datanode節點沒有啟動,別的正常啟動的情況,把你的每個Slave節點的/opt/hadoop2/dfs/目錄下的data檔案刪除,然後再開啟試試。】
6、上傳檔案
hdfs dfs -mkdir -p /usr/file #新建hdfs一個目錄
hdfs dfs -put /home/hadoop/test /usr/file #put上傳
四、配置YARN
這裡和給力星的配置有差別,建議用我下邊的配置,不然可能會有節點掉線的情況。找到mapred-site.xml檔案(和core-site.xml檔案在一個目錄),新增如下內容:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
再找到yarn-site.xml檔案(和core-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>
<property>
<name> yarn.nodemanager.aux-services.mapreduce.shuffle.class </name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
</configuration>