1、fsimage和edit的差別?
NameNode 的中繼資料存放在記憶體中,FsImage 用來備份中繼資料到磁盤中。每當中繼資料有更新或者添加中繼資料時,修改記憶體中的中繼資料并追加到Edits中。這樣,一旦NameNode節點斷電,可以通過FsImage和Edits的合并,合成中繼資料。但是,如果長時間添加資料到Edits中,會導緻該檔案資料過大,效率降低,而且一旦斷電,恢複中繼資料需要的時間過長。是以,需要定期進行FsImage和Edits的合并,如果這個操作由NameNode節點完成,又會效率過低。是以,引入一個新的節點SecondaryNamenode,專門用于FsImage和Edits的合并。
2、datanode 首次加入 cluster 的時候,如果 log 報告不相容檔案版本,那需要namenode 執行格式化操作,這樣處理的原因是?
1)這樣處理是不合理的,因為那麼 namenode 格式化操作,是對檔案系統進行格式化,namenode 格式化時清空 dfs/name 下空兩個目錄下的所有檔案,之後,會在目錄 dfs.name.dir 下建立檔案。
2)文本不相容,有可能時 namenode 與 datanode 的 資料裡的 namespaceID、clusterID 不一緻,找到兩個 ID 位置,修改為一樣即可解決。
3、MapReduce 中排序發生在哪幾個階段?這些排序是否可以避免?為什麼?
1)一個 MapReduce 作業由 Map 階段和 Reduce 階段兩部分組成,這兩階段會對資料排序,從這個意義上說,MapReduce 架構本質就是一個 Distributed Sort。
2)在 Map 階段,Map Task 會在本地磁盤輸出一個按照 key 排序(采用的是快速排序)的檔案(中間可能産生多個檔案,但最終會合并成一個),在 Reduce 階段,每個 Reduce Task 會對收到的資料排序,這樣,資料便按照 Key 分成了若幹組,之後以組為機關交給 reduce()處理。
3)很多人的誤解在 Map 階段,如果不使用 Combiner便不會排序,這是錯誤的,不管你用不用 Combiner,Map Task 均會對産生的資料排序(如果沒有 Reduce Task,則不會排序,實際上 Map 階段的排序就是為了減輕 Reduce端排序負載)。
4)由于這些排序是 MapReduce 自動完成的,使用者無法控制,是以,在hadoop 1.x 中無法避免,也不可以關閉,但 hadoop2.x 是可以關閉的。
4、請列出你所知道的 hadoop 排程器,并簡要說明其工作方法?
解答:
- FIFO schedular:預設,先進先出的原則
- Capacity schedular:計算能力排程器,選擇占用最小,優先級高的先執行,以此類推。
- Fair schedular:公平排程,所有的job具有相同的資源。
5、DataNode 如何保證資料完整性
1)當DataNode讀取Block的時候,它會計算CheckSum。
2)如果計算後的CheckSum,與Block建立時值不一樣,說明Block已經損壞。
3)Client讀取其他DataNode上的Block。
4)常見的校驗算法 crc(32) md5(128) sha1(160)
5)DataNode在其檔案建立後周期驗證CheckSum
6、HDFS讀寫資料的過程
讀:
1、跟namenode通信查詢中繼資料,找到檔案塊所在的datanode伺服器;
2、挑選一台datanode(就近原則,然後随機)伺服器,請求建立socket流;
3、datanode開始發送資料(從磁盤裡面讀取資料放入流,以packet為機關來做校驗);
4、用戶端以packet為機關接收,現在本地緩存,然後寫入目标檔案
寫:
1、根namenode通信請求上傳檔案,namenode檢查目标檔案是否已存在,父目錄是否存在;
2、namenode傳回是否可以上傳;
3、client請求第一個 block該傳輸到哪些datanode伺服器上;
4、namenode傳回3個datanode伺服器ABC;
5、client請求3台dn中的一台A上傳資料(本質上是一個RPC調用,建立pipeline),A收到請求會繼續調用B,然後B調用C,将真個pipeline建立完成,逐級傳回用戶端;
6、client開始往A上傳第一個block(先從磁盤讀取資料放到一個本地記憶體緩存),以packet為機關,A收到一個packet就會傳給B,B傳給C;A每傳一個packet會放入一個應答隊列等待應答;
7、當一個block傳輸完成之後,client再次請求namenode上傳第二個block的伺服器。