程式扎記: [ Big Data 研究 ] 06 設定與初始化 HDFS 分散式檔案系統 - Part1

標籤

2015年9月8日 星期二

[ Big Data 研究 ] 06 設定與初始化 HDFS 分散式檔案系統 - Part1

前言
HDFS 分散式檔案系統不只具備高效能的存取運作, 更不會受限於單一台 DataNode 運算主機的硬碟空間容量, 可輕易的依需求增加 DataNode 運算主機來擴增 HDFS 的容量. 而分散式的儲存模式, 更提高了資料保存的容錯性, 不過在使用 HDFS 之前, 必須先設定 "core-site.xml", "hdfs-site.xml", "slaves" 和 "hadoop-env.sh" 這幾個檔案. 在完成初始化設定之後, 才能順利啟用 HDFS 分散式檔案系統.

設定 core-site.xml 檔案
"core-site.xml" 是 HDFS 分散式檔案系統的系統核心設定檔, 透過此檔案能夠讓 Client 端與負責執行 NameNode 服務的主機順利連結. 在實體主機的終端視窗, 利用下面命令開啟 "core-site.xml" 進行編輯設定:


設定內容中的 "fs.default.name" 是用來指定負責執行 NameNode 服務的主機, 在此我們指定了 'nn' 運算主機. 只後 Client 端就會利用此設定檔與執行 NameNode 服務的 nn 運算主機進行連結. 底下是關於此設定檔的某些重要設定說明:
* fs.default.name
設定 NameNode 運算主機的名稱和連結的 port, 預設為 8020 port.

* hadoop.tmp.dir
設定使用者的暫存檔案目錄, 若未在 hadfs-site.xml 中設定 NameNode 和 DataNode 的目錄, 就會依據此項目設定值存放檔案.

* io.file.buffer.size
設定緩存檔案的大小, 預設為 4096 bytes.

* io.native.lib.available
設定是否導入 Hadoop 的原生程式庫, 雖然 Hadoop 事由 Java 語言編寫, 但是有些需求和操作不方便使用 Java 來實作如負責壓縮的 LZO 演算法. 預設為 true, 當操作上無法使用 Java 來實作時, 會自動使用 Hadoop 的原生程式庫.

* ipc.client.connection.maxidletime
設定 Client 端連線, 最長的閒置時間, 預設為 10000 ms.

* ipc.server.tcpnodelay
設定 Server 端是否開啟 Nagle 演算法, 預設為 false, 以減少封包傳送量, 增加 TCP/IP 網路效能.

* ipc.client.tcpnodelay
設定 Client 端是否開啟 Nagle 演算法, 預設為 false, 以減少封包傳送量, 增加 TCP/IP 網路效能.

設定 hdfs-site.xml 檔案
"hdfs-site.xml" 是 HDFS 分散式檔案系統的 "運作設定檔", 透過此檔案可以設定資料區塊的切割大小, 複本數量等等. 使用下面指令進行編輯:


設定內容中 "dfs.replication" 是用來設定資料區塊含複本的數量, 這邊設定為 2 說明一個資料區塊要產生一個複本, 預設值為 3. 接著設定以下內容:


  "dfs.namenode.name.dir" 就是 NameNode 用來存放 HDFS 系統的 Metadata 儲存目錄, 而 "dfs.datanode.data.dir" 則是 DataNode 用來存放資料區塊的儲存目錄. 未來在啟動 HDFS 分散式檔案系統時, 會依據設定的儲存路徑在 nn 運算主機自動產生 "nn" 資料夾; 而在 dn01 與 dn02 運算主機中自動產生 "dn" 資料夾. 部分重要設定項目說明如下:

* dfs.replication
設定資料區塊的複本數量, 預設為 3.

* dfs.replication.max
設定資料區塊最大的複本數量, 預設為 512.

* dfs.namenode.replication.min
設定資料區塊最小的複本數量, 預設為 1, 表示每一個資料區塊至少要產生一個複本共兩個區塊.

* dfs.blocksize
設定資料區塊的切割大小, 預設為 128 MB.

* dfs.namenode.name.dir
設定 HDFS 系統的 Metadata 目錄.

* dfs.datanode.data.dir
設定 DataNode 存放資料區塊的目錄.

* dfs.namenode.checkpoint.dir
設定 Secondary NameNode 的暫存檔案目錄.

* dfs.namenode.checkpoint.period
設定 Secondary NameNode 間隔彙整的時間, 預設為 3600 秒.

* dfs.namenode.http-address
設定 NameNode 主機使用網頁瀏覽器監控狀態的 IP 位址與 port. 預設 IP 為 0.0.0.0 ; Port 為 50070.

指定 DataNode 運算主機
HDFS 分散式檔案系統預設是透過 Hadoop 官方套件中的 "start-dfs.sh" 這支 Bash Script 來啟動, 並讀取 "slaves" 檔案中的設定, 查看哪幾台主機主要負責執行 DataNode 的服務, 並使用 SSH 遠端管理連線, 自動登入指定的 DataNode 運算主機啟動 DataNode 服務.

在實體主機視窗使用下面命令開啟 "slaves" 檔案進行編輯設定:


HDFS 運作資源規劃
Hadoop 分散式運算平台是由 Java 語言撰寫, 這也代表 NameNode 與 DataNode 其實就是 Java 程式! 所以在實際應用上, 還必須在 "hadoop-env.sh" 中設定執行時 JVM 使用的記憶體大小. 請輸入下面指令開啟該檔案並進行編輯設定:


當 HDFS 系統啟動時, 存放 Log 檔的目錄中會產生兩種類型檔案. 第一種是副檔名為 ".log" 的檔案, 由 NameNode 產生, 其內容包含 Hadoop 運算主機的運作資訊, 如 NameNode 主機的運作紀錄等, 我們可以透過此類型的 log 檔來判斷 HDFS 系統的故障原因; 第二種是副檔名為 ".out" 的檔案, 由 HDFS 系統的啟動程式 "start-dfs.sh" 產生, 此檔案室用來存放 ulimit (User limits) 的資訊, 包括可以開啟的檔案數量, 可使用的記憶體總量等.

初始化 HDFS 分散式檔案系統
接下來我們必須初始化 HDFS 系統的 "Metadata", 也就是我們俗稱的檔案系統 "格式化", 才能開始使用 HDFS 分散式檔案系統. 輸入以下指令啟動並登入負責執行 NameNode 服務的nn 虛擬主機開始格式化 HDFS 分散式檔案系統: (Ctrl+a, q 來離開 Console)
# lxc-console -n nn // 登入 NameNode 虛擬主機
ubuntu@nn:/home/ubuntu$ ls /opt/ // 檢視是否有將實體主機的 /opt mount 進來
hadoop-2.5.2 hadoop-2.5.2.tar.gz jdk jdk1.7.0_79
ubuntu@nn:/home/ubuntu$ hdfs namenode -format // 初始化 HDFS 檔案系統
...
15/09/08 07:34:00 INFO common.Storage: Storage directory /home/ubuntu/nn has been successfully formatted.
...

接著使用命令 tree 檢視生成目錄內容:


"fsimage" 開頭的檔案是用來存放 HDFS 系統中, 所有檔案及目錄的屬性資料, 其他檔案說明會在後面介紹.

第一次啟動 HDFS 分散式檔案系統
格式化之後就可以正式來啟動 HDFS 分散式檔案系統了. 在這之前請先啟動 NameNode 與 DataNode. 接著使用 Console 登入 nn 運算主機:
# lxc-console -n nn // 在實體主機登入虛擬主機 nn
// "start-dfs.sh" 會依據 "slaves" 檔案中的設定, 啟動 dn01 和 dn02 運算主機的 DataNode 服務:
ubuntu@nn:~$ start-dfs.sh // 啟動 HDFS 檔案系統
Starting namenodes on [nn]
nn: starting namenode, logging to /tmp/hadoop-ubuntu-namenode-nn.out
dn02: starting datanode, logging to /tmp/hadoop-ubuntu-datanode-dn02.out
dn01: starting datanode, logging to /tmp/hadoop-ubuntu-datanode-dn01.out
Starting secondary namenodes [0.0.0.0]
0.0.0.0: starting secondarynamenode, logging to /tmp/hadoop-ubuntu-secondarynamenode-nn.out

第一次啟動 HDFS 檔案系統, NameNode 會檢查是否有新的 DataNode 運算主機, 並把 Metadata 目錄中的 "VERSION" 檔傳送給新的 DataNode 運算主機, 而在該檔案中有一個相當重要的參數 "clusterID", 若下次重新啟動 HDFS 檔案系統時, DataNode 就會把 "clusterID" 傳送給 NameNode, 以此判斷是否隸屬於相同的 Hadoop 分散式運算平台.
$ cat nn/current/VERSION
#Tue Sep 08 10:06:56 PDT 2015
namespaceID=351069619
clusterID=CID-53ad2fb2-65b2-445f-a5d3-138d4a441e44
cTime=0
storageType=NAME_NODE
blockpoolID=BP-1796673813-172.16.1.200-1441722840165
layoutVersion=-57

接著來看 DataNode 運算主機的 "clusterID":
ubuntu@nn:~$ ssh dn01 // 登入運算主機 dn01
ubuntu@dn01:~$ cat dn/current/VERSION
#Tue Sep 08 10:13:23 PDT 2015
storageID=DS-3aea9101-351a-4827-9f39-1cf57914665a
clusterID=CID-53ad2fb2-65b2-445f-a5d3-138d4a441e44
cTime=0
datanodeUuid=6b932943-9439-4e17-a684-9188e9c274c6
storageType=DATA_NODE
layoutVersion=-55

需要注意的是當 NameNode 服務主機若重新格式化, "VERSION" 檔中的 "clusterID" 將會改變! 擁有原先 clusterID 的 DataNode 運算主機將無法被判斷為隸屬於相同的 Hadoop 分散式平台, 這將會造成 DataNode 運算主機無法與 NameNode 連線的狀況. 後面的介紹會進一步說明解決方法. 若不需要使用其他操作, 可以使用下面命令關閉 HDFS 檔案系統服務:
ubuntu@nn:~$ stop-dfs.sh
Stopping namenodes on [nn]
nn: stopping namenode
dn01: stopping datanode
dn02: stopping datanode
Stopping secondary namenodes [0.0.0.0]
0.0.0.0: stopping secondarynamenode

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!