Hadoop的安裝方式有三種,分別是單機模式,僞分佈式模式,僞分佈式模式,分佈式模式。java
單機模式:Hadoop默認模式爲非分佈式模式(本地模式),無需進行其餘配置便可運行。非分佈式即單Java進程,方便進行調試。node
僞分佈式模式:Hadoop能夠在單節點上以僞分佈式的方式運行,Hadoop進程以分離的Java進程來運行,節點既做爲NameNode也做爲DataNode,同時,讀取的是HDFS中的文件。正則表達式
分佈式模式:使用多個節點構成集羣環境來運行Hadoop。shell
Hadoop 有兩個主要版本,Hadoop 1.x.y 和 Hadoop 2.x.y 系列,Hadoop 2.x 版本在不斷更新,新版是兼容舊版的。apache
裝好了 Ubuntu 系統以後,在安裝 Hadoop 前還須要作一些必備工做。ubuntu
若是安裝 Ubuntu 的時候不是用的 「hadoop」 用戶,那麼須要增長一個名爲 hadoop 的用戶。vim
(1)首先按 ctrl+alt+t 打開終端窗口,輸入以下命令建立新用戶 :瀏覽器
sudo useradd -m hadoop -s /bin/bash
這條命令建立了能夠登錄的 hadoop 用戶,並使用 /bin/bash 做爲 shell。緩存
(2)接着使用以下命令設置密碼,可簡單設置爲 hadoop,按提示輸入兩次密碼:bash
sudo passwd hadoop
(3)可爲 hadoop 用戶增長管理員權限,方便部署,避免一些棘手的權限問題:
sudo adduser hadoop sudo
(4)最後註銷當前用戶(點擊屏幕右上角的齒輪,選擇註銷),返回登錄界面。在登錄界面中選擇剛建立的 hadoop 用戶進行登錄。
在個人電腦上,第一次註銷用戶後,整個界面只顯示出來桌面背景,圖形界面沒法使用,最初覺得是我在建立用戶的過程當中出了什麼問題,重啓了幾回電腦,再次進入Ubuntu後,註銷用戶的功能能夠正常使用了。
apt(Advanced Packaging Tool)是Linux下的一款安裝包管理工具,是一個客戶/服務器系統。
用 hadoop 用戶登陸後,先更新一下 apt,後續使用 apt 安裝軟件,若是沒更新可能有一些軟件安裝不了。按 ctrl+alt+t 打開終端窗口,執行以下命令:
sudo apt-get update
若出現以下 「Hash校驗和不符」 的提示,可經過更改軟件源來解決。若沒有該問題,則不須要更改。從軟件源下載某些軟件的過程當中,可能因爲網絡方面的緣由出現無法下載的狀況,那麼建議更改軟件源。
(1)首先點擊左側任務欄的【系統設置】(齒輪圖標),選擇【軟件和更新】。
(2)點擊 「下載自」 右側的方框,選擇【其餘節點】。
(3)在列表中選中【mirrors.aliyun.com】,並點擊右下角的【選擇服務器】,會要求輸入用戶密碼,輸入便可。
(4)接着點擊關閉,此時會提示列表信息過期,點擊【從新載入】。
(5)最後耐心等待更新緩存便可。更新完成會自動關閉【軟件和更新】這個窗口。若是仍是提示錯誤,請選擇其餘服務器節點如 mirrors.163.com 再次進行嘗試。更新成功後,再次執行 sudo apt-get update
就正常了。
後續須要更改一些配置文件,須要安裝vim。安裝軟件時若須要確認,在提示處輸入 y 便可。
sudo apt-get install vim
vim的經常使用模式有分爲命令模式,插入模式,可視模式,正常模式。
(1)正常模式主要用來瀏覽文本內容。一開始打開vim都是正常模式。在任何模式下按下Esc鍵就能夠返回正常模式。
(2)插入編輯模式則用來向文本中添加內容的。在正常模式下,輸入i鍵便可進入插入編輯模式。
(3)退出vim:若是有利用vim修改任何的文本,必定要記得保存。Esc鍵退回到正常模式中,而後輸入:wq便可保存文本並退出vim
集羣、單節點模式都須要用到 SSH 登錄(相似於遠程登錄,能夠登陸某臺 Linux 主機,而且在上面運行命令),Ubuntu 默認已安裝了 SSH client,此外還須要安裝 SSH server:
sudo apt-get install openssh-server
安裝後,可使用以下命令登錄本機:
ssh localhost
此時會有以下提示(SSH首次登錄提示),輸入 yes 。而後按提示輸入密碼 hadoop,這樣就登錄到本機了。
但這樣登錄是須要每次輸入密碼的,咱們須要配置成SSH無密碼登錄比較方便。
首先退出剛纔的 ssh,就回到了咱們原先的終端窗口,而後利用 ssh-keygen 生成密鑰,並將密鑰加入到受權中:
exit # 退出剛纔的 ssh localhost
cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost
ssh-keygen -t rsa # 會有提示,都按回車就能夠
cat ./id_rsa.pub >> ./authorized_keys # 加入受權
此時再用 ssh localhost
命令,無需輸入密碼就能夠直接登錄了。
Java環境可選擇 Oracle 的 JDK,或是 OpenJDK,新版本在 OpenJDK 1.7 下是沒問題的。爲圖方便,這邊直接經過命令安裝 OpenJDK 7。
sudo apt-get install default-jre default-jdk
上述安裝過程須要訪問網絡下載相關文件,須要保持聯網狀態。安裝結束之後,須要配置JAVA_HOME環境變量,能夠在Linux終端中輸入下面命令打開當前登陸用戶的環境變量配置文件.bashrc:
vim ~/.bashrc
在文件最前面添加以下單獨一行(注意,等號「=」先後不能有空格),而後保存退出:
export JAVA_HOME=/usr/lib/jvm/default-java
接下來,要讓環境變量當即生效,執行以下代碼:
source ~/.bashrc # 使變量設置生效
執行上述命令後,能夠檢驗一下是否設置正確:
echo $JAVA_HOME # 檢驗變量值 java -version $JAVA_HOME/bin/java -version # 與直接執行java -version同樣
至此,就成功安裝了Java環境。下面就能夠進入Hadoop的安裝。
在JDK安裝過程當中,出現了下面的問題:
(1)vim ~/.bashrc打開環境變量配置文件以後,將光標直接移動到了文件的起始位置,而後將「export JAVA_HOME=/usr/lib/jvm/default-java
」粘貼到了文件中,因爲不清楚vim的使用,在網上查找到了「保存並退出」的方法,按住Ctrl,再按兩下Z,而後,而後我也忘了發生了啥。
(2)覺得通過上面的操做就配置完環境變量了,因此在終端中,輸入了上面代碼框中的三條代碼檢驗環境變量是否配置完成,發現環境變量沒有配置成功。
(3)將終端關閉,從新打開,發現終端的頂部出現了錯誤提示:「export JAVA_HOME=/usr/lib/jvm/default-java # ~/.bashrc:executed by bash(1) for non-login shells」,屢次打開、關閉終端,這個提示都沒法消失,考慮重啓電腦。
(4)重啓電腦,輸入密碼登陸Jesse用戶,可以正常使用。註銷用戶後,輸入密碼登陸hadoop用戶,界面黑屏,正中央彈出提示框:「export JAVA_HOME=/usr/lib/jvm/default-java # ~/.bashrc:executed by bash(1) for non-login shells」......,點擊提示框下方的肯定按鈕沒有反應。
(5)把這個錯誤的狀況反映給了俺哥,分析錯誤緣由是我在配置環境變量的時候,將.bashrc文件寫錯了,.bashrc文件主要保存我的的一些個性化設置,如命令別名、路徑等,我的暫時理解成,每次登錄用戶都會啓動執行這個文件,這個文件出錯,會致使用戶沒法登陸進圖形界面,俺哥給出的解決方案是,把這個文件修改回去,因爲我對這個文件的修改僅限於在文件起始位置添加了那一行代碼,因此須要將那一行代碼刪除。
(6)考慮退出圖形界面,在終端裏修改那個文件。按「CTRL+ALT+F2」退出圖形界面,輸入用戶密碼登陸,再輸入vim ~/.bashrc,打開文件,用DEL鍵刪除了前面添加的代碼,「ESC」,「:wq」以後提示「readonly」,代表這個文件不可修改。
(7)思考了一下vim ~/.bashrc這行代碼的意義,決定登陸Jesse用戶,而後在Jesse用戶的圖形界面中找到hadoop文件夾下的.bashrc,在編輯器中刪除第一行代碼,emmmm,沒有保存的權限。
(8)emmmm,考慮到這幾回操做都是由於權限的緣由操做失敗,想到了sudo命令,打開終端,輸入sudo vim ~/.bashrc,輸入Jesse用戶的密碼,在編輯器中刪除第一行代碼,而後「:wq」,保存成功了。也就是說,hadoop的.bashrc文件被修改回去了。
(9)註銷Jesse用戶,從新登陸hadoop用戶,在hadoop用戶的圖形界面中,找到了hadoop文件夾下的.bashrc文件,直接在第一行添加「export JAVA_HOME=/usr/lib/jvm/default-java # 」,保存成功,環境變量設置正確。
emmmm,上面這波操做緣由是沒有將「export JAVA_HOME=/usr/lib/jvm/default-java # 」單獨添加到.bashrc的第一行。
若是使用虛擬機方式安裝Ubuntu系統,請用虛擬機中的Ubuntu自帶firefox瀏覽器下載,才能把hadoop文件下載虛擬機ubuntu中。不要使用Windows系統下的瀏覽器下載,文件會被下載到Windows系統中,虛擬機中的Ubuntu沒法訪問外部Windows系統的文件。
若是是使用雙系統方式安裝Ubuntu系統,進入Ubuntu系統,在Ubuntu系統打開firefox瀏覽器訪下載hadoop文件。
Hadoop 2 能夠經過 http://mirror.bit.edu.cn/apache/hadoop/common/ 或者 http://mirrors.cnnic.cn/apache/hadoop/common/ 下載,通常選擇下載最新的穩定版本,即下載 「stable」 下的 hadoop-2.x.y.tar.gz 這個格式的文件,這是編譯好的,另外一個包含 src 的則是 Hadoop 源代碼,須要進行編譯纔可以使用。
下載完成後,hadoop文件默認的下載位置是「下載」文件夾。選擇將 Hadoop 安裝至 /usr/local/ 中:
sudo tar -zxf ~/下載/hadoop-2.6.0.tar.gz -C /usr/local # 解壓到/usr/local中(根據所下載的hadoop版本進行修改) cd /usr/local/ sudo mv ./hadoop-2.6.0/ ./hadoop # 將文件夾名改成hadoop(根據所下載的hadoop版本進行修改) sudo chown -R hadoop ./hadoop # 修改文件權限
Hadoop 解壓後便可使用。輸入以下命令來檢查 Hadoop 是否可用,成功則會顯示 Hadoop 版本信息:
cd /usr/local/hadoop
./bin/hadoop version
./bin/...
,./etc/...
等包含 ./ 的路徑,均爲相對路徑,以 /usr/local/hadoop 爲當前目錄。例如在 /usr/local/hadoop 目錄中執行 ./bin/hadoop version
等同於執行 /usr/local/hadoop/bin/hadoop version
。能夠將相對路徑改爲絕對路徑來執行,但若是你是在主文件夾 ~ 中執行 ./bin/hadoop version
,執行的會是 /home/hadoop/bin/hadoop version
,就不是咱們所想要的了。Hadoop 默認模式爲非分佈式模式(本地模式),無需進行其餘配置便可運行。非分佈式即單 Java 進程,方便進行調試。
能夠執行例子來感覺下 Hadoop 的運行。Hadoop 附帶了豐富的例子(運行 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar
能夠看到全部例子),包括 wordcount、terasort、join、grep 等。
在此咱們選擇運行 grep 例子,咱們將 input 文件夾中的全部文件做爲輸入,篩選當中符合正則表達式 dfs[a-z.]+ 的單詞並統計出現的次數,最後輸出結果到 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/* # 查看運行結果
執行成功後以下所示,輸出了做業的相關信息,輸出的結果是符合正則的單詞 dfsadmin 出現了1次
注意,Hadoop 默認不會覆蓋結果文件,所以再次運行上面實例會提示出錯,須要先將 ./output
刪除。
Hadoop 能夠在單節點上以僞分佈式的方式運行,Hadoop 進程以分離的 Java 進程來運行,節點既做爲 NameNode 也做爲 DataNode,同時,讀取的是 HDFS 中的文件。
Hadoop 的配置文件位於 /usr/local/hadoop/etc/hadoop/ 中,僞分佈式須要修改2個配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每一個配置以聲明 property 的 name 和 value 的方式來實現。
修改配置文件 core-site.xml (經過 gedit 編輯會比較方便: gedit ./etc/hadoop/core-site.xml
),將當中的
<configuration> </configuration>
修改成下面配置:(hadoop.tmp.dir表示存放臨時數據的目錄,既包括NameNode的數據,也包括DataNode的數據。該路徑任意指定,只要實際存在這個文件夾便可。若是不設置這樣一個目錄,Linux會給出一個默認的目錄,可是這個臨時目錄在每次退出系統時會被清空掉,下次再運行Hadoop的時候又要從新運行NameNode初始化命令。)(name爲fs.defaultFS的值,表示hdfs路徑的邏輯名稱。)
<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:(dfs.replication表示副本的數量,僞分佈式要設置爲1。在HDFS中,每一個數據塊,默認有三個副本,要保證冗餘性。)(dfs.namenode.name.dir表示本地磁盤目錄,是存儲fsimage文件的地方。)(dfs.datanode.data.dir表示本地磁盤目錄,HDFS數據存放block的地方。)
<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 的運行方式是由配置文件決定的(運行 Hadoop 時會讀取配置文件),所以若是須要從僞分佈式模式切換回非分佈式模式,須要刪除 core-site.xml 中的配置項。
此外,僞分佈式雖然只須要配置 fs.defaultFS 和 dfs.replication 就能夠運行(官方教程如此),不過若沒有配置 hadoop.tmp.dir 參數,則默認使用的臨時目錄爲 /tmp/hadoo-hadoop,而這個目錄在重啓時有可能被系統清理掉,致使必須從新執行 format 才行。因此咱們進行了設置,同時也指定 dfs.namenode.name.dir 和 dfs.datanode.data.dir,不然在接下來的步驟中可能會出錯。
配置完成後,執行NameNode的格式化
./bin/hdfs namenode -format
成功的話,會看到 「successfully formatted」 和 「Exitting with status 0」 的提示,若爲 「Exitting with status 1」 則是出錯。
最開始執行./bin/hdfs namenode -format時,顯示某文件沒法找到,考慮多是由於以前已經把以前運行的grep終端關閉了,因此hadoop不在運行的狀態,因此致使沒有執行成功。
從新在終端執行了上一波的grep,執行完畢後,立刻./bin/hdfs namenode -format,終端輸出了一堆亂七八糟的東西。可是和教程中的顯示結果不一樣,教程中要求出現「successfully formatted」 和 「Exitting with status 0」,可是個人運行結果中最後一項沒有輸出,不知道是否是因爲hadoop的版本和教程中的版本不一樣。
若是在這一步時提示 Error: JAVA_HOME is not set and could not be found. 的錯誤,則說明以前設置 JAVA_HOME 環境變量那邊就沒設置好,請按教程先設置好 JAVA_HOME 變量,不然後面的過程都是進行不下去的。若是已經按照前面教程在.bashrc文件中設置了JAVA_HOME,仍是出現 Error: JAVA_HOME is not set and could not be found. 的錯誤,那麼,請到hadoop的安裝目錄修改配置文件「/usr/local/hadoop/etc/hadoop/hadoop-env.sh」,在裏面找到「export JAVA_HOME=${JAVA_HOME}」這行,而後,把它修改爲JAVA安裝路徑的具體地址,好比,「export JAVA_HOME=/usr/lib/jvm/default-java」,而後,再次啓動Hadoop。
接着開啓 NameNode 和 DataNode 守護進程。
./sbin/start-dfs.sh #start-dfs.sh是個完整的可執行文件,中間沒有空格
若出現以下SSH提示"Are you sure you want to continue connecting?",輸入yes便可。\
啓動時可能會出現以下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示能夠忽略,並不會影響正常使用。
啓動完成後,能夠經過命令 jps
來判斷是否成功啓動,若成功啓動則會列出以下進程: 「NameNode」、」DataNode」 和 「SecondaryNameNode」(若是 SecondaryNameNode 沒有啓動,請運行 sbin/stop-dfs.sh 關閉進程,而後再次嘗試啓動嘗試)。若是沒有 NameNode 或 DataNode ,那就是配置不成功,請仔細檢查以前步驟,或經過查看啓動日誌排查緣由。
雖然最後成功啓動NameNode等進程,可是在開啓NameNode和DataNode時,要求輸入密碼,不知道是否是前面設置無密碼SSH登陸失敗。
成功啓動後,能夠訪問 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,還能夠在線查看 HDFS 中的文件。
作到這一步是有點慌的,開啓NameNode和DataNode守護進程的時候,須要我輸入密碼,懷疑前面設置SSH無密碼登陸出現了錯誤。執行NameNode格式化的時候,沒有出現返回0,不知道是否是前面哪一步出了錯誤。不過最後僞分佈式Hadoop仍是啓動成功了。
上面的單機模式,grep 例子讀取的是本地數據,僞分佈式讀取的則是 HDFS 上的數據。要使用 HDFS,首先須要在 HDFS 中建立用戶目錄:
./bin/hdfs dfs -mkdir -p /user/hadoop
接着將 ./etc/hadoop 中的 xml 文件做爲輸入文件複製到分佈式文件系統中,即將 /usr/local/hadoop/etc/hadoop 複製到分佈式文件系統中的 /user/hadoop/input 中。咱們使用的是 hadoop 用戶,而且已建立相應的用戶目錄 /user/hadoop ,所以在命令中就可使用相對路徑如 input,其對應的絕對路徑就是 /user/hadoop/input:
./bin/hdfs dfs -mkdir input ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
複製完成後,能夠經過以下命令查看文件列表:
./bin/hdfs dfs -ls input
僞分佈式運行 MapReduce 做業的方式跟單機模式相同,區別在於僞分佈式讀取的是HDFS中的文件(能夠將單機步驟中建立的本地 input 文件夾,輸出結果 output 文件夾都刪掉來驗證這一點)。
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'
查看運行結果的命令(查看的是位於 HDFS 中的輸出結果):
./bin/hdfs dfs -cat output/*
結果以下,注意到剛纔已經更改了配置文件,因此運行結果不一樣。
也能夠將運行結果取回到本地:
rm -r ./output # 先刪除本地的 output 文件夾(若是存在) ./bin/hdfs dfs -get output ./output # 將 HDFS 上的 output 文件夾拷貝到本機 cat ./output/*
Hadoop 運行程序時,輸出目錄不能存在,不然會提示錯誤 「org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/user/hadoop/output already exists」 ,所以若要再次執行,須要執行以下命令刪除 output 文件夾:
./bin/hdfs dfs -rm -r output # 刪除 output 文件夾
運行程序時,輸出目錄不能存在
運行 Hadoop 程序時,爲了防止覆蓋結果,程序指定的輸出目錄(如 output)不能存在,不然會提示錯誤,所以運行前須要先刪除輸出目錄。在實際開發應用程序時,可考慮在程序中加上以下代碼,能在每次運行時自動刪除輸出目錄,避免繁瑣的命令行操做:
Configuration conf = new Configuration(); Job job = new Job(conf); /* 刪除輸出目錄 */ Path outputPath = new Path(args[1]); outputPath.getFileSystem(conf).delete(outputPath, true);
若要關閉 Hadoop,則運行
./sbin/stop-dfs.sh
下次啓動 hadoop 時,無需進行 NameNode 的初始化,只須要運行 ./sbin/start-dfs.sh
就能夠。