2015年9月13日 星期日

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

查看 HDFS 運作狀態
在維護系統前, 我們可以使用 HDFS 系統的 "dfsadmin" 管理命令來查看 HDFS 的運作狀態:
ubuntu@nn:~$ hdfs dfsadmin -report
Configured Capacity: 37779660800 (35.19 GB)
Present Capacity: 5840199680 (5.44 GB)
DFS Remaining: 5840134144 (5.44 GB)
DFS Used: 65536 (64 KB)
DFS Used%: 0.00%
Under replicated blocks: 0
Blocks with corrupt replicas: 0
Missing blocks: 0

-------------------------------------------------
Live datanodes (2):

Name: 172.16.1.210:50010 (dn01)
Hostname: dn01
Decommission Status : Normal
Configured Capacity: 18889830400 (17.59 GB)
DFS Used: 32768 (32 KB)
Non DFS Used: 15969730560 (14.87 GB)
DFS Remaining: 2920067072 (2.72 GB)
DFS Used%: 0.00%
DFS Remaining%: 15.46%

Configured Cache Capacity: 0 (0 B)
Cache Used: 0 (0 B)
Cache Remaining: 0 (0 B)
Cache Used%: 100.00%
Cache Remaining%: 0.00%
Xceivers: 1
Last contact: Sat Sep 12 15:04:19 PDT 2015

Note. 使用上述命令需要具備 HDFS 系統管理權限才能執行

查看 HDFS 檔案儲存資訊
對於系統管理人員只了解 HDFS 系統運作狀態往往還不夠, 還需要進一步知道各個檔案的儲存資訊, 例如: 檔案區塊儲存位置, 這時候可以使用 HDFS 系統的 "fsck" 管理指令:
ubuntu@nn:~$ hdfs dfs -mkdir /test
ubuntu@nn:~$ hdfs dfs -copyFromLocal .bash* /test
// -files: 列出被檢查過的檔案名稱
// -blocks: 列出資料區塊的檢查報告
// -locations: 列出每一個資料區塊的儲存位置

ubuntu@nn:~$ hdfs fsck /test/.bashrc -files -blocks -locations
Connecting to namenode via http://nn:50070
FSCK started by ubuntu (auth:SIMPLE) from /172.16.1.200 for path /test/.bashrc at Sat Sep 12 15:10:36 PDT 2015
/test/.bashrc 3843 bytes, 1 block(s): OK
0. BP-1796673813-172.16.1.200-1441722840165:blk_1073741833_1009 len=3843 repl=2 [172.16.1.210:50010, 172.16.1.211:50010]

Status: HEALTHY
Total size: 3843 B
Total dirs: 0
Total files: 1
Total symlinks: 0
Total blocks (validated): 1 (avg. block size 3843 B)
Minimally replicated blocks: 1 (100.0 %)
Over-replicated blocks: 0 (0.0 %)
Under-replicated blocks: 0 (0.0 %)
Mis-replicated blocks: 0 (0.0 %)
Default replication factor: 2
Average block replication: 2.0
Corrupt blocks: 0
Missing replicas: 0 (0.0 %)
Number of data-nodes: 2
Number of racks: 1
FSCK ended at Sat Sep 12 15:10:36 PDT 2015 in 5 milliseconds


The filesystem under path '/test/.bashrc' is HEALTHY

Secondary NameNode 主要資料庫備分及彙整
在 HDFS 分散式系統中, 除了 NameNode 和 DataNode 運算主機, 其實還有一個相當重要角色, 那就是 "Secondary NameNode"! 在探討其功能之前, 首先來介紹 "fsimage" 檔和 "edits" 檔. "fsimage" 和 "edits" 這兩個檔案都儲存在 HDFS 系統的 Metadata 目錄中, "fsimage" 是用來存放 HDFS 系統中, 所有檔案及目錄的屬性資料; "edits" 則是在 HDFS 系統啟動後, 用來記錄所有的異動資料, 例如新增, 刪除, 修改檔案等的操作紀錄.


當 NameNode 啟動後, "fsimage" 和 "edits" 會被讀入記憶體中, 之後任何異動的資料會被記錄在 "edits" 檔, 且會同步修改記憶體中的 HDFS Metadata, 一旦 NameNode 開始運作, 存放 Metadata 目錄中的 "fsimage" 不會再有任何的改變; 不過在實際應用面上, 機房作業中的主機往往會長時間不會關機, 負責記錄異動資料的 "edits" 檔案將會變得非常龐大! 這時就需要仰賴 "Secondary NameNode" 的運作.

每隔一段時間, "Secondary NameNode" 會定期連結到 NameNode 主機 (預設一小時), 取回 "fsimage" 和 "edits" 檔案, 並將 "edits" 的資料彙整更新到 "fsimage". 更新後的 "fsimage" 檔會再回傳到 NameNode 主機的 Metadata 目錄, 以此更新 NameNode 的 "fsimage" 檔, 經過彙整過後的 "edits" 檔就會縮小. Secondary NameNode 這種彙整更新的運作模式, 其實透過些許設定, 就可以讓 "Secondary NameNode" 作為 NameNode 主機的毀壞備援機 (後面章節說明).

我們可以先使用下面命令, 查看 "Secondary NameNode" 的預設儲存目錄:


每次啟動主機系統都會自動重製 "/tmp" 目錄, 因此 Secondary NameNode 儲存的重要檔案將會被清空! 因此我們要再 "hdfs-site.xml" 檔案中加入 Secondary NameNode 的儲存目錄設定. 使用下面命令編輯設定該檔案:
ubuntu@nn:~$ sudo vi /opt/hadoop-2.5.2/etc/hadoop/hdfs-site.xml
這邊 NameNode 與 Secondary NameNode 在同一部運算主機上, 但在實際應用上請務必將 NameNode 與 Secondary NameNode 單獨分開建置. 如果要讓 Secondary NameNode 可以順利在另一部主機執行, 還必須在 "hdfs-site.xml" 加入以下設定:








設定 Secondary NameNode 間隔彙整時間

Secondary NameNode 預設的間隔彙整時間為 3600 秒, 也就是每一小時會備份與彙整一次. 這個時間間隔可以在 "hdfs-site.xml" 設定進行變更:


  •   


    上面變更時間為 10 分鐘, 完成之後為了確認設定值已經生效, 我們可以檢查 Secondary NameNode 的 Log 檔:
    ubuntu@nn:~$ tail -n 30 /tmp/hadoop-ubuntu-secondarynamenode-nn.log | grep "Checkpoint done"
    ...
    2015-09-12 21:31:44,936 WARN org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Checkpoint done. New Image Size: 643
    2015-09-12 22:31:45,545 WARN org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Checkpoint done. New Image Size: 643

    透過觀察時間差可以得知 Secondary NameNode 進行彙整更新的頻率.

    設定 Rack Awareness
    藉由 "core-site.xml" 檔案的設定, 讓 Client 端在眾多運算主機中, 能夠順利與 NameNode 主機連結, 但是在這麼多的機櫃 (Rack) 中, NameNode 是如何知道 DataNode 運算主機存放在哪個機櫃上呢? 在啟動 DataNode 之後, DataNode 會定期傳送訊息給 NameNode (例如: 硬碟剩餘空間) 已確定 DataNode 運運算主機是否有在運作. 而我們可以藉由 DataNode 主動傳送訊息的機制來撰寫程式, 讓 NameNode 收到 DataNode 運算主機的 IP 位址, 並藉由此 IP 位址就可以得知 DataNode 所在的機櫃位置.

    使用下面指令建立名為 "rack-awareness.sh" 程式:
    ubuntu@nn:~$ sudo vi /opt/rack-awareness.sh
    1. #!/bin/sh  
    2. # get IP address from the input  
    3. ipaddr=$1  
    4. # select x.y and convert it to x/y  
    5. segments=`echo $ipaddr | cut -d '.' -f2-3 --output-delimiter='/'`  
    6. echo /${segments}  
    ubuntu@nn:~$ sudo chmod +x /opt/rack-awareness.sh

    接著編輯 "core-site.xml" 進行設定:
    ubuntu@nn:~$ sudo vi /opt/hadoop-2.5.2/etc/hadoop/core-site.xml



    接著重啟 HDFS 檔案系統, 並透過 Report 檢視設定是否生效:
    ubuntu@nn:~$ stop-dfs.sh
    ubuntu@nn:~$ start-dfs.sh
    ubuntu@nn:~$ hdfs dfsadmin -report
    Safe mode is ON
    Configured Capacity: 37779660800 (35.19 GB)
    Present Capacity: 5836824576 (5.44 GB)
    DFS Remaining: 5836709888 (5.44 GB)
    DFS Used: 114688 (112 KB)
    DFS Used%: 0.00%
    Under replicated blocks: 0
    Blocks with corrupt replicas: 0
    Missing blocks: 0

    -------------------------------------------------
    Live datanodes (2):

    Name: 172.16.1.210:50010 (dn01)
    Hostname: dn01
    Rack: /16/1
    ...

    管理 DataNode 運算主機
    當 HDFS 系統的儲存空間不夠使用的時候, 有兩種解決方法, 我們可以擴充 DataNode 運算主機的硬體儲存設備, 或者直接添加新的 DataNode 運算主機. 不過這邊不建議使用第一種方法, 即使擴充了儲存空間, 資料區塊卻也不斷的存入, 很有可能會讓 DataNode 運算主機負載過重; 若可以直接添加 DataNode 運算主機, 不僅能擴充儲存空間, 更可以分散資料區塊存入 DataNode 的儲存配置, 進而提升 HDFS 系統的執行效率.

    我們現在就來新增一台新的 DataNode 運算主機, 並作一些適當設定, 讓新的 DataNode 運算主機可以幫忙分散資料區塊的存入配置. 在實體主機終端使用下面指令複製一台新的 "dn03" 運算主機:
    # sudo lxc-clone myHDP2 dn03
    # vi /opt/hadoop-2.5.2/etc/hadoop/slaves // 新增 dn03 
    1. #localhost  
    2. dn01  
    3. dn02  
    4.   
    5. dn03  
    # vi /var/lib/lxc/dn03/fstab // 將實體主機 /opt 掛載到 dn03 運算主機內
    1. #[裝置/UUID等]  [掛載點]    [檔案系統]  [檔案系統參數]  [dump]  [fsck]  
    2. /opt    /var/lib/lxc/dn03/rootfs/opt  none    bind    0   0  
    # lxc-start -n dn03 -d
    # lxc-console -n dn03
    ubuntu@dn03:~$ sudo vi /etc/network/interfaces
    1. iface eth0 inet static  
    2.     address 172.16.1.212  
    3.     netmask 255.255.255.0  
    4.     gateway 172.16.1.1  
    5.     dns-nameservers 168.95.1.1  
    ubuntu@dn03:~$ sudo ifdown eth0
    ubuntu@dn03:~$ sudo ifup eth0 // 重啟網路
    ubuntu@dn03:~$ ip addr show eth0
    16: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:16:3e:44:e2:a9 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.212/24 brd 172.16.1.255 scope global eth0
    ...

    ubuntu@dn03:~$ sudo vi /etc/hosts
    1. 172.16.1.212    dn03  

    按下 "Ctrl+a , q" 回到實體主機. 接著為了讓執行 NameNode 的 nn 運算主機可以透過 SSH 端遠端管理連線 dn03 運算主機, 我們必須設定 nn 運算主機:
    # lxc-console -n nn
    ubuntu@nn:~$ sudo vi /etc/hosts
    1. 172.16.1.212    dn03  
    ubuntu@nn:~$ stop-dfs.sh // 重啟 HDFS 檔案系統
    ubuntu@nn:~$ start-dfs.sh
    ubuntu@nn:~$ hdfs dfsadmin -report
    ...
    Live datanodes (3):
    ...
    Name: 172.16.1.212:50010 (dn03)
    Hostname: dn03
    Rack: /16/1
    Decommission Status : Normal
    Configured Capacity: 18889830400 (17.59 GB)
    DFS Used: 24576 (24 KB)
    Non DFS Used: 17296498688 (16.11 GB)
    DFS Remaining: 1593307136 (1.48 GB)
    DFS Used%: 0.00%
    DFS Remaining%: 8.43%
    Configured Cache Capacity: 0 (0 B)
    Cache Used: 0 (0 B)
    Cache Remaining: 0 (0 B)
    Cache Used%: 100.00%
    Cache Remaining%: 0.00%
    Xceivers: 1
    Last contact: Sun Sep 13 00:36:26 PDT 2015

    移除 DataNode 運算主機
    若要在 HDFS 系統中移除 DataNode 運算主機, 請先停止運算主機的 DataNode 服務, 再做移除的動作. 請在 dn03 運算主機終端機上按下面指令停止 DataNode 服務:
    ubuntu@dn03:~$ /opt/hadoop-2.5.2/sbin/hadoop-daemon.sh stop datanode
    stopping datanode
    ubuntu@dn03:~$ jps // 如果沒有出現 "DataNode" 字串, 說明 DataNode 服務已經停止.
    756 Jps

    接著回到 nn 運算主機檢視, 雖然 dn03 停止了 DataNode 服務, 但是還是要等一段時間 NameNode 才會發現這個狀況:
    # lxc-console -n nn
    ubuntu@nn:~$ hdfs dfsadmin -report // 此時 Live datanodes 應該是 2

    若要徹底移除 dn03 運算主機的 DataNode 服務, 還需要修改 "slaves" 檔案, 將 "dn03" 註解掉, 這樣重啟 HDFS 系統才不會連帶啟動 dn03 運算主機的 DataNode 服務.

    DataNode 運算主機的管理策略
    經由上述操作說明, 我們得知如何新增刪除 Hadoop 分散式運算系統的 DataNode 運算主機, 但這樣做會有兩個問題:
    * 任何未經安全認證主機, 皆有可能被加入 HDFS 分散系統內.
    * 任意 (強制) 移除 DataNode, 容易造成 Hadoop 系統內部資料管理的混亂.

    在實務管理上會使用 HDFS 系統的 "白名單" 來管控 DataNode 的異動. 首先來新增 HDFS 系統的白名單:
    ubuntu@nn:~$ sudo vi /opt/hadoop-2.5.2/etc/hadoop/hdfs.allow // 設定只允許 dn01, dn02 執行 DataNode 服務
    ubuntu@nn:~$ sudo vi /opt/hadoop-2.5.2/etc/hadoop/hdfs-site.xml // 設定白名單位置



  • 完成設定後, 就算你將 "dn03" 在 "slaves" 檔案的註解拿掉, 重啟 HDFS 系統也不會將 "dn03" 運算主機視為 DataNode 之一 (還是會啟動 dn03 這個 DataNode, 但是不會在 Report 看到此 DataNode).

    Supplement
    Secondary Namenode - What it really do?
    Secondary Namenode is one of the poorly named component in Hadoop. By its name, it gives a sense that its a backup for the Namenode.But in reality its not. Lot of beginners in Hadoop get confused about what exactly SecondaryNamenode does and why its present in HDFS.So in this blog post I try to explain the role of secondary namenode in HDFS...


    沒有留言:

    張貼留言

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