前言
本文主要介紹了 Hadoop 的三種執行模式以及配置的方式。
執行模式
Hadoop 的執行模式分為三種:
-
Standalone(本地模式/單機模式/local模式)
該模式下沒有任何守護程式,使用者程式和 Hadoop 程式執行在同一個 Java 程式,使用的檔案系統是本地檔案系統而不是分散式檔案系統,此模式下一般用於本地除錯。
-
Pseudo-Distributed(偽叢集模式)
在單機上模擬叢集模式,各守護程式執行在單獨的 Java 程式當中,使用的檔案系統是 HDFS
-
Fully-Distributed(叢集模式)
守護程式執行在叢集上,使用的檔案系統也是 HDFS
配置過程
本次配置基於 Hadoop2.9.2,其中 Standalone 在 CentOS 7.2 系統下進行配置, Pseudo-Distributed 模式在 MacOS 10.14.4 上進行配置,Fully-Distributed 模式在騰訊雲主機上進行配置,叢集由兩臺雲主機組成,分別執行 Ubuntu 14.04.1 和 CentOS 7.2 系統。
環境準備
-
Java 7/8
Hadoop 2.7.x to 2.x 支援 Java 7/8,其它 Hadoop 版本支援的 Java 版本請點選 ? 進行查詢
下載:
sudo yum install java-1.8.0-openjdk-devel //centos 安裝 Java8,ubuntu 下需要用 apt-get 進行安裝 複製程式碼
配置環境變數:
cd ~ vi .bash_profile export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 source .bash_profile 複製程式碼
-
ssh 和 rsync: 用
ssh
和rsync
命令測試後發現 Centos 本身就有,所以無須進行安裝。 -
Hadoop
sudo wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz tar -zxvf hadoop-2.9.2.tar.gz 複製程式碼
這裡的下載地址最好根據雲主機所在的區域進行選擇,如果是國內的雲主機最好使用國內的映象地址,這樣下載會快很多。
Standalone 模式
下載解壓之後的 Hadoop 預設就是 Standalone 模式,可直接執行 wordcount 進行測試
mkdir input //hadoop 的同級目錄建立
cp hadoop-2.9.2/LICENSE.txt input/
hadoop-2.9.2/bin/hadoop jar hadoop-2.9.2/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output //執行 wordcount
cat output/part-r-00000 //檢視結果
複製程式碼
同時再開一個終端在作業執行的時候輸入 jps 檢視程式
可以看到 Standalone 模式下 Hadoop 只會啟動 RunJar 程式來執行整個作業
Pseudo-Distributed 模式
-
修改 etc/hadoop/core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <!--配置訪問 nameNode 的 URI--> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <!--指定臨時目錄,MapReduce 和 HDFS 的許多路徑配置依賴此路徑--> <value>/home/hadoop/tmp</value> </property> </configuration> 複製程式碼
-
修改 etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <!--配置檔案的副本數量--> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> <!--關閉防火牆--> </property> </configuration> 複製程式碼
-
配置免密登入
ssh localhost 測試能否免密登入(如果能夠則跳過以下操作) ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys 複製程式碼
-
修改 etc/hadoop/hadoop-env.sh(如果提示找不到 JAVA_HOME)
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 //上面配置的 JAVA_HOME 好像沒起作用 複製程式碼
-
格式化 HDFS
bin/hdfs namenode -format 複製程式碼
-
啟動 HDFS
sbin/start-dfs.sh 複製程式碼
啟動後輸入 jps 看到以下程式即成功,這個時候可以通過 http://localhost:50070/ 訪問 NameNode
-
執行 wordcount
bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/<username> bin/hdfs dfs -mkdir /user/<username>/input bin/hdfs dfs -put LICENSE.txt /user/<username>/input //建立資料夾並上傳檔案 bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output //執行 wordcount bin/hdfs dfs -cat output/part-r-00000 //顯示結果 複製程式碼
在另一終端輸入 jps 可以看到執行時的以下程式
依舊是用 RunJar 提交,只是讀取和寫入採用了 HDFS。
-
通過 YARN 執行 Job(可選配置,不過為了更接近真實叢集還是建議配置)
-
修改 etc/hadoop/mapred-site.xml
cp etc/hadoop/mapred-site.xml.template etc/hadoop/mapred-site.xml vi etc/hadoop/mapred-site.xml 複製程式碼
增加以下內容
<configuration> <property> <name>mapreduce.framework.name</name> <!--表明執行在 YARN 上--> <value>yarn</value> </property> </configuration> 複製程式碼
-
修改 etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name><!--設定resourcemanager的hostname--> <value>localhost</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <!--指定 nodemanager 獲取資料的方式--> <value>mapreduce_shuffle</value> </property> </configuration> 複製程式碼
-
啟動 YARN
sbin/start-yarn.sh 複製程式碼
啟動成功後可以通過 http://localhost:8088/ 訪問 ResourceManager 節點,並且輸入 jps 會顯示以下程式
其中 ResourceManager 和 NodeManager 是屬於 YARN 的程式。
-
重複
7
的操作,輸入 jps 查詢程式可以看到新增加了 YarnChild 程式和 MRAppMaster 程式,之所以有兩個 YarnChild 程式是因為輸入資料夾中存在兩個文字檔案,這說明了 MapReduce 是通過建立多個程式並行計算的。
-
Fully-Distributed 模式
叢集包括兩個節點,節點名分別為 master 和 slave,master 和 slave 的節點配置過程基本一致,以下是配置過程(兩個節點差異配置會進行註明,建議先配置好 master 節點的 Hadoop,然後用 scp 命令複製到 slave 節點進行修改。):
-
修改 /etc/hosts
152.136.76.12 master //騰訊雲公網ip 94.191.43.137 slave 複製程式碼
-
免密登入(⚠️兩個節點的登入名必須一致,這裡都為 root)
master 節點配置本機免密登入以及移動公鑰到子節點 ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 0600 ~/.ssh/authorized_keys scp ~/.ssh/id_rsa.pub root@slave:~/ slave 節點配置 master 節點免密登入 cat ~/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys 複製程式碼
-
修改 etc/hadoop/core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <!--配置訪問 nameNode 的 URI--> <value>hdfs://localhost:9000</value> </property> <property> <name>hadoop.tmp.dir</name> <!--指定臨時目錄,MapReduce 和 HDFS 的許多路徑配置依賴此路徑--> <value>/home/hadoop/tmp</value> </property> </configuration> 複製程式碼
-
修改 etc/hadoop/hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <!--配置檔案的副本數量--> <value>1</value> </property> <property> <name>dfs.permissions</name> <value>false</value> <!--關閉防火牆--> </property> <property> <name>dfs.namenode.secondary.http-address</name> <value>slave:50090</value> <!-- 指定secondarynamenode位置 --> </property> </configuration> 複製程式碼
-
修改 etc/hadoop/mapred-site.xml
<configuration> <property> <name>mapreduce.framework.name</name> <!--表明執行在 YARN 上--> <value>yarn</value> </property> </configuration> 複製程式碼
-
修改 etc/hadoop/yarn-site.xml
<configuration> <property> <name>yarn.resourcemanager.hostname</name><!--設定resourcemanager的hostname--> <value>master</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <!--指定 nodemanager 獲取資料的方式--> <value>mapreduce_shuffle</value> </property> </configuration> 複製程式碼
-
修改 etc/hadoop/hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 //master 和 slave 填入各自路徑 export HADOOP_LOG_DIR=/root/hadoop/hadoop-2.9.2/logs //可以自己選定 複製程式碼
-
修改 etc/hadoop/mapred-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 複製程式碼
-
修改 etc/hadoop/yarn-env.sh
export JAVA_HOME=/usr/lib/jvm/jre-1.8.0-openjdk.i386 export YARN_LOG_DIR=/root/hadoop/hadoop-2.9.2/logs 複製程式碼
-
修改 etc/hadoop/slaves
master slave 複製程式碼
-
啟動 HDFS 和 YARN
bin/hdfs namenode -format //首次執行時格式化 sbin/start-dfs.sh sbin/start-yarn.sh 複製程式碼
在 master 和 slave 節點分別輸入 jps 後有
此時可以通過 http://152.136.76.12:8080 (ip 為 master 的公網 ip) 以及 http://152.136.76.12:50070 分別訪問 HDFS 的 web 介面和 YARN 的 web 介面,可以看到 HDFS 下有一個 slave 節點,YARN 下有兩個節點 -
執行 wordcount(與偽分散式中一致)
bin/hdfs dfs -mkdir /user bin/hdfs dfs -mkdir /user/<username> bin/hdfs dfs -mkdir /user/<username>/input bin/hdfs dfs -put LICENSE.txt /user/<username>/input bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar wordcount input output bin/hdfs dfs -cat output/part-r-00000 複製程式碼
繼續用 jps 檢視兩臺主機的程式
可以看到叢集模式中的程式與偽叢集模式中的程式沒有區別,唯一的區別在於程式在不同的主機上執行。
錯誤
這裡主要記錄配置過程中遇到的一部分錯誤
-
Container exited with a non-zero exit code 1. Error file: prelaunch.err.
該錯誤是在騰訊雲主機上配置的偽叢集模式執行 wordcount 時出現的,嘗試了網上的一些辦法都沒有解決。最後採用自己電腦配置再執行一遍成功,可能是因為雲主機的配置問題。
-
在 YARN 上執行 Java.net.ConnectException: Connection refused
可能是防火牆的原因,根據 ? 中的提示解決
-
無法外網訪問VM中的 Hadoop YARN 的8088埠
無法通過雲主機 ip:8088 訪問 YARN 的 Web 頁面時,不妨通過
netstat -nlp | grep java
檢視當前提供 web 服務的埠,如果 ip 是 127.0.0.1 證明存在問題,需要修改 hosts,具體過程見 ?。 -
slave: bash: line 0: cd: /root/hadoop/hadoop-2.9.2: No such file or directory
配置叢集模式時出現,主要原因是手動配置 slave 時 Hadoop 存放路徑與 master 不一致,只需要將 slave 的 Hadoop 放在與 master 的同一路徑下即可解決。