資料科學家分散檔案系統 (Hadoop)

要處理 Big Data,就必須要有相對應的設備,才有辦法〝驅動〞如此龐大的資料量,而所謂的驅動,不單單只是存放與管理 Big Data,還要有辦法對其進行資料分析,才有辦法從海量的資料中,整理出有用的資料。

而現階段處理 Big Data 的關鍵技術,就是使用 Hadoop,那什麼是 Hadoop 呢?其實,Hadoop 是基於 Google 搜尋引擎所設計出來的分散式運算技術,簡單來說,就是利用大量的伺服器,並配合平行運算的架構,來產生可觀的運算量與儲存,而且可以不需要使用高檔的伺服器設備,善用一般的價位的伺服器,就可以創造最有符合經濟效益的分析,這對於公司企業來說,不但可以省下許多硬體資源經費的支出,更可以利用相同的經費,建構出更多 Cluster 架構的伺服器群來承接 Big Data 的運算量。

Linux KVM 魔法書 - 虛擬框架系統

然而,除非是公司既定要建置 Hadoop 的政策,或者是已經存在架構好的 Hadoop ,不然若是因為要嘗試,或測試 Hadoop 的功能,而花費時間與精力在安裝、設定與架構 Hadoop 上面,實在是有些不太合乎經濟效益,雖然說建置 Hadoop 的難度並不算高,但是要搞定所有的安裝與設定,還是要花費不少的時間。

難道,沒有比較快速的方式嗎?當然有,利用「Linux KVM 魔法書」的『虛擬框架系統』,就可以快速啟動架構好的 Hadoop ,並且可以馬上直接進行各種 Big Data 的資料處理、搜尋與運算,而此虛擬框架系統本身是一個可攜式的框架系統,並利用 Linux KVM 來驅動伺服器群,所以很適合用來進行系統、程式,或資料分析的測試。

下載與簡介「資料科學家分散檔案系統 - Hadoop Distributed File System」壓縮包

虛擬框架系統有需多不同的實作平台,這邊就實際來介紹「資料科學家分散檔案系統 (HDFS)」這一套資訊實作平台,在終端機(Host OS)內利用以下指令來下載實作平台的檔案縮

$ wget http://tbala.net/download/kvmhdfs1.0.zip

 

下載的檔案是一個壓縮檔,將檔案放置在個人家目錄內之後,直接解壓縮在家目錄之內,筆者實作的系統平台是 Ubuntu Desktop LTS 12.04.1 ,而虛擬框架系統的設計與測試也都是在此系統平台內完成,其他版本的系統則不建議使用,以免產生許多後續不必要的捆擾。

檔案下載完成,並將檔案放置家目錄之後,直接利用以下指令來將檔案解壓縮:

$ unzip kvmhdfs1.0.zip

解壓縮之後,進入 kvmhdfs1.0 的資料夾,並利用〝ls -la〞的指令來檢視資料夾內的內容:

資料夾內的檔案很多,就暫時先不一一詳述,這邊只需要先注意〝hdfs.sh〞這一個 bash script 檔案,而此 script 整合了資料夾內〝kvmaddsw.sh〞、〝kvmrouter.sh〞與〝kvmclient.sh〞這三個 script ,再搭配「conf」資料夾內「hadoop104.xml」的 xml 檔案,快速完成了以下二件事:

  1. 快速部屬虛擬網路架構, 包含 Switch HUB (Bridge 的網路功能)
  2. 快速啟動 HDFS 主機群(四台虛擬電腦)

利用〝hdfs.sh〞,就可以快速架構出一個具有完整架構的 Hadoop 分散式檔案系統 (HDFS),並且馬上就可以直接使用,神奇吧!接下來,就讓我們實際操作一次吧!

啟動「Hadoop 分散檔案系統 - Hadoop Distributed File System

在「kvmhdfs1.0」資料夾內,利用以下指令來啟用 Hadoop:

$ sudo ./hdfs.sh

而系統若提示要輸入密碼,請輸入使用者登入密碼,若看到以下訊息,則表示系統(Host OS)缺乏執行(啟用)HDFS(虛擬電腦)所需的相關套件,只需要依照提示,安裝套件即可:

套件安裝完成,請執行 exit 命令, 然後再執行一次〝sudo ./hdfs.sh〞命令,在終端機會看到以下的訊息:

由此終端機訊息可以知道我們產生了一個「SH100」的 Switch Hub,並且也產生了 7 張虛擬網路介面,以提供虛擬電腦來使用。

除此之外,還一併啟動了 4 台虛擬電腦,而 HDFS 系統,就是由這 4 台虛擬電腦所架構而成的,且這 4 台虛擬電腦,在 HDFS 的架構內,也扮演不同的角色,分別為 NN(Name Node)、SN(Secondary Name Node)、DN01(Data Node),與 DN02( Data Node),而名稱後方括弧內的數字,如 512 M,則示次此虛擬電腦所設定的記憶體大小。

另外,還會跳出(開啟)另外的終端機視窗,並且顯示啟動中的 4 虛擬電腦:

開機完成之後,除了 NN 這台虛擬電腦之外,其餘的虛擬電腦開機完成之後,就會看到如下的圖示:

在終端機內,就可以清楚看到虛擬電腦的 TCP/IP 資訊,至於 NN(Name Node)這台虛擬電腦,開機完成之後,就會直接啟動 HDFS 的所有服務:

確認所有虛擬電腦都開機完成之後(包含 NN 啟動 HDFS 的程序),直接在 NN 的終端機內輸入以下指令,並按下 Enter 鍵後執行:

# ./checkHDFS.sh

由圖中可以看到,此指令是用來檢查 HDFS 系統內,各個伺服器的角色與狀況。

接著再利用以下指令,來檢視 HDFS 分散式系統的資訊:

# hadoop dfsadmin -report

由輸出的資訊就可以知道 HDFS 系統的相關資訊,且因為實作平台預設已經預先將 HDFS 檔案系統進行了格式化,所以就可以開始使用 Hadoop 了。

而若已經使用過,或者要清空 HDFS 檔案系統內的資料的話,則可以利用以下指令來重新設定(格式化)HDFS 的檔案系統:

# ./resetHDFS.sh

按下 Enter 鍵之後,系統會詢問是否確認要執行,直接輸入〝yes〞,再按下 Enter 鍵來執行,最後就會看到 HDFS 檔案系統格式化之後的訊息:

不過,這邊要注意一件事情,就是使用〝resetHDFS.sh〞指令來格式化 HDFS 的檔案系統之後,HDFS 本身的服務會關閉(由終端機資訊就可以看到 NameNode 的機器關閉了),所以,若格式化之後,記得再利用〝start-all.sh〞的指令(在 NameNode 的終端機內執行)來啟動 HDFS 的服務。

接著回到本機(Host OS)的終端機內,這時大家應該會注意到,終端機的提示符號變為「HDFS:mapreduce>」,其實這是在〝hdfs.sh〞這隻程式內做了一點處理,讓使用者可以直接對後端的 HDFS 進行各種資料分析與處理。

在「HDFS:mapreduce>」的提示符號內輸入以下指令,可以查看目前 HDFS 的版本:

> hadoop version

再來,我們需要在 HDFS 內建立一個資料夾,以方便我們放置要分析的資料,指令如下:

> hadoop dfs -mkdir inputlog(inputlog 為資料夾名稱,可以自定)

不過,按下 Enter 鍵之後,卻有可能會看到如下的錯誤訊息:

這是什麼原因呢?其實,只是 DNS 無法解析虛擬電腦內,虛擬 IP 與電腦名稱的對應資訊罷了,這只需要修改 Host OS 內的 hosts 檔案即可,另外開啟一個終端機,並輸入〝sudo vim /etc/hosts〞,來開啟 hosts 的檔案,並輸入如下圖的內容,將虛擬電腦的 IP 與電腦名稱的對應關係寫好:

確認輸入資訊無誤之後,就可以存檔退出了。

再回到「HDFS:mapreduce>」的終端機視窗,重新輸入〝hadoop dfs -mkdir inputlog〞,但有可能有機會看到如下的錯誤訊息:

而此問題的原因,在於 HDFS 各個伺服器之間的連結(聯繫)上未完成 (safe mode),所以資料會無法寫入 HDFS 的資料庫內,只需要等待一會,再重新執行建立資料夾的指令即可。

資料上傳與分析

在 HDFS 內建立資料夾,接著利用以下指令,來上傳要分析的檔案,而這邊準備的是 Apache 的 Log 檔案,等會就要利用 MapReduce  來分析 Log  檔案內的 IP 資訊:

> hadoop dfs -put ge.myruby.net  inputlog

> hadoop dfs -put wiki.myruby.net  inputlog

那要使用 HDFS 來分析資料時,要用到 Mapper 與 Reducer 的方式來拆解與組合資料,所以要撰寫 MapReduce 的程式,而在 Hadoop 上面,主要是利用 Java 來撰寫程式與執行(當然,還有其他程式語言也可以,如 C ),不過,這邊筆者主要是要大家了解 HDFS 的運作方式,並不是程式語言的轉寫,所以有預先準備寫好的 java 程式,以減輕大家的負擔。

利用以下指令來編譯並打包準備好的 Java 程式:

> javac -d MyLog/   ApacheLog*.java

> jar -cvf apachelog.jar -C  MyLog/  . 注意命令最後有句點)

最後,利用以下指令,就可以執行 MapReduce 的 Java 程式了:

> hadoop jar apachelog.jar ApacheLog  inputlog/  output/ 注意 : output/ 目錄如存在, 請先移除,指令為〝hadoop dfs -rmr output〞)

分析完成之後,我們利用以下指令,來看看 output 資料夾內產生了哪些檔案:

> hadoop dfs -ls /user/root/output

其中,「part-r-00000」就是經由 MapReduce 分析之後的結果,利用以下指令就可以查看分析之後的結果:

> hadoop dfs -cat output/part-r-00000

如要關閉 HDFS 檔案系統, 請在 NN 虛擬電腦的終端機視窗, 執行 “byeall” 命令, 然後在原先操作終端機視窗中的 "HDFS:mapreduce>" 提示字串, 輸入 exit 命令, 便可完全脫離 HDFS  檔案系統操作.

以上,就是利用虛擬框架系統來快速建立與使用 HDFS 的方式。