2015年9月14日 星期一

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

HDFS Balancer
HDFS 分散式檔案系統隨著時間推移, 儲存的資料量會日益成長, 負責指揮調度的 NameNode 有可能因為只將資料區塊只分配到某幾台 DataNode 運算主機, 而導致資料區塊分配不均進而影響整體效能. 好消息是 NameNode 存在一支 "HDFS Balancer" 程式, 能夠平衡負載量以避免資料區塊儲存配置不均的問題.

"HDFS Balancer" 可將資料區塊從負載較重的 DataNode 搬移到相對閒暇的運算主機去, 且會遵守設定檔中的複本配置策略, 不斷進行搬移動作直到 DataNode 運算主機的使用率達到平衡狀態. 不過現在的 HDFS 系統內部的 DataNode 使用率已經達到平衡, 我們可以先加入大資料到現有 DataNode (dn01dn03) 中, 接著再加入 DataNode dn03 使之資料區塊分配不平衡. 首先來看看目前的 DataNode 的使用率:
ubuntu@nn:~$ hdfs dfsadmin -report // 目前在 nn 運算主機內
...
Live datanodes (2):

Name: 172.16.1.210:50010 (dn01)
Hostname: dn01
Rack: /16/1
Decommission Status : Normal
Configured Capacity: 18889830400 (17.59 GB)
DFS Used: 65536 (64 KB)
Non DFS Used: 17351761920 (16.16 GB)
DFS Remaining: 1538002944 (1.43 GB)
DFS Used%: 0.00%
DFS Remaining%: 8.14%
...
Name: 172.16.1.211:50010 (dn02)
Hostname: dn02
Rack: /16/1
Decommission Status : Normal
Configured Capacity: 18889830400 (17.59 GB)
DFS Used: 65536 (64 KB)
Non DFS Used: 17351761920 (16.16 GB)
DFS Remaining: 1538002944 (1.43 GB)
DFS Used%: 0.00%
DFS Remaining%: 8.14%

接著來產生一個大檔案並將之儲存到 HDFS 中:
ubuntu@nn:~$ dd if=/dev/zero of=/tmp/test_100M bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.164762 s, 636 MB/s

ubuntu@nn:~$ hdfs dfs -copyFromLocal /tmp/test_100M /test
ubuntu@nn:~$ hdfs dfs -ls /test
Found 5 items
-rw-r--r-- 2 ubuntu supergroup 2216 2015-09-12 15:10 /test/.bash_history
-rw-r--r-- 2 ubuntu supergroup 220 2015-09-12 15:10 /test/.bash_logout
-rw-r--r-- 2 ubuntu supergroup 3843 2015-09-12 15:10 /test/.bashrc
-rw-r--r-- 2 ubuntu supergroup 5 2015-09-13 00:46 /test/test.txt
-rw-r--r-- 2 ubuntu supergroup 104857600 2015-09-14 00:39 /test/test_100M

接著將 dn03 運算主機加入 HDFS 中, 使之資料區塊分配不平均:
ubuntu@nn:~$ sudo vi /opt/hadoop-2.5.2/etc/hadoop/hdfs.allow // 將 dn03 加入
ubuntu@nn:~$ stop-dfs.sh // 重啟 HDFS
ubuntu@nn:~$ start-dfs.sh
ubuntu@nn:~$ hdfs dfsadmin -report // 確認目前應該有 3 個 DataNode
Live datanodes (3):
...
Name: 172.16.1.210:50010 (dn01)
DFS Used: 105742343 (100.84 MB)
Non DFS Used: 17563885561 (16.36 GB)
DFS Remaining: 1220202496 (1.14 GB)
DFS Used%: 0.56%
DFS Remaining%: 6.46%

...
Name: 172.16.1.211:50010 (dn02)
DFS Used: 105742343 (100.84 MB)
Non DFS Used: 17563885561 (16.36 GB)
DFS Remaining: 1220202496 (1.14 GB)
DFS Used%: 0.56%
DFS Remaining%: 6.46%

...
Name: 172.16.1.212:50010 (dn03)
DFS Used: 28672 (28 KB)
Non DFS Used: 17669599232 (16.46 GB)
DFS Remaining: 1220202496 (1.14 GB)
DFS Used%: 0.00%
DFS Remaining%: 6.46%

...

接著可以使用下面命令進行修正 dn03 使用率過低的問題:
// -threshold 10: 設定 DataNode 運算主機之間的平衡率, 差距達 10% 以上 (DFS Remaining%) 就執行 "HDFS Balancer"
ubuntu@nn:~$ hdfs balancer -threshold 10
15/09/14 00:52:37 INFO balancer.Balancer: Using a threshold of 10.0
...
Sep 14, 2015 12:52:39 AM Balancing took 2.13 seconds

ubuntu@nn:~$ hdfs dfsadmin -report // 檢視 Balancing 後的 Report

除了 "hdfs balancer -threshold 10" 命令外, 我們也可以使用 "start-balancer.sh" 讓 "HDFS Balancer" 在背景執行, 一旦超過設定的平衡率就會自動進行 Balancing. 而為了不影響系統的整體運作, 該背景程式預設會以每秒 1MB 的資料傳輸料進行搬移. 而你也可以透過在 "hdfs-site.xml" 進行設定以改變預設傳輸量:
 




上面設定 "HDFS Balancer" 的搬移頻寬為 50M/s


NameNode 毀損救援
若負責執行 NameNode 服務的主機毀損抑或是不小心重新格式化了 HDFS 分散式檔案系統, 那麼 HDFS 系統的 Metadata 目錄中的資料將被清空! 不過不用擔心, 我們可以利用 Secondary NameNode 的備份功能, 將 Secondary Namenode 的儲存目錄拷貝回 NameNode 主機, 並作些許設定即可修復還原.

再次格式化 NameNode
我們現在來重新格式化 HDFS 系統:
ubuntu@nn:~$ stop-dfs.sh // 停止 HDFS 服務
ubuntu@nn:~$ hdfs namenode -format // 格式化 HDFS
...
Re-format filesystem in Storage Directory /home/ubuntu/nn ? (Y or N)
 Y

此時 Metadata 目錄只剩下:


接著重啟 HDFS 服務並檢視根目錄:
ubuntu@nn:~$ start-dfs.sh // 啟動 HDFS 服務
ubuntu@nn:~$ hdfs dfs -ls / // 此時根目錄應該為空

接著來進行復原, 因為 Secondary NameNode 與 NameNode 在同一部運算主機, 因此可以使用下面指令進行還原:
ubuntu@nn:~$ stop-dfs.sh
ubuntu@nn:~$ cp sn/current/fsimage* nn/current/
ubuntu@nn:~$ cp sn/current/edits* nn/current/
ubuntu@nn:~$ cat nn/current/VERSION // 格式化後的 custerID 會變動, 需要同步到 DataNode
#Mon Sep 14 03:02:49 PDT 2015
namespaceID=728609269
clusterID=CID-11ffe2a9-1abc-4835-94d6-cf54391c7c16
cTime=0
storageType=NAME_NODE
blockpoolID=BP-543418184-172.16.1.200-1442224969737
layoutVersion=-57

ubuntu@nn:~$ ssh dn01
ubuntu@dn01:~$ vi dn/current/VERSION // 更新 clusterID
  1. #Mon Sep 14 00:43:25 PDT 2015  
  2. storageID=DS-3aea9101-351a-4827-9f39-1cf57914665a  
  3. #clusterID=CID-53ad2fb2-65b2-445f-a5d3-138d4a441e44  
  4. clusterID=CID-11ffe2a9-1abc-4835-94d6-cf54391c7c16  
  5. cTime=0  
  6. datanodeUuid=6b932943-9439-4e17-a684-9188e9c274c6  
  7. storageType=DATA_NODE  
  8. layoutVersion=-55  
ubuntu@dn01:~$ ls -hl dn/current/
total 8.0K
drwx------ 4 ubuntu ubuntu 4.0K Sep 14 00:43 BP-1796673813-172.16.1.200-1441722840165
-rw-rw-r-- 1 ubuntu ubuntu 281 Sep 14 03:15 VERSION

// 接著依序處理 dn02dn03 運算主機後回到 nn 運算主機
ubuntu@nn:~$ start-dfs.sh
ubuntu@nn:~$ hdfs fsck /test
...
The filesystem under path '/test' is CORRUPT
 

從檢查報告說明 HDFS 系統內有遺失的資料區塊, 其實資料區塊還是完好的保存在 DataNode 運算主機中, 是因為再次啟動 HDFS 系統時, 拿到新的 "clusterID" 的 DataNode 運算主機會自動產生新的目錄, 我們只需將原先舊的目錄的內容複製到新的目錄即可還原系統:
ubuntu@nn:~$ stop-dfs.sh
ubuntu@nn:~$ ssh dn01
ubuntu@dn01:~$ ls -hl dn/current/
total 12K
drwx------ 4 ubuntu ubuntu 4.0K Sep 14 00:43 BP-1796673813-172.16.1.200-1441722840165
drwx------ 4 ubuntu ubuntu 4.0K Sep 14 06:56 BP-543418184-172.16.1.200-1442224969737
-rw-rw-r-- 1 ubuntu ubuntu 229 Sep 14 06:56 VERSION

ubuntu@dn01:~$ cp -r dn/current/BP-1796673813-172.16.1.200-1441722840165/current/finalized/* dn/current/BP-543418184-172.16.1.200-1442224969737/current/finalized/
// 接著依序處理 dn02dn03 運算主機後回到 nn 運算主機
ubuntu@nn:~$ start-dfs.sh
ubuntu@nn:~$ hdfs fsck /test
...
The filesystem under path '/test' is HEALTHY


沒有留言:

張貼留言

[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...