本教程使用
Ubuntu 18.04 64位作為系統環境(或者Ubuntu 20.04LTS, 也行,32位、64位均可),請自行百度安裝虛拟機系統或本地安裝。
裝好了 Ubuntu 系統之後,在安裝 Hadoop 前還需要做一些必備工作。
建立hadoop使用者如果你安裝 Ubuntu 的時候不是用的 “hadoop” 使用者,那麼需要增加一個名為 hadoop 的使用者。
首先按
ctrl+alt+t打開終端視窗,輸入如下指令建立新使用者 :
sudo useradd -m hadoop -s /bin/bash #建立hadoop使用者
sudo passwd hadoop #指令設定密碼,可簡單設定為 hadoop
sudo adduser hadoop sudo #增加hadoop使用者權限
更新apt 用 hadoop 使用者登入後,我們先更新一下 apt,後續我們使用 apt 安裝軟體,如果沒更新可能有一些軟體安裝不了。按 ctrl+alt+t 打開終端視窗,執行如下指令:
安裝VIM編輯器二、 安裝SSH、配置SSH無密碼登陸
叢集、單節點模式都需要用到 SSH 登陸(類似于遠端登陸,你可以登入某台 Linux 主機,并且在上面運作指令),Ubuntu 預設已安裝了 SSH client,此外還需要安裝 SSH server:
sudo apt-get install openssh-server
安裝後,可以使用如下指令登陸本機:
此時會有如下提示(SSH首次登陸提示),輸入 yes 。然後按提示輸入密碼 hadoop,這樣就登陸到本機了。
但這樣登陸是需要每次輸入密碼的,我們需要配置成SSH無密碼登陸比較友善。
首先退出剛才的 ssh,就回到了我們原先的終端視窗,然後利用 ssh-keygen 生成密鑰,并将密鑰加入到授權中:
exit # 退出剛才的 ssh localhost
cd ~/.ssh/ # 若沒有該目錄,請先執行一次ssh localhost
ssh-keygen -t rsa # 會有提示,都按回車就可以
cat ./id_rsa.pub >> ./authorized_keys # 加入授權
三、 安裝Java環境
手動安裝,推薦采用本方式
需要JDK版本在及以上。需要按照下面步驟來自己手動安裝JDK。
官網下載下傳安裝包 的最新安裝包。請把壓縮格式的檔案下載下傳到本地電腦,假設儲存在“/home/hadoop/Downloads/”目錄下。
在Linux指令行界面中,執行如下Shell指令(注意:目前登入使用者名是hadoop):
cd /usr/lib
sudo mkdir jvm #建立/usr/lib/jvm目錄用來存放JDK檔案
cd ~ #進入hadoop使用者的主目錄
cd Downloads #注意區分大小寫字母,剛才已經通過FTP軟體把JDK安裝包上傳到該目錄下
sudo tar -zxvf ./ -C /usr/lib/jvm #把JDK檔案解壓到/usr/lib/jvm目錄下
上面使用了解壓縮指令tar,如果對Linux指令不熟悉,自行百度。
JDK檔案解壓縮以後,可以執行如下指令到/usr/lib/jvm目錄檢視一下:
cd /usr/lib/jvm
ls
cd ~
vim ~/.bashrc
上面指令使用vim編輯器()打開了hadoop這個使用者的環境變量配置檔案,請在這個檔案的開頭位置,添加如下幾行内容:
export JAVA_HOME=/usr/lib/jvm/jdk.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
儲存.bashrc檔案并退出vim編輯器。然後,繼續執行如下指令讓.bashrc檔案的配置立即生效:
這時,可以使用如下指令檢視是否安裝成功:
如果能夠在螢幕上傳回如下資訊,則說明安裝成功:
[email protected]:~$ java -version
java version ".0_162"
Java(TM) SE Runtime Environment (build .0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
至此,就成功安裝了Java環境。下面就可以進入Hadoop的安裝。
四、安裝 (一定要此版本)
Hadoop安裝檔案,可以到Hadoop官網下載下傳。找到檔案,下載下傳到本地。
我們選擇将 Hadoop 安裝至 /usr/local/ 中:
sudo tar -zxf ~/下載下傳/ -C /usr/local # 解壓到/usr/local中
cd /usr/local/
sudo mv ./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僞分布式配置(這裡采用僞分布作為開發使用,完全分布式後續)
Hadoop 可以在單節點上以僞分布式的方式運作,Hadoop 程序以分離的 Java 程序來運作,節點既作為 NameNode 也作為 DataNode,同時,讀取的是 HDFS 中的檔案。
Hadoop 的配置檔案位于 /usr/local/hadoop/etc/hadoop/ 中,僞分布式需要修改2個配置檔案
和
。Hadoop的配置檔案是 xml 格式,每個配置以聲明 property 的 name 和 value 的方式來實作。
修改配置檔案
(通過 gedit 編輯會比較友善:
gedit ./etc/hadoop/
),将當中的
<configuration>
</configuration>
修改為下面配置:
<configuration>
<property>
<name></name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name></name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
同樣的,修改配置檔案
:
<configuration>
<property>
<name></name>
<value>1</value>
</property>
<property>
<name></name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name></name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property>
</configuration>
Hadoop配置檔案說明 Hadoop 的運作方式是由配置檔案決定的(運作 Hadoop 時會讀取配置檔案),是以如果需要從僞分布式模式切換回非分布式模式,需要删除 中的配置項。
此外,僞分布式雖然隻需要配置 和 就可以運作(官方教程如此),不過若沒有配置 參數,則預設使用的臨時目錄為 /tmp/hadoo-hadoop,而這個目錄在重新開機時有可能被系統清理掉,導緻必須重新執行 format 才行。是以我們進行了設定,同時也指定 和 ,否則在接下來的步驟中可能會出錯。
配置完成後,執行 NameNode 的格式化:cd /usr/local/hadoop
./bin/hdfs namenode -format
成功的話,會看到 “successfully formatted” 的提示,具體傳回資訊類似如下:
2020-01-08 15:31:31,560 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = hadoop/
STARTUP_MSG: args = [-format]
STARTUP_MSG: version =
*************************************************************/
......
2020-01-08 15:31:35,677 INFO common.Storage: Storage directory /usr/local/hadoop/tmp/dfs/name **has been successfully formatted**.
2020-01-08 15:31:35,700 INFO namenode.FSImageFormatProtobuf: Saving image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 using no compression
2020-01-08 15:31:35,770 INFO namenode.FSImageFormatProtobuf: Image file /usr/local/hadoop/tmp/dfs/name/current/fsimage.ckpt_0000000000000000000 of size 393 bytes saved in 0 seconds .
2020-01-08 15:31:35,810 INFO namenode.NNStorageRetentionManager: Going to retain 1 images with txid >= 0
2020-01-08 15:31:35,816 INFO namenode.FSImage: FSImageSaver clean checkpoint: txid = 0 when meet shutdown.
2020-01-08 15:31:35,816 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at 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/”,在裡面找到“export JAVA_HOME=${JAVA_HOME}”這行,然後,把它修改成JAVA安裝路徑的具體位址,比如,“export JAVA_HOME=/usr/lib/jvm/default-java”,然後,再次啟動Hadoop。
接着開啟 NameNode 和 DataNode 守護程序。
cd /usr/local/hadoop
./sbin/ #是個完整的可執行檔案,中間沒有空格
五、 運作Hadoop僞分布式執行個體
上面的單機模式,grep 例子讀取的是本地資料,僞分布式讀取的則是 HDFS 上的資料。要使用 HDFS,首先需要在 HDFS 中建立使用者目錄:
./bin/hdfs dfs -mkdir -p /user/hadoop
注意指令是以”./bin/hadoop dfs”開頭的Shell指令方式,實際上有三種shell指令方式。
1. hadoop fs
2. hadoop dfs
3. hdfs dfs
hadoop fs适用于任何不同的檔案系統,比如本地檔案系統和HDFS檔案系統
hadoop dfs隻能适用于HDFS檔案系統
hdfs dfs跟hadoop dfs的指令作用一樣,也隻能适用于HDFS檔案系統
接着将 ./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
複制完成後,可以通過如下指令檢視檔案清單:
僞分布式運作 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/*
結果如下,注意到剛才我們已經更改了配置檔案,是以運作結果不同。
注意: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,則運作
注意下次啟動 hadoop 時,無需進行 NameNode 的初始化,隻需要運作
./sbin/
就可以!