【溫故而知新】hadoop常見面試題

1.hdfs寫數據流程

1.客戶端向namenode請求上傳文件,namenode檢測該文件是否已存在,父目錄是否存在,然後返回是否可以上傳。
2.客戶端請求上傳第一個block,namenode返回三個節點(dn1,dn2,dn3)。
3.客戶端向dn1請求上傳數據,dn1收到請求後會調用dn2,dn2調用dn3,建立傳輸通道,dn1、dn2、dn3逐級應答。
4.客戶端開始往dn1上傳第一個block(先從磁盤讀取放到一個本地內存緩存),以packet爲單位。dn1收到一個block就會傳給dn2,dn2傳給dn3。dn1每傳完一個packet會被放入一個應答隊列等待應答。
5.當一個block傳輸完成之後,客戶端再次向namenode請求上傳第二、第三個block,重複上面的步驟(2-4步),直至文件上傳完成。
 

2.hdfs讀數據流程

1 客戶端通過向namenode請求下載文件 ,namenode 收到請求之後查詢元數據信息,找到datanode數據塊的信息。
2 客戶端挑選一臺就近的datanode,進行請求數據。
3 datanode開始傳輸數據給客戶端,是以packet 爲單位進行讀取。
4 客戶端 接收packet 數據,先在本地緩存,最後寫入到目標文件。
 

 

3.datanode和namenode工作機制

NameNode工作機制
1.第一次啓動:第一次啓動都需要格式化nameNode ,創建fsimage,edits. 第一次啓動只需要加載fsiamge。
2.如果不是第一次啓動: 直接加載edits ,fsimage鏡像文件 ,合併成一個新的fsimage 文件,再創建edits 文件記錄新的操作行爲。
啓動的過程中,會存在30秒鐘等待時間 ,這個等待的時間就是安全模式。
 

DataNode工作機制


1.一個數據塊在datanode上是以文件形式存儲在磁盤上的,包括了兩個文件,一個數據本身,一個是元數據包 包括數據塊的長度,,數據塊的校驗和,由於HDFS上的數據是不允許被重複上傳的所以在上傳之前會對上傳的數據進行檢查 ,時間戳。
2.DataNode啓動後會向nameNode進行註冊,通過後,會週期性的向namenode上報自己的datanode上的塊信息。
3.心跳報告,每3秒鐘向nameNode進行彙報,心跳的返回結果中帶有NameNode 帶給該datanode複製數據塊,移動數據塊的命令, 如果說超過了10分鐘datanode沒有響應 ,則就會認爲這個datanode節點不可用,會選擇其他的機器。
 

 

 

3.如果NameNode意外終止,secondaryNameNode的工作是什麼?它是如何工作的?


secondaryNameNode
1.並非NameNode的熱備;
2.輔助NameNode,分擔其工作量;
3.定期合併fsimage和edits,推送給NameNode;
4.在緊急情況下,可輔助恢復NameNode。
 

4.HDFS安全模式


在系統的正常操作期間,namenode會在內存中保留所有塊位置的映射信息。在安全模式下,各個datanode會向namenode發送最新的塊列表信息,namenode瞭解到足夠多的塊位置信息之後,即可高效運行文件系統。
如果滿足“最小副本條件”,namenode會在30秒鐘之後就退出安全模式。所謂的最小副本條件指的是在整個文件系統中99.9%的塊滿足最小副本級別(默認值:dfs.replication.min=1)。在啓動一個剛剛格式化的HDFS集羣時,因爲系統中還沒有任何塊,所以namenode不會進入安全模式。
 

 

5.zookeeper的一些概念會議

 

1.沒有數據
通過myid給自己投票,根據myid的大小決定票數(比如myid爲1,就給自己投1票),誰的票數多,誰就是leader,其餘的爲follower。半數以上的節點運行成功之後,才提供服務。
2.有數據
根據xid數據的更新版本號爲標準,xid最大的爲leader(因爲follower要同步leader上的數據,所以要確保leader的數據爲最新版本),如果xid一樣則判斷myid的票數。
 

所謂HA(high available),即高可用(7*24小時不中斷服務)。實現高可用最關鍵的策略是消除單點故障。
Active standby 解決了namenode 單點故障。
存在的服務 : zookeeper(解決一致性問題) ; journalnode(解決edits同步問題); zkfc(解決切換問題,負責監測)。
同步: 元數據(edits ,fsimage ), journalnode 節點,同步edits 編輯日誌 。集羣中安全性得到了保證,但是一致性卻減弱了,爲了解決一致性的問題,必須存在zookeeper 。
切換機制: 首先要監控到 namenode 掛了,才能進行切換。如何知道掛掉了: 通過ZKFC RPC 調用監控namenode ,一旦namenode掛掉了,zookeeper 就會通知另外一個namenode 的zkfc 進程啓動 standby切換爲active,在切換之前會先殺掉之前的active(通過執行一個ssh遠程調用)。
 

 

 

 

6.hive調優方式


1.Fetch抓取:把不需要MR任務計算的查詢語句設置成不執行MR任務。三個參數,none表示禁用Fetch,所有查詢都執行MR任務;more在進行select/filter/limit查詢時不會運行MR任務;minimal在select/limit的時候不會運行MR任務,但是filter會運行MR任務。
hive.fetch.task.conversion

2.本地模式:讓輸入的數據量特別小的任務直接在本地節點上進行處理,而不提交到集羣。本地模式通過判斷文件的大小(默認128MB)和已輸入文件的個數(默認4個)來判斷是否在本地執行。
set hive.exec.mode.local.auto=true; //開啓本地 mr
set hive.exec.mode.local.auto.inputbytes.max=50000000;
set hive.exec.mode.local.auto.input.files.max=10;

3.表的優化:優化手段有join、行列過濾、分區、分桶、動態分區等等。

4.避免數據傾斜:通過合理設置map和reduce數、小文件合併等方式儘量保證負載均衡。或爲了避免因爲map或reduce任務卡死導致數據傾斜,通常也設置推測執行。

5.推測執行:爲了避免因爲程序的BUG/負載不均衡/資源分佈不均等原因導致同一作業中某一任務運行速度過慢,設置推測執行,爲該任務啓動一個備份任務,同時執行,最先運行完成的計算結果作爲最終結果。分爲map端和reduce端的推測執行。
set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true

6.並行執行:把沒有依賴關係的MR任務設置爲並行執行,提高多任務運行時的效率。
set hive.exec.parallel=true ; // 開啓任務並行執行
set hive.exec.parallel.thread.number=8; //默認值爲8個任務可以同時運行

7.嚴格模式:爲了防止一些不正常的查詢語句的執行。
hive.mapred.mode= strict

8.JVM重用:當有很多小文件的時候,每次運行MR任務都會開啓一個JVM進程,JVM頻繁的開啓關閉消耗大量的性能,所以在處理小文件的時候,可以設置JVM重用,讓一個JVM處理多個任務後再關閉。
mapreduce.job.jvm.numtasks

9.壓縮:通過壓縮對項目進行優化。例如開啓 map 輸出階段壓縮可以減少 job 中 map 和 Reduce task 間數據傳輸量。

10.執行計劃:Hive中提供的可以查看Hql語句的執行計劃,在執行計劃中會生成抽象語法樹,在語法樹中會顯示HQL語句之間的依賴關係以及執行過程。通過這些執行的過程和依賴可以對HQL語句進行優化。
 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章