最近在實(shí)踐中感覺Hadoop避無可避,而安裝往往就體驗(yàn)一把從入門到放棄。盡管環(huán)境搭建現(xiàn)在越來越簡(jiǎn)單,但是還是有很多坑,尤其對(duì)于linux環(huán)境不熟悉的同學(xué)們來講。
本教程適用于原生Hadoop2.7,主要參考了官方安裝教程,按照步驟,基本能夠順利安裝并體驗(yàn)Hadoop的精彩之處。
環(huán)境
系統(tǒng)版本
本教程使用Ubuntu17.10 64位作為安裝系統(tǒng)(16.04以上版本均可)請(qǐng)自行配置安裝
Hadoop 版本
Hadoop 版本
Hadoop主要有三個(gè)版本,Hadoop1.x.y、Hadoop2.x.y和Hadoop3.x.y系列,本教程主要集中處理Hadoop2.7及以上。
新版兼容舊版,低版本代碼可在高版本使用(歡迎驗(yàn)證反饋)
創(chuàng)建Hadoop用戶
- 在終端窗口,輸入如下命令創(chuàng)建用戶
sudo useradd -m hadoop -s /bin/bash
- 使用如下命令設(shè)置密碼,按照提示輸入兩次密碼
sudo passwd hadoop
- 為用戶增加管理員權(quán)限,減少權(quán)限問題
sudo adduser hadoop sudo
- 使用如下命令切換用戶
su - hadoop
安裝Java 環(huán)境
Java 環(huán)境可使用Oracle的JDK或者OpenJDK,可依據(jù)該鏈接步驟安裝https://wiki.apache.org/hadoop/HadoopJavaVersions
或通過如下命令安裝 OpenJDK
sudo apt install openjdk-7-jre openjdk-7-jdk
JRE和JDK區(qū)別
JRE(Java Runtime Environment Java運(yùn)行環(huán)境)是Java運(yùn)行所需環(huán)境。
JDK(Java Development Kit Java軟件開發(fā)工具包)既包括JRE,還包括開發(fā)Java所需的工具和類庫(kù)
- 配置環(huán)境變量
vi ~/.bashrc
export JAVA_HOME=JDK安裝路徑
- 運(yùn)行如下命令,使環(huán)境變量生效
source ~/.bashrc
安裝Hadoop2
Hadoop可通過http://mirror.bit.edu.cn/apache/hadoop/common/或者https://mirrors.cnnic.cn/apache/hadoop/common/下載,一般選擇穩(wěn)定版本,下載是建議下載Hadoop-2.x.y.tar.gz
- Hadoop安裝至
/usr/local/
sudo tar -zxf ~/下載/hadoop-2.7.7.tar.gz -C /usr/local # 解壓到/usr/local中 cd /usr/local/ sudo mv ./hadoop-2.7.7/ ./hadoop # 將文件夾名改為hadoop sudo chown -R hadoop ./hadoop # 修改文件權(quán)限
- Hadoop 解壓后即可使用。輸入如下命令來檢查 Hadoop 是否可用,成功則會(huì)顯示 Hadoop 版本信息:
cd /usr/local/hadoop ./bin/hadoop version
相對(duì)路徑與絕對(duì)路徑的區(qū)別
請(qǐng)務(wù)必注意命令中的相對(duì)路徑與絕對(duì)路徑,本文后續(xù)出現(xiàn)的 ./bin/...,./etc/... 等包含 ./ 的路徑,均為相對(duì)路徑,以 /usr/local/hadoop 為當(dāng)前目錄。例如在 /usr/local/hadoop 目錄中執(zhí)行 ./bin/hadoop version 等同于執(zhí)行 /usr/local/hadoop/bin/hadoop version。可以將相對(duì)路徑改成絕對(duì)路徑來執(zhí)行,但如果你是在主文件夾 ~ 中執(zhí)行 ./bin/hadoop version,執(zhí)行的會(huì)是 /home/hadoop/bin/hadoop version,就不是我們所想要的了。
Hadoop單機(jī)配置(非分布式)
Hadoop 默認(rèn)模式為非分布式模式,無需進(jìn)行其他配置即可運(yùn)行。非分布式即單 Java 進(jìn)程,方便進(jìn)行調(diào)試。
現(xiàn)在我們可以執(zhí)行例子來感受下 Hadoop 的運(yùn)行。Hadoop 附帶了豐富的例子(運(yùn)行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.07.jar 可以看到所有例子),包括 wordcount、terasort、join、grep 等。
在此我們選擇運(yùn)行 grep 例子,我們將 input 文件夾中的所有文件作為輸入,篩選當(dāng)中符合正則表達(dá)式 dfs[a-z.]+ 的單詞并統(tǒng)計(jì)出現(xiàn)的次數(shù),最后輸出結(jié)果到 output 文件夾中。
cd /usr/local/hadoop
mkdir ./input
cp ./etc/hadoop/*.xml ./input # 將配置文件作為輸入文件
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep ./input ./output 'dfs[a-z.]+'
cat ./output/* # 查看運(yùn)行結(jié)果
執(zhí)行成功后如下所示,輸出了作業(yè)的相關(guān)信息,輸出的結(jié)果是符合正則的單詞 dfsadmin 出現(xiàn)了1次
注意:Hadoop 默認(rèn)不會(huì)覆蓋結(jié)果文件,因此再次運(yùn)行上面實(shí)例會(huì)提示出錯(cuò),需要先將 ./output 刪除。
Hadoop偽分布式配置
Hadoop 可以在單節(jié)點(diǎn)上以偽分布式的方式運(yùn)行,Hadoop 進(jìn)程以分離的 Java 進(jìn)程來運(yùn)行,節(jié)點(diǎn)既作為 NameNode 也作為 DataNode,同時(shí),讀取的是 HDFS 中的文件。
Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,偽分布式需要修改2個(gè)配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每個(gè)配置以聲明 property 的 name 和 value 的方式來實(shí)現(xiàn)。
修改配置文件 core-site.xml (通過 gedit 編輯會(huì)比較方便: gedit ./etc/hadoop/core-site.xml),將當(dāng)中的
<configuration>
</configuration>
修改為下面配置:
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
同樣的,修改配置文件 hdfs-site.xml:
<configuration>
<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>
Hadoop配置文件說明
Hadoop 的運(yùn)行方式是由配置文件決定的(運(yùn)行 Hadoop 時(shí)會(huì)讀取配置文件),因此如果需要從偽分布式模式切換回非分布式模式,需要?jiǎng)h除 core-site.xml 中的配置項(xiàng)。
此外,偽分布式雖然只需要配置 fs.defaultFS 和 dfs.replication 就可以運(yùn)行(官方教程如此),不過若沒有配置 hadoop.tmp.dir 參數(shù),則默認(rèn)使用的臨時(shí)目錄為 /tmp/hadoo-hadoop,而這個(gè)目錄在重啟時(shí)有可能被系統(tǒng)清理掉,導(dǎo)致必須重新執(zhí)行 format 才行。所以我們進(jìn)行了設(shè)置,同時(shí)也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,否則在接下來的步驟中可能會(huì)出錯(cuò)。
-
配置完成后,執(zhí)行 NameNode 的格式化:
./bin/hdfs namenode -format
如果在這一步時(shí)提示 Error: JAVA_HOME is not set and could not be found. 的錯(cuò)誤,則說明之前設(shè)置 JAVA_HOME 環(huán)境變量那邊就沒設(shè)置好,請(qǐng)按教程先設(shè)置好 JAVA_HOME 變量,否則后面的過程都是進(jìn)行不下去的。若JAVA_HOME設(shè)置正確,則修改./etc/hadoop/hadoop-env.sh
添加環(huán)境變量expect JAVA_HOME=JDK安裝路徑
-
接著開啟 NameNode 和 DataNode 守護(hù)進(jìn)程。
./sbin/start-dfs.sh
啟動(dòng) Hadoop 時(shí)提示 Could not resolve hostname
如果啟動(dòng) Hadoop 時(shí)遇到輸出非常多“ssh: Could not resolve hostname xxx”的異常情況
這個(gè)并不是 ssh 的問題,可通過設(shè)置 Hadoop 環(huán)境變量來解決。首先按鍵盤的 ctrl + c 中斷啟動(dòng),然后在 ~/.bashrc 中,增加如下兩行內(nèi)容(設(shè)置過程與 JAVA_HOME 變量一樣,其中 HADOOP_HOME 為 Hadoop 的安裝目錄):
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
保存后,務(wù)必執(zhí)行 source ~/.bashrc 使變量設(shè)置生效,然后再次執(zhí)行 ./sbin/start-dfs.sh 啟動(dòng) Hadoop。
啟動(dòng)完成后,可以通過命令 jps 來判斷是否成功啟動(dòng),若成功啟動(dòng)則會(huì)列出如下進(jìn)程: “NameNode”、”DataNode” 和 “SecondaryNameNode”(如果 SecondaryNameNode 沒有啟動(dòng),請(qǐng)運(yùn)行 sbin/stop-dfs.sh 關(guān)閉進(jìn)程,然后再次嘗試啟動(dòng)嘗試)。如果沒有 NameNode 或 DataNode ,那就是配置不成功,請(qǐng)仔細(xì)檢查之前步驟,或通過查看啟動(dòng)日志排查原因。
- 成功啟動(dòng)后,可以訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,還可以在線查看 HDFS 中的文件。
運(yùn)行Hadoop偽分布式實(shí)例
上面的單機(jī)模式,grep 例子讀取的是本地?cái)?shù)據(jù),偽分布式讀取的則是 HDFS 上的數(shù)據(jù)。要使用 HDFS,首先需要在 HDFS 中創(chuàng)建用戶目錄:
./bin/hdfs dfs -mkdir -p /user/hadoop
接著將 ./etc/hadoop 中的 xml 文件作為輸入文件復(fù)制到分布式文件系統(tǒng)中,即將 /usr/local/hadoop/etc/hadoop 復(fù)制到分布式文件系統(tǒng)中的 /user/hadoop/input 中。我們使用的是 hadoop 用戶,并且已創(chuàng)建相應(yīng)的用戶目錄 /user/hadoop ,因此在命令中就可以使用相對(duì)路徑如 input,其對(duì)應(yīng)的絕對(duì)路徑就是 /user/hadoop/input:
./bin/hdfs dfs -mkdir input
./bin/hdfs dfs -put ./etc/hadoop/*.xml input
復(fù)制完成后,可以通過如下命令查看文件列表
./bin/hdfs dfs -ls input
偽分布式運(yùn)行 MapReduce 作業(yè)的方式跟單機(jī)模式相同,區(qū)別在于偽分布式讀取的是HDFS中的文件(可以將單機(jī)步驟中創(chuàng)建的本地 input 文件夾,輸出結(jié)果 output 文件夾都刪掉來驗(yàn)證這一點(diǎn))。
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
查看運(yùn)行結(jié)果的命令(查看的是位于 HDFS 中的輸出結(jié)果):
./bin/hdfs dfs -cat output/*
我們也可以將運(yùn)行結(jié)果取回到本地:
rm -r ./output # 先刪除本地的 output 文件夾(如果存在)
./bin/hdfs dfs -get output ./output # 將 HDFS 上的 output 文件夾拷貝到本機(jī)
cat ./output/*
./bin/hdfs dfs -rm -r output # 刪除 output 文件夾
關(guān)閉Hadoop :./sbin/stop-dfs.sh