Hadoop 部署文檔
- Hadoop 部署文檔
- 1 先決條件
- 2 下載二進制文件
- 3 修改配置文件
- 3.1 core-site.xml
- 3.2 hdfs-site.xml
- 3.3 mapred-site.xml
- 3.4 yarn.xml
- 3.5 slaves
- 3.6 hadoop-env.sh
- 4 將配置好的 Hadoop 分發到其他節點
- 5 啟動集群
- 5.1 格式化 HDFS
- 5.2 啟動集群
- 6 提交示例任務
- 7 坑
- 7.1 hostname 配置
- 7.2 format 命令
- 7.3 日誌
- 7.4 配置文件的同步
- 8 參考
本文檔中的集群包含 192.168.105.10/11/12 三臺機器。三臺機器的 hostname 分別設為 ivic10/ivic11/ivic12,其中第一臺機器作為 master,後兩臺作為 slaves。
1 先決條件
在開始安裝 Hadoop 之前,請確認集群的每臺機器上均已安裝 JDK1.8(註意是 SunJDK 而不是 OpenJDK),並且已經配置好密鑰登陸(服務器兩兩之間可以無密碼SSH登陸)。
除此之外還需要在三臺機器的 /etc/hosts 文件中寫入以下內容(需要root權限)
192.168.105.10 ivic10
192.168.105.11 ivic11
192.168.105.12 ivic12
配置好以後,在任意一臺機器上可以用 hostname 無密碼 SSH 登陸到另外兩臺機器上
#在ivic10上操作
ssh ivic11
#如果一切正常,應該可以直接登陸到ivic11上
2 下載二進制文件
在Hadoop的 release 頁面中有數個版本可以選擇,因為後續要在 Hadoop 集群上部署其他應用,所以這裏選擇兼容性最好的 2.7.7 版本。
mkdir ~/bigdata
cd ~/bigdata
#Apache網站上的鏡像太慢,從清華鏡像下載
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.7.7/hadoop-2.7.7.tar.gz
#解壓到當前文件夾
tar -xzvf hadoop-2.7.7.tar.gz -C .
3 修改配置文件
首先在 ~/.profile
中添加環境變量
export HADOOP_HOME=/home/ivic/bigdata/hadoop-2.7.7 export PATH=$PATH:$HADOOP_HOME/bin
用 source
命令讓環境變量立即生效
source ~/.profile
然後切換到 Hadoop 的配置文件目錄下,開始修改 Hadoop 的配置文件 cd ~/bigdata/hadoop-2.7.7/etc/hadoop
3.1 core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ivic10:9000/</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/tmp/hadoop-2.7.7</value>
</property>
</configuration>
通過fs.defaultFS
指定 NameNode 的 IP 地址和端口號,通過hadoop.tmp.dir
指定臨時文件存放路徑
3.2 hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/ivic/bigdata/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/home/ivic/bigdata/hdfs/data</value>
</property>
</configuration>
dfs.replication
指定備份數目為 3,dfs.name.dir
指定 NameNode 的文件存儲路徑,dfs.data.dir
指定 DataNode 的文件存儲路徑。
3.3 mapred-site.xml
#將mapred-site.xml.template復制一份
cp mapred-site.xml.template mapreduce-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
3.4 yarn.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>ivic10</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
<description>Whether virtual memory limits will be enforced for containers</description>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>4</value>
<description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
</property>
</configuration>
配置後兩項是因為在部署 Flink on Yarn 的過程中出現了 FlinkYarnSession 無法啟動的問題,從 StackOverflow 得知應該在此處加上這兩項配置,否則虛擬內存占用會超出限制導致 Flink 無法啟動。
3.5 slaves
ivic11
ivic12
3.6 hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8.0_201
4 將配置好的 Hadoop 分發到其他節點
#需要先在11/12節點上建立 /homne/ivic/bigdata/ 文件夾
scp -r /home/ivic/bigdata/hadoop-2.7.7 192.168.105.11:/home/ivic/bigdata/hadoop-2.7.7
scp -r /home/ivic/bigdata/hadoop-2.7.7 192.168.105.12:/home/ivic/bigdata/hadoop-2.7.7
然後分別在其他節點上配置環境變量 HADOOP_HOME
和 PATH
。
5 啟動集群
5.1 格式化 HDFS
cd ~/bigdata/hadoop-2.7.7
hdfs namenode -format
註意:此命令只有在第一次啟動前需要執行,目的是格式化 NameNode
5.2 啟動集群
#啟動 HDFS
./sbin/start-dfs.sh
#啟動 YARN
./sbin/start-yarn.sh
#以上兩條命令也可以用 ./sbin/start-all.sh 代替
#關閉集群 ./sbin/stop-all.sh
使用 jps 命令查看服務運行情況
#master節點中運行的服務
25928 SecondaryNameNode
25742 NameNode
26387 Jps
26078 ResourceManager
#slave節點中運行的服務
24002 NodeManager
23899 DataNode
24179 Jps
6 提交示例任務
如果一切順利,現在可以向 Hadoop 提交任務了。這裏我們使用 Hadoop 自帶的實例程序運行 wordcount 任務,以此驗證 Hadoop 是否部署成功。
cd ~/bigdata/hadoop-2.7.7
#把當前路徑下的 LICENSE.txt 文件復制到 HDFS 中
hadoop fs -put ./LICENSE.txt /wordcount/input
#提交任務,最後兩個參數分別指定任務的輸入和輸出
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /wordcount/input /wordcount/output
#查看輸出路徑
hadoop fs -ls /wordcount/output
#如果一切正常,該路徑下包含兩個文件
#第一個文件是空文件,表示任務運行成功
/wordcount/output/_SUCCESS
#第二個文件是輸出文件,統計了 LICENSE.txt 中每個單詞出現的次數
/wordcount/output/part-r-00000
7 坑
7.1 hostname 配置
之前部署 Hadoop 的時候都是在 192.168.7.x 的機器上,那些機器的 hostname 和 hosts 都已經配置好了,直接用就行。但是 192.168.105.x 的這幾臺機器並沒有配好,每臺機器的 hostname 都是 ivic。
一開始嫌麻煩就沒配,在配置文件裏直接填了 IP 地址,結果最後啟動集群以後就出現了一個很奇怪的現象————用 jps 命令查看每個節點的服務,一切正常,但在 web ui 裏看不到可用的 DataNode,總可用空間是 0。後來看 DataNode 上的日誌文件才發現是 hostname 無法解析,不知道為什麽 Hadoop 把 IP 地址當作 hostname 了。於是重新配置 hostname,配好以後再重啟 Hadoop,問題解決。
hostname 的 配置過程如下(這幾臺機器上裝的是 Ubuntu 18.04,不同系統的配置過程略有區別)
#將該文件中的內容修改為想要的hostname,比如ivic10
sudo vim /etc/hostname
#讓修改立即生效
hostname ivic10
7.2 format 命令
在排查上一個問題的過程時,我曾經嘗試把 Hadoop 集群停掉然後用 hdfs namenode -format
命令格式化 NameNode,達到“恢復出廠設置”的效果。然而這樣做以後再啟動 hdfs,原本能啟動的 DataNode 現在也啟動不了了。瀏覽 NameNode 的日誌發現問題出在 DataNode 的 cluster id 和 NameNode 不一致,所以無法啟動。原來 format 命令會為 NameNode 生成一個新的 cluster id,而 DataNode 的 cluster id 信息存儲在 dfs.datanode.data.dir
中,並沒有發生變化,因此會產生沖突。解決方案是在執行 format 命令之後刪除所有 DataNode 的 dfs.datanode.data.dir
,也就是 /home/ivic/bigdata/hdfs/data
文件夾。
7.3 日誌
Hadoop 的日誌系統很完善,出了問題在日誌裏都能找到原因。如果 NameNode 啟動不了,就去看 NameNode 的日誌,DataNode 啟動不了,就去看 DataNode 的日誌。日誌文件路徑為 $HADOOP_HOME/logs
7.4 配置文件的同步
如果集群用的是 nfs,改一臺機器的配置文件其他機器上就全部同步修改好了(不過要註意不要把 dfs.namenode.name.dir
和 dfs.datanode.data.dir
配置到網絡文件系統上)。
如果沒有 nfs 該怎麽辦呢,難道每次都要手動修改所有機器上的配置文件嗎?不是滴,這時候就需要祭出神器 rsync 了,只要用一條命令就可以把修改推送到其他機器上。
舉個例子,比如你剛在 ivic10 上修改了 $HADOOP_HOME/etc/hadoop/
路徑下的 core-site.xml,hdfs-site.xml,yarn.xml 三個文件,如何把修改同步到 ivic11 和 ivic12 呢?
cd $HADOOP_HOME/etc
for ip in 11 12; do rsync -r hadoop ivic@ivic${ip}:/home/ivic/bigdata/hadoop-2.7.7/etc; done
搞定。
8 參考
- FS Shell Commands
- rsync 的使用方法
- Hadoop 分布式集群搭建
- Hadoop Cluster Setup
Hadoop 部署文檔