- Hadoop 集群的安裝配置大致為如下流程:
- 選定一臺機器作為 Master
- 在 Master 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
- 在 Master 節點上安裝 Hadoop,并完成配置
- 在其他 Slave 節點上配置 hadoop 用戶、安裝 SSH server、安裝 Java 環境
- 將 Master 節點上的 /usr/local/hadoop 目錄復制到其他 Slave 節點上
- 在 Master 節點上開啟 Hadoop
- 為便于區分,首先修改各個主機的主機名
sudo vim /etc/hostname
將Master主機的主機名修改為Master,Slave主機的主機名修改為Slave1.
- 然后更改兩個主機的映射
sudo vim /etc/hosts
將文件內容改為
192.168.128.128 Master
192.168.128.129 Slave1
完成后應保證Master與Slave節點之間能ping通。
ping Master -c 3 # 只ping 3次,否則要按 Ctrl+c 中斷
ping Slave1 -c 3
- 設置SSH免密碼登陸
首先在Master節點中生成共鑰
cd ~/.ssh # 如果沒有該目錄,先執行一次ssh localhost
rm ./id_rsa* # 刪除之前生成的公匙(如果有)
ssh-keygen -t rsa # 一直按回車就可以
然后將公鑰添加到Master節點的信任列表,使得Master可以SSH到本機
eversilver@debian:~/.ssh$ cat ./id_rsa.pub >> ~/.ssh/authorized_keys
eversilver@debian:~/.ssh$ ssh Master
The authenticity of host 'master (192.168.128.128)' can't be established.
ECDSA key fingerprint is 67:e8:69:98:28:91:04:20:5c:00:bb:6b:e8:bb:51:94.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'master,192.168.128.128' (ECDSA) to the list of known hosts.
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Mon May 8 09:59:42 2017 from 192.168.128.1
eversilver@debian:~$
同樣將公鑰傳遞給Slave1節點,并在Slave1上將其加入到其信任列表上。
eversilver@debian:~$ scp /home/eversilver/.ssh/id_rsa.pub eversilver@Slave1:/home/eversilver
The authenticity of host 'slave1 (192.168.128.129)' can't be established.
ECDSA key fingerprint is 67:e8:69:98:28:91:04:20:5c:00:bb:6b:e8:bb:51:94.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'slave1,192.168.128.129' (ECDSA) to the list of known hosts.
eversilver@slave1's password:
id_rsa.pub 100% 399 0.4KB/s 00:00
在Slave1上執行
eversilver@debian:/usr/local/hadoop$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
eversilver@debian:/usr/local/hadoop$ rm ~/id_rsa.pub
eversilver@debian:/usr/local/hadoop$
再在Master進行登陸
eversilver@debian:~$ ssh Slave1
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
Last login: Mon May 8 12:05:08 2017 from 192.168.128.1
eversilver@debian:~$
說明配置成功
- 配置Hadoop環境變量
HADOOP_HOME=/usr/local/hadoop
export PATH=$HADOOP_HOME/bin:/$HADOOP_HOME/sbin:$PATH
- 配置分布式環境
集群/分布式模式需要修改 /usr/local/hadoop/etc/hadoop 中的5個配置文件,更多設置項可點擊查看官方說明,這里僅設置了正常啟動所必須的設置項: slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml 。
- 文件 slaves,將作為 DataNode 的主機名寫入該文件,每行一個,默認為 localhost,所以在偽分布式配置時,節點即作為 NameNode 也作為 DataNode。分布式配置可以保留 localhost,也可以刪掉,讓 Master 節點僅作為 NameNode 使用。
本教程讓 Master 節點僅作為 NameNode 使用,因此將文件中原來的 localhost 刪除,只添加一行內容:Slave1。 - 文件 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>
- 文件 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>
- 文件 mapred-site.xml
<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>
- 文件 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 節點上執行:
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 # 首次運行需要執行初始化,之后不需要
- 接著可以啟動 hadoop 了,啟動需要在 Master 節點上進行:
start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
通過命令 jps 可以查看各個節點所啟動的進程。正確的話,在 Master 節點上可以看到 NameNode、ResourceManager、SecondrryNameNode、JobHistoryServer 進程,如下:
eversilver@debian:/usr/local/hadoop$ jps
24178 NameNode
24356 SecondaryNameNode
24501 ResourceManager
13974 QuorumPeerMain
21607 NodeManager
19880 DataNode
24809 JobHistoryServer
24842 Jps
而在Slave1節點中可以看到DataNode以及NodeManager:
eversilver@debian:/usr/local/hadoop$ jps
6579 QuorumPeerMain
9044 DataNode
9141 NodeManager
7176 Kafka
9244 Jps
還需要在 Master 節點上通過命令 hdfs dfsadmin -report 查看 DataNode 是否正常啟動,如果 Live datanodes 不為 0 ,則說明集群啟動成功。
eversilver@debian:/usr/local/hadoop$ hdfs dfsadmin -report
Configured Capacity: 20091629568 (18.71 GB)
Present Capacity: 10727268352 (9.99 GB)
DFS Remaining: 10727243776 (9.99 GB)
DFS Used: 24576 (24 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0
Missing blocks (with replication factor 1): 0
Live datanodes (1):
Name: 192.168.128.129:50010 (Slave1)
Hostname: Slave1
Decommission Status : Normal
Configured Capacity: 20091629568 (18.71 GB)
DFS Used: 24576 (24 KB)
Non DFS Used: 9364361216 (8.72 GB)
DFS Remaining: 10727243776 (9.99 GB)
DFS Used%: 0.00%
DFS Remaining%: 53.39%
Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Mon May 08 14:11:54 CST 2017
eversilver@debian:/usr/local/hadoop$
上面顯示的DataNode數量為1.
- 也可以通過 Web 頁面看到查看 DataNode 和 NameNode 的狀態:http://Master:50070/。
- 偽分布式、分布式配置切換時的注意事項
- 從分布式切換到偽分布式時,不要忘記修改 slaves 配置文件;
- 在兩者之間切換時,若遇到無法正常啟動的情況,可以刪除所涉及節點的臨時文件夾,這樣雖然之前的數據會被刪掉,但能保證集群正確啟動。所以如果集群以前能啟動,但后來啟動不了,特別是 DataNode 無法啟動,不妨試著刪除所有節點(包括 Slave 節點)上的 /usr/local/hadoop/tmp 文件夾,再重新執行一次 hdfs namenode -format,再次啟動試試。
- 執行分布式實例
首先創建 HDFS 上的用戶目錄:
hdfs dfs -mkdir -p /user/hadoop
將 /usr/local/hadoop/etc/hadoop 中的配置文件作為輸入文件復制到分布式文件系統中.并通過查看 DataNode 的狀態(占用大小有改變),輸入文件確實復制到了 DataNode 中:
hdfs dfs -mkdir input
hdfs dfs -put /usr/local/hadoop/etc/hadoop/*.xml input
接著就可以運行 MapReduce 作業了:
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
運行時的輸出信息與偽分布式類似,會顯示 Job 的進度。
同樣可以通過 Web 界面查看任務進度 http://master:8088/cluster,在 Web 界面點擊 “Tracking UI” 這一列的 History 連接,可以看到任務的運行信息,如下圖所示:
執行完畢后的輸出結果:
關閉 Hadoop 集群也是在 Master 節點上執行的:
stop-yarn.sh
stop-dfs.sh
mr-jobhistory-daemon.sh stop historyserver
同偽分布式一樣,也可以不啟動 YARN,但要記得改掉 mapred-site.xml 的文件名。