2013年11月4日 星期一

[ 深入雲計算 ] HDFS : 開源的 GFS - HDFS 基礎概念與常用命令

Preface:
HDFS 是 Hadoop Distributed File System 的縮寫, 是 Apache Hadoop 項目中的一個子項目, 也是 Google GFS 分布式文件系統的開源實現. Hadoop 非常適用於存儲大型數據, 並使用 HDFS 作為其存儲系統. HDFS 允許用戶連接多個叢集中包含的節點, 那些叢集上分布著一些數據文件. 然後用戶可以將那些數據文件作為一個無縫文件系統來進行訪問與存儲. 對數據文件的訪問通過一種 streaming 方式進行處理, 這意味著應用程序或命令通過 MapReduce 處理模型直接執行.

HDFS 簡介:
HDFS 能提供高吞吐量的數據訪問, 非常適合大規模數據集上的應用. 它預設的數據塊大小為 64MB, 每一個數據塊在多個 DataNode 都可以設定副本, 客戶端通過 NameNode 節點得到數據塊的位置, 接著直接訪問 DataNode 以獲取數據.

HDFS 特點
HDFS 分布式文件系統與其他分布式文件系統有相同點, 也有不同點. 一個明顯的差別之處是 HDFS 的 "一次寫入, 多次讀取" (Write-once-read-many) 模型. 該模型的顯著優點是可以降低併發控制的要求, 提高數據的聚合並支持高吞吐量的訪問.

Hadoop 的優勢表現在於它已經在 20 個節點上實際應用過 (Nutch 項目). Yahoo 公司通過採用 Hadoop 架構在兩個月內搭建一個研究集群, 並使他們的客戶能很快使用這個新的架構. Hadoop 另一個優點也是缺點是它是開源的. HDFS 另一個獨特的特點是能處理分布式處理邏輯並把執行放置在數據附近, 這種特性比將數據向應用程序移動更好.

HDFS 的基本概念
1. 數據塊 (Block)
HDFS 默認的基本存儲單位是 64MB 的數據塊.

2. NameNode 與 DataNode
NameNode 節點的作用是用來管理文件系統的命名空間, 並將所有文件與文件夾的數據保存在一個文件系統樹中, 這些訊息採用 namespace image 與 edit log 方式來保存. 除此之外, NameNode 也保留數據塊與 DataNode 的 mapping 關係 (知道某個數據塊存在哪個 DataNode); DataNode 是文件系統中真正儲存數據塊的地方. Client 或者 NameNode 可以直接向 DataNode 請求寫入或讀出數據塊, DataNode 會定時向 NameNode 發送 Heartbeat 訊息告知其上面數據塊的訊息.

3. Secondary NameNode
SecondaryNameNode,會周期性的將EditLog中記錄的對HDFS的操作合併到一個checkpoint中,然後清空EditLog。所以namenode的重啟就會Load最新的一個checkpoint,並replay EditLog中記錄的hdfs操作,由於EditLog中記錄的是從上一次checkpoint以後到現在的操作列表,所以就會比較小。如果沒有snn的這個週期性的合併過程,那麼當每次重啟namenode的時候,就會花費很長的時間。而這樣週期性的合併就能減少重啟的時間。同時也能保證HDFS系統的完整性. 這就是SecondaryNameNode所做的事情。所以snn並不能分擔namenode上對HDFS交互性操作的壓力。儘管如此,當namenode機器宕機或者namenode進程出問題時,namenode的daemon進程可以通過人工的方式從snn上拷貝一份metadata 來恢復HDFS文件系統.

HDFS 的目標與源由
HDFS 的設計目標有 5 個, 分別說明如下:
1. 硬體故障
硬體故障是無法避免, HDFS 由許多的服務器組成, 每個都存儲著文件系統中的部分數據, 因此出現部分故障的機率相對只有在一台機器上面工作高. 所以 HDFS 必須能檢測並快速的自動恢復

2. Streaming 數據訪問
運行在 HDFS 上的應用程序會透過 Streaming 方式訪問它們的數據. 這樣的優點是可以提高吞吐量但犧牲的是數據訪問的低反應時間.

3. 大規模數據集
HDFS 一個典型的文件可能是幾 GB 甚至是幾 TB. 因此為了適用於大文件, HDFS 提供叢集架構來存儲數據.

4. 移動計算
對於大文件來說, 移動計算到數據端比將數據移動到計算端代價低.

5. 跨硬體與 OS 平台
HDFS 設計使用的叢集, 為了方便與可行性是由各式各樣的 硬體+OS 組成.

HDFS 的常用操作:
了解了 HDFS 的基礎知識後, 接下來要介紹一些 HDFS 的常用操作.

HDFS 下的文件操作
HDFS 實作為一個開源框架, 對於程序員來說, 並不需要了解底層的文件操作原理, 但不能不懂其提供的命令工具. 它提供一套與 Linux 文件命令長相相似的命令集來對文件操作.
命令格式: hadoop fs -<cmd> <args>

<cmd> 的命令與 Unix 對應的命令名相同. 例如文件列表的命令是 hadoop fs -ls. 接下來將一一來了解這些命令的使用.
1. 創建目錄
命令格式: hadoop fs -mkdir <folder_path>
Ex: hadoop fs -mkdir /user/john # 在 /user 目錄下創建 john 目錄, 如果 /user 不存在會自動建立它.

2. 上傳文件
put 命令從本地文件系統中複製單個文件或是多個文件到 HDFS.
命令格式: hadoop fs -put <localsrc> ... <dst>
Ex:
$ hadoop fs -put localfile /user/hadoop/hadoopfile # 將檔案 "localfile" 複製到 HDFS 路徑 "/user/hadoop/hadoopfile"
$ hadoop fs -put localfile1 localfile2 /user/hadoop/hadoopdir
$ hadoop fs -put localfile hdfs://nn.example.com/hadoop/hadoopfile # 透過 URI 複製本地檔案到 HDFS
$ hadoop fs -put - hdfs://nn.example.com/hadoop/hadoopfile # 透過 stdin 寫到 HDFS "/hadoop/hadoopfile"

下面是一個實際範例:
$ hadoop fs -put - hdfs://ubuntun:9000/john/hadoopfile # 從 Console 輸入檔案內容
abc
test

# 按下 Ctrl+C 終止編輯
$ hadoop fs -ls /john # 檢視檔案是否成功建立
Found 1 items
-rw-r--r-- 3 john supergroup 9 2013-11-02 03:35 /john/hadoopfile

$ hadoop fs -cat /john/hadoopfile # 檢視檔案內容
abc
test

類似的命令可以參考 copyFromLocal

3. 列出 HDFS 上的文件
使用 ls 命令列印出 HDFS 上面的文件清單.
命令格式: hadoop fs -ls <args>
Ex:
$ hadoop fs -ls . # HDFS 預設路徑在 /user/$USER 下. $USER 即是用來啟動 Hadoop 服務的帳戶名稱.
Found 1 items
-rw-r--r-- 3 john supergroup 47 2013-11-02 03:32 /user/john/test.sh

4. 查看 HDFS 中的檔案內容
透過 cat 命令檢視 HDFS 中文件的內容
命令格式: hadoop fs -cat URI [URI …]
Ex:
$ hadoop fs -cat hdfs://nn1.example.com/file1 hdfs://nn2.example.com/file2
$ hadoop fs -cat file:///file3 /user/hadoop/file4

5. 將 HDFS 中的文件複製到本地系統中
使用 get 命令將 HDFS 中的文件複製到本地系統.
命令格式: hadoop fs -get [-ignorecrc] [-crc]
Ex:
$ hadoop fs -get /user/hadoop/file localfile
$ hadoop fs -get hdfs://nn.example.com/user/hadoop/file localfile

類似的命令為 copyToLocal.

6. 刪除 HDFS 下的文檔
透過 rm 命令刪除 HDFS 中的文件
命令格式: hadoop fs -rm URI [URI …]
Ex:
$ hadoop fs -rm hdfs://nn.example.com/file /user/hadoop/emptydir

Ps. 如果要 recursive 刪除某個目錄與其中的所有內容, 可以使用命令 rmr

7. 格式化 HDFS
透過命令 namenode 加上 -format 參數實現 HDFS 格式化.
命令格式: hadoop namenode [-format] | [-upgrade] | [-rollback] | [-finalize] | [-importCheckpoint]

8. 改變 HDFS 文件的副本係數
透過命令 setrep 改變某個文件的副本係數.
命令格式: hadoop fs -setrep [-R]  # -R option is for recursively increasing the replication factor of files within a directory.
Ex:
$ hadoop fs -setrep -w 3 -R /user/hadoop/dir1

9. 測試 HDFS 文件
利用 test 命令測試 HDFS 文件是否存在, 大小等訊息.
命令格式: hadoop fs -test -[ezd] URI
參數說明:
-e check to see if the file exists. Return 0 if true.
-z check to see if the file is zero length. Return 0 if true
-d check return 1 if the path is directory else return 0.

Ex:
$ hadoop fs -test -e filename # 檢視檔案 filename 是否存在

更多的 fs shell 命令可以參考 Hadoop Shell Commands.

更新與管理:
HDFS 管理包括查看 HDFS 的基本訊息, 安全模式的進入與退出, 節點的添加以及負載均衡.

HDFS 的基本統計訊息
可以透過下面指令查看 HDFS 的基本統計訊息:
$ hadoop dfsadmin -report

執行結果:


安全模式的進入與退出
NameNode 在啟動時會自動進入安全模式. 安全模式是 NameNode 的一種狀態, 在安全模式下文件系統不可以允許有任何修改. 啟動安全模式的目的是在系統啟動時檢查各個 DataNode 上的數據塊的有效性, 同時根據策略對數據塊進行必要的複製或刪除. 當數據塊最小的百分比數滿足最小副本係數時, NameNode 將會自動推出安全模式. 當系統顯示 "Name node is in safe mode.", 說明系統正處於安全模式, 這時需要等待也可以透過下面命令強迫離開安全模式:
$ hadoop dfsadmin -safemode leave

或是使用下面命令將 HDFS 設置為安全模式:
$ hadoop dfsadmin -safemode enter

添加節點
HDFS 的一個重要特性是可擴展性, 向 HDFS 叢集中添加數據節點是很容易實現的. 如果要動態添加 DataNode 到 已經運行的 Cluster 可以參考 這裡. 以我的範例來說, 我建立了 datanode3 環境 (192.168.80.193/ubuntud3), 接著登入 datanode3:
$ hadoop-daemon.sh start datanode # 啟動 DataNode
$ hadoop-daemon.sh start tasktracker # 啟動 TaskTracker
$ jps # 檢視服務是否有起來
2991 DataNode
3067 TaskTracker
3297 Jps

$ logout # 回到 NameNode
$ hadoop dfsadmin -report
...
Datanodes available: 3 (3 total, 0 dead)
 # 確定目前有 3 個 DataNode 起來
...
Name: 192.168.80.193:50010 
# 確定 datanode3 有起來
Decommission Status : Normal
Configured Capacity: 20608348160 (19.19 GB)
...

或這你可以使用瀏覽器登入 http://namenode_ip:50070 也可以查看 DataNode 是否有添加成功:


負載平衡
HDFS 的數據有很多 DataNode 節點, 在各個 DataNode 中分布數據時肯定存在數據塊分配不均勻的情況, 在 DataNode 節點出現故障或新增 DataNode 節點時這種情況更容易發生. 用戶可以使用start-balance.sh 工具重新平衡 DataNode 上數據塊的分布:
$ start-balancer.sh
...
The cluster is balanced. Exiting...
Balancing took 263.0 milliseconds


Supplement:
Hadoop 管理 NameNode AND SecondaryNameNode
Hadoop 解除 "Name node is in safe mode"
在分佈式文件系統啟動的時候,開始的時候會有安全模式,當分佈式文件系統處於安全模式的情況下,文件系統中的內容不允許修改也不允許刪除,直到安全模式結束。安全模式主要是為了系統啟動的時候檢查各個DataNode上數據塊的有效性,同時根據策略必要的複製或者刪除部分數據塊...
用户可以通过 dfsadmin -safemode <value> 来操作安全模式,参数 value 的说明如下:
- enter - 进入安全模式
- leave - 强制NameNode离开安全模式
- get - 返回安全模式是否开启的信息
- wait - 等待,一直到安全模式结束。

This message was edited 53 times. Last update was at 04/11/2013 21:46:33

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...