1.什麼是map的數據本地化優化?
Hadoop 在存儲有輸入數據(hdfs中的數據)的節點上運行map任務,可以獲得最佳性能,因為他無需使用寶貴的集群帶寬資源。這就是所謂的數據本地化優化,但是有時對於一個map任務的輸入分片來說,存儲該分片的hdfs數據塊副本的所有節點可能正在運行其他map任務,此時作業調度需要從某一數據塊所在的機架中的一個節點上尋找一個空閒的map槽(slot)來運行該map任務分片。僅僅在非常偶然的情況下,會使用其他機架中的節點運行該map 任務,這將導致機架與機架之間的網絡傳輸。
2.為什麼map最佳分片大小與塊大小相同?
因為它是確保可以存儲在單個節點上的最大輸入塊的大小,如果分片跨越兩個數據塊,那麼對於任何一個hdfs節點,基本上都不可能同時存儲這兩個數據塊,因此分片中的部分數據需要通過網絡傳輸到map任務運行的節點,與使用本地數據運行整個mao任務相比,這種方法顯然效率更低。
3.map任務將其輸入寫入本地硬碟,而非hdfs,這是為什麼?
因為map的輸出是中間結果,該中間結果由reduce任務處理後才產生最終輸出結果,一旦完成,map的輸出結果就可以刪除。因此如果把他存儲在hdfs中並實現備份,難免有些小題大做。如果運行map任務的節點在將map中間結果傳送給reduce任務之前失敗,hadoop 將在另一個節點上重新運行這個map以再次構建map中間結果。
4.hdfs中的塊為什麼這麼大?
Hdfs 的塊比磁碟的塊大,其目的是為了最小化尋址開銷。如果塊足夠大,從磁碟傳輸數據的時間會明顯大於定位這個塊開始位置所需的時間。因而,傳輸一個由多個塊組成的大文件的時間取決於磁碟傳輸速率。
但是這個參數也不會設置的過大,mr中的map任務通常一次只處理一個塊中的數據,因此如果任務數太少,作業的運行速度就會比較慢。
5.hdfs 中塊進行抽象的好處是什麼?
>1 一個文件的大小可以大於網絡中任意一個磁碟的容量。文件的所有塊並不需要存儲在同一個磁碟上。
>2 使用抽象塊而非整個文件作為存儲單元,大大簡化了存儲子系統的設計。對於故障種類繁多的分布式系統來說尤為重要
>3 塊還非常適合用於數據備份進而提供數據容錯能力和提高可用性
6.hadoop 對於namenode單點問題有哪些容錯機制?
>1 備份那些組成文件系統運輸局持久狀態的文件,Hadoop 可以通過配置使namenode在多個文件系統上保存元數據的持久狀態。這些寫操作是實時同步的,且是原子操作。一般的配置是,將持久狀態寫入本地磁碟的同時,寫入一個遠程掛載的網絡文件系統(NFS)。
>2 運行一個輔助namenode,但它不能被用作namenode,這個輔助namenode的重要作用是定期合併編輯日誌與命名空間鏡像,以防止編輯日誌過大。這個輔助namenode 一般在另一臺單獨的物理計算機上運行,因為他需要佔用大量cpu時間,並且需要與namenode 一樣多的內存執行合併操作。
7.hadoop2 對hdfs 高可用(HA)是怎麼做的?
配置活動-備用(active-standby)namenode,當活動namenode失效,備用namenode就會接管他的任務並開始服務與來自客戶端的請求,不會有任何明顯中斷。
1.namenode之間通過高可用共享存儲(NFS或QJM)實現編輯日誌的共享,只有活動namenode才能對外提供讀寫服務,活動namenode把editlog寫入JN中,備用namenode從JN中獲取editlog合併到FsImage中,當備用的namenode接管工作之後,它將通讀共享編輯日誌直至末尾,以實現與活動namenode的狀態同步,並繼續讀取由活動namenode寫入的新條目。
2.datanode同時向namenode發送數據塊處理報告,因為數據塊的映射信息存儲在namenode的內存裡,而非磁碟。
3.客戶端需要使用特定的機制來處理namenode的失效問題,這一機制對用戶是透明的
4.輔助namenode的角色被備用namenode所包含,備用namenode為活動namenode命名空間設置周期性檢查點
5.為了實現熱備,增加FailoverController(故障轉移控制器)和Zookeeper,FailoverController與Zookeeper通信,通過Zookeeper選舉機制,FailoverController通過RPC讓NameNode轉換為Active或Standby。
知識點:
NFS(Network File System 網絡文件系統)
NFS作為active namenode和standby namenode之間數據共享的存儲。
active namenode會把最近的edits文件寫到NFS,而standby namenode從NFS中把數據讀過來。
這個方式的缺點是,如果active或standby有一個和NFS之間網絡有問題,則會造成他們之前數據的同步出問題。
並且不能保證同一時間只有一個namenode向NFS中寫入數據
QJM(Quorum Journal Manager 群體日誌管理器)【目前hadoop2.x使用】
QJM是一個專用的HDFS實現,提供了一個高可用的編輯日誌。這種方式可以解決上述NFS容錯機制不足的問題。
同一時間QJM僅允許一個namenode向編輯日誌中寫入數據。
故障轉移控制器(failover controller),管理著將活動namenode轉移為備用namenode的轉換過程。有多重故障轉移控制器,但默認的一種是使用了zookeeper來確保有且僅有一個活動namenode。每一個namenode運行著一個輕量級的故障轉移控制器。其工作就是監視宿主namenode是否失效(通過一個簡單的心跳機制實現)並在namenode失效時進行故障轉移管理員也可以手動發起故障轉移,例如在日常維護時。
JN:active和standby之間是通過一組日誌節點journal node(數量是奇數,可以是3,5,7...,2n+1)來共享數據。
active把最近的edits文件寫到2n+1個journal node上,只要有n+1個寫入成功,就認為這次寫入操作成功了
然後standby就可以從journalnode上讀取了。QJM方式有容錯的機制,可以容忍n個journalnode的失敗。