Hadoop 從零開始建 HDFS (Building Hadoop and HDFS)

Chris Lee
8 min readMay 4, 2020

--

Hadoop是個分散式儲存及運算的架構,因為工作需求來研究如何從零到有安裝Hadoop叢集,並且可以用spark對資料做運算。

事前準備

  1. 一台VM,為了節省時間我們用GCP來進行示範,每台VM的配置自行斟酌,本次範例使用的是ubuntu18.04版,windows系統有點自找麻煩就不示範了。
  2. 後續使用到的防火牆port記得開,不再多做贅述。
  3. 所以機器先新增一個hadoop使用者並擁有sudo權限,與root做區別避免混淆,方法如下:

建好VM後打以下語法即可

sudo adduser hadoop #建使用者 
sudo adduser hadoop sudo #hadoop有sudo權限
su - hadoop #登入hadoop腳色

4. Hadoop很多步驟需要登入重複打密碼,為了減少流程負擔,透過SSH的認證設定,讓之後都不用打密碼即可登入。

ssh-keygen -t rsa -P "" 
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

試試看是否可以正常SSH

ssh localhost

沒問題後我們就開始進行Hadoop安裝吧!!

安裝Java

因為Hadoop底層是透過Java驅動,所以要先安裝Java,Java版本會牽涉到Hadoop的版本,詳細可以參考 這裡

sudo apt-get update 
sudo apt-get install default-jdk default-jre

接下來下載Hadoop的檔案,可以到 官網 找自己要的版本安裝,以下用Hadoop 2.9.2進行示範。

wget http://apache.stu.edu.tw/hadoop/common/hadoop-2.9.2/hadoop-2.9.2.tar.gz 
tar xzvf hadoop-2.9.2.tar.gz
sudo mv hadoop-2.9.2 /usr/local/hadoop

修改環境變數

接下來要將Java及Hadoop加入環境變數,讓系統可以直接調用。

vim ~/.bashrc

新增以下內容:

#jvm後面的路徑會根據你Java的版本有異
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/
export PATH=$PATH:$JAVA_HOME/bin
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin

重啟環境變數

source ~/.bashrc

測試單機Hadoop運行

運用Hadoop自身的例子確認運作是否正常,在目錄建立一個input的資料夾,拷貝測試資料到新資料夾後,用mapreduce分析出出a開頭的單詞頻率。

mkdir ~/input 
cp /usr/local/hadoop/etc/hadoop/*.xml ~/input
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.2.jar grep ./input/ ./output 'a[a-z.]+'

注意第三行程式運行的jar會跟上面的hadoop version顯示的一樣,我的是3.1.3所以會是上面所示,如果不同版本記得要改。

後面將結果導出到output資料夾,如果有正常跑出來下面訊息代表成功囉。

cat ~/output/*

偽分佈式Hadoop設定

Hadoop是分散式運算的架構,可以用兩個以上的分離process運行,意思就是一當NameNode及幾個當DataNode,同時讀取的是HDFS文件,為了達到以上功能,進行一些文件的設定,因為目前只有一台VM,所以稱偽分佈式,真實的叢集後面再說明。

後續的操作都會在該機器上的Hadoop路徑下,如果忘記你的路徑可以往上拉看一下,或是下以語法確認Hadoop位置。

接下來要修改Hadoop下 ./etc/hadoop/ 的一些文件,以下都是指該目錄內的文件。

首先是hadoop-env.sh,需要加上Java的路徑設定。

cd /usr/local/hadoop/etc/hadoop 
vim hadoop-env.sh
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/

然後是core-site.xml

vim core-site.xml

主要都是修改configuration裡面的內容,每個參數都用property包起來,name是指參數名,value則是參數值,加入下面內容放在<configuratio>和</configuratio>裡面。

再來是hdfs-site.xml

vim hdfs-site.xml

一樣在<configuration>與</configuration>中加入下面內容。

因為指定了儲存目錄,要記得去建資料夾及開權限給使用者。

sudo mkdir -p /usr/local/hadoop/tmp/dfs/name 
sudo mkdir -p /usr/local/hadoop/tmp/dfs/data
sudo chown hadoop:hadoop -R /usr/local/hadoop/

接下來設定mapreduce文件,文件名是mapred-site.xml,有的時候裡面會是空的或沒有該文件,不影響接下來的編輯內容。

vim mapred-site.xml

加入以下內容。

既然使用了yarn,當然也要設定一些參數,所以到yarn-site.xml設定檔加入一些內容。

vim yarn-site.xml

最後一個文件的是slaves,有時也會有無該文件的狀況,沒關係我們重建一個新的就好。剛剛都是設定主節點,該文件在建立叢集節點的設定,因為目前只有一台主機,所以就進去打上localhost即可。

vim slaves

到此為止文件就都完成囉。

啟動服務

文件設定好後就可以啟動服務,啟動前要先做一些事前動作,首先先用以下語法將NameNode初始化。

cd /usr/local/hadoop 
./bin/hdfs namenode -format

接下來要啟動相關的服務,可以到sbin路徑下,看到很多自動化的指令檔。

cd /usr/local/hadoop/sbin

啟動HDFS,可以透過瀏覽器打上IP+port 50070連到WebUI畫面。

./start-dfs.sh

同樣的位置啟動yarn,並且可以透過port 8088連到WebUI畫面。

./start-yarn.sh

如果要關掉這兩個,也有直接的shell檔取用。

./stop-dfs.sh 
./stop-yarn.sh

此外可以透過jps查看已啟動的服務

因為都集中在一台機器,所以可以看到HDFS跟Yarn都在一台伺服器內。本篇的資訊量夠多了,下一個章節再來說怎麼建多個機器的Hadoop。

--

--

Chris Lee
Chris Lee

Written by Chris Lee

隱身在金融業的資料科學家

No responses yet