1. 程式人生 > >【面試題】Hadoop相關

【面試題】Hadoop相關

1.HDFS的特點?

  • Hadoop是一套開源的軟體平臺,利用伺服器叢集,根據使用者的自定義業務邏輯,對海量資料進行分散式處理,核心元件分為:HDFS(分散式檔案系統)、MapRuduce(分散式運算程式設計框架)、YARN(運算資源排程系統)

  • HDFS是Hadoop體系中資料儲存管理的基礎。它是一個高度容錯的系統,能檢測和應對硬體故障,用於在低成本的通用硬體上執行。HDFS簡化了檔案的一致性模型,通過流式資料訪問,提供高吞吐量應用程式資料訪問功能,具有高容錯、高可靠性、高可擴充套件性、高獲得性、高吞吐率等等,適合帶有大型資料集的應用程式

  • HDFS採用主從結構模型,一個HDFS叢集是由一個NameNode和若干個DataNode組成的。NameNode管理檔案系統的名稱空間,維護檔案系統樹及整棵樹內所有檔案和目錄,即名稱空間映象檔案和編輯日誌檔案。SecondaryNameNode的任務是定期合併fsimage和editlog,並傳輸給NameNode,為NameNode提供冷備份。DataNode 是檔案系統的工作節點,根據需要儲存並檢索資料塊(客戶端或NameNode排程),定期向NameNode傳送它們所儲存塊的列表。

  • Client通過同NameNode和DataNodes的互動訪問檔案系統。客戶端聯絡NameNode以獲取檔案的元資料,而真正的檔案I/O操作是直接和DataNode進行互動的。

  • HDFS的優點:適合儲存大資料檔案、檔案分塊儲存、流式資料訪問:一次寫入多次讀寫、廉價硬體、硬體故障 、即Hadoop可以流式訪問大檔案,部署在廉價的叢集上。缺點:不適合低延遲資料訪問(Hbase)、無法高效儲存大量小檔案(歸檔Hbase)、不支援多使用者寫入及任意修改檔案。

  • 常用命令:hadoop fs –put/get/lsr/mkdir/rmr等,

2.客戶端從HDFS中讀寫資料過程?

  • 讀取資料

• 客戶端(client)用FileSystem的open()函式開啟檔案。

• DistributedFileSystem用RPC呼叫元資料節點,得到檔案的資料塊資訊。

• 對於每一個數據塊,元資料節點返回儲存資料塊的資料節點的地址。

• DistributedFileSystem返回FSDataInputStream給客戶端,用來讀取資料。

• 客戶端呼叫stream的read()函式開始讀取資料。

• DFSInputStream連線儲存此檔案第一個資料塊的最近的資料節點。

• Data從資料節點讀到客戶端(client)。

• 當此資料塊讀取完畢時,DFSInputStream關閉和此資料節點的連線,然後連線此檔案下一個資料塊的最近的資料節點。

• 當客戶端讀取完畢資料的時候,呼叫FSDataInputStream的close函式。

• 在讀取資料的過程中,如果客戶端在與資料節點通訊出現錯誤,則嘗試連線包含此資料塊的下一個資料節點。

• 失敗的資料節點將被記錄,以後不再連線。

  • 寫入資料

• 客戶端呼叫create()來建立檔案

• DistributedFileSystem用RPC呼叫元資料節點,在檔案系統的名稱空間中建立一個新的檔案。

• 元資料節點首先確定檔案原來不存在,並且客戶端有建立檔案的許可權,然後建立新檔案。

• DistributedFileSystem返回DFSOutputStream,客戶端用於寫資料。

• 客戶端開始寫入資料,DFSOutputStream將資料分成塊,寫入data queue。

• Data queue由Data Streamer讀取,並通知元資料節點分配資料節點,用來儲存資料塊(每塊預設複製3塊)。分配的資料節點放在一個pipeline裡。

• Data Streamer將資料塊寫入pipeline中的第一個資料節點。第一個資料節點將資料塊傳送給第二個資料節點。第二個資料節點將資料傳送給第三個資料節點。

• DFSOutputStream為發出去的資料塊儲存了ack queue,等待pipeline中的資料節點告知資料已經寫入成功。

• 如果資料節點在寫入的過程中失敗:

  • 關閉pipeline,將ack queue中的資料塊放入data queue的開始。
  • 當前的資料塊在已經寫入的資料節點中被元資料節點賦予新的標示,則錯誤節點重啟後能夠察覺其資料塊是過時的,會被刪除。
  • 失敗的資料節點從pipeline中移除,另外的資料塊則寫入pipeline中的另外兩個資料節點。
  • 元資料節點則被通知此資料塊是複製塊數不足,將來會再建立第三份備份。

• 當客戶端結束寫入資料,則呼叫stream的close函式。此操作將所有的資料塊寫入pipeline中的資料節點,並等待ack queue返回成功。最後通知元資料節點寫入完畢。

3.HDFS的檔案目錄結構?

  • HDFS的檔案目錄主要由NameNode、SecondaryNameNode和DataNode組成,而NameNode和DataNode之間由心跳機制通訊。預設的儲存單位是128M的資料塊

  • NameNode的檔案結構包含edits、fsimage、seen_txid、VERSION

    • edits:當客戶端執行寫操作時,首先NameNode會在編輯日誌中寫下記錄,並在記憶體中儲存一個檔案系統元資料,這個描述符會在編輯日誌改動之後更新。
    • fsimage:檔案系統元資料的持久檢查點,包含以protobuf序列化格式儲存的檔案系統目錄和檔案inodes,每個inodes表徵一個檔案或目錄的元資料資訊以及檔案的副本數、修改和訪問時間等資訊。
    • seen_txid是存放transactionId的檔案,代表namenode的edits_*檔案尾數
    • VERSION,儲存了HDFS的版本號:namespaceID、clusterID、blockpoolID、cTimestorageType等
    • in_use.lock:防止一臺機器同時啟動多個Namenode程序導致目錄資料不一致
  • SecondaryNameNode主要包括edits、fsimage、VERSION

    • .edits:從NameNode複製的日誌檔案
    • fsimage:從NameNode複製的映象檔案
    • VERSION:與NameNode的VERSION相同
  • CheckPoint過程:Secondary NameNode首先請求原NameNode進行edits的滾動,這樣新的編輯操作就能夠進入新的檔案中。通過HTTP方式讀取原NameNode中的fsimage及edits。然後將fsimage讀取到記憶體中,然後執行edits中的每個操作,並建立一個新的統一的fsimage.chpt檔案。通過HTTP方式將新的fsimage傳送到原NameNode。原NameNode用新的fsimage替換舊的fsimage,舊的edits檔案用第一步的edits進行替換。同時系統會更新fsimage檔案到記錄檢查點的時間。 最後,NameNode就有了最新的fsimage檔案和更小的edits檔案

  • 可執行hadoop dfsadmin –saveNamespace命令執行上圖的過程Secondary NameNode(NameNode的冷備份)每隔一小時會插入一個檢查點,如果編輯日誌達到64MB,則間隔時間更短,每隔5分鐘檢查一次。

  • DataNode的檔案結構主要由blk_字首檔案、BP-number和VERSION構成。

    • BP代表NameNode的VERSION中的BlockPoolID,number表示該BP的NameNode的IP地址和建立時間戳
    • finalized:儲存HDFS BLOCK的資料,裡面包含許多block_xx檔案以及相應的.meta檔案,.meta檔案包含了checksum資訊。rbw目錄用於儲存使用者當前正在寫入的資料。
    • blk_字首檔案:儲存的是原始檔案內容。若目錄中的塊資料量達到64,便會新建一個子目錄
    • VERSION: storageID(在NN標識DN)、clusterID、cTime、datanodeUuid、layoutVersion

4.NameNode的記憶體結構?

  • NameNode記憶體主要由Namespace+BlocksMap(50%)NetworkTopology及其它部分組成

  • Namespace:維護整個檔案系統的目錄樹結構及目錄樹上的狀態變化;目錄樹中存在INodeDirectory和INodeFile兩種INode資料結構,

  • BlockManager:維護整個檔案系統中與資料塊相關的資訊及資料塊的狀態變化;管理BlocksMap,BlockMap的核心功能就是通過BlockID快速定位到具體的BlockInfo,BlockInfo維護的是Block的元資料。叢集啟動過程,DataNode會進行BR(BlockReport),根據BR的每一個Block計算其HashCode,之後將對應的BlockInfo插入到相應位置逐漸構建起來巨大的BlocksMap。

  • NetworkTopology:維護機架拓撲及DataNode資訊,機架感知的基礎;DataNode節點資訊的每一個儲存單元DatanodeStorageInfo上的所有Blocks集合會形成一個雙向連結串列,連結串列的入口就是機架拓撲結構葉子節點

  • 其它:LeaseManager:讀寫的互斥同步就是靠Lease實現;CacheManager:支援集中式快取的管理;SnapshotManager:用於資料備份、回滾。

5.NameNode的重啟優化?

  • NameNode記憶體佔用增長出現的問題:啟動時間變長、效能下降、NameNode Full GC風險較高(CMS)、超大JVM Heap Size除錯問題

  • 解決方法:擴充套件NameNode分散單點負載(SNN或SBN)、引入外部系統支援NameNode記憶體資料、合併小檔案、調整合適的BlockSize(預設128M)、將原生NameNode管理的Namespace和BlockManagement進行物理拆分、藉助高速儲存裝置,將元資料通過外存裝置進行持久化儲存。

  • NameNode重啟流程:載入FSImage、回放EditLog、執行CheckPoint(可選)、DataNode重新註冊RegisterDataNode,然後彙報所有資料塊BlockReport。

  • 解決方法:重啟過程儘可能避免出現CheckPoint、優化BlockReport處理邏輯(若彙報的資料塊相關元資料還沒有載入,先暫存訊息佇列,當NameNode完成載入相關元資料後,再處理該訊息佇列)、防止SBN或SNN長時間未正常執行堆積大量Editlog拖慢NameNode重啟時間 、調整Block數量閾值,將一次BlockReport分成多盤分別彙報。

6.Git的使用?

  • 常用命令:git init 初始化版本庫、git add/rm suger.md 新增/刪除檔案到暫存區、git commit -m “first” 將檔案從暫存區提交到倉庫中、git branch列出所有本地分支、git checkout slave 切換到slave分支、git merge slave 合併指定分支到當前分支、git branch -d slave 刪除slave分支、git tag 列出所有標籤、git status 顯示有變更的檔案、git log 顯示當前分支的版本資訊、git diff 顯示工作區與暫存區的差異、git remote add [shortname] [url] 增加一個新的遠端倉庫,並命名、git pull [remote] [branch]取回遠端倉庫的變化,並與本地分支合併、git push [remote] –force 強行推送當前分支到遠端倉庫、git checkout suger.md 恢復暫存區的指定檔案到工作區、git reset –hard 重置暫存區與工作區,與上一次commit保持一致、git fetch [remote] 下載遠端倉庫的所有變動

7.Maven的使用

  • maven是一個專案構建和管理的工具,將專案過程規範化、自動化、高效化以及強大的可擴充套件性,利用maven自身及其外掛還可以獲得程式碼檢查報告、單元測試覆蓋率、實現持續整合等等,依賴管理是它的特點。

  • 座標:groupId: 組織ID,一般是公司、團體名稱,artifactId:實際專案的ID,一般是專案、模組名稱,version:版本,開發中的版本一般打上 SNAPSHOT 標記(快照)

  • 三級倉庫結構:遠端公用倉庫、內部中央倉庫(私服)、本地倉庫(Maven 會將工程中依賴的構件(Jar包)從遠端下載到本機一個目錄下管理)。

  • maven的生命週期:clean:在真正的構建之前進行一些清理工作;default:構件專案的核心部分,validate、compile、test、package、install、deploy等;site:生成專案報告、站點、釋出站點。



本人才疏學淺,若有錯,請指出,謝謝!
如果你有更好的建議,可以留言我們一起討論,共同進步!
衷心的感謝您能耐心的讀完本篇博文!