1. 程式人生 > 實用技巧 >大資料面試題之葵花寶典------Hadoop

大資料面試題之葵花寶典------Hadoop

葵花寶典------Hadoop

1. hdfs讀寫流程

hdfs寫流程

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的伺服器。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

hdfs讀流程

1、client跟namenode通訊查詢元資料,找到檔案塊所在的datanode伺服器

2、挑選一臺datanode(就近原則,然後隨機)伺服器,請求建立socket流

3、datanode開始傳送資料(從磁盤裡面讀取資料放入流,以packet為單位來做校驗)

4、客戶端以packet為單位接收,現在本地快取,然後寫入目標檔案
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
2. hdfs的體系結構
1、hdfs有namenode、secondraynamenode、datanode組成。為n+1模式
2、NameNode負責管理和記錄整個檔案系統的元資料
3、DataNode 負責管理使用者的檔案資料塊,檔案會按照固定的大小(blocksize)切成若干塊後分布式儲存在若干
   臺datanode上,每一個檔案塊可以有多個副本,並存放在不同的datanode上,Datanode會定期向Namenode
   彙報自身所儲存的檔案block資訊,而namenode則會負責保持檔案的副本數量
4、HDFS的內部工作機制對客戶端保持透明,客戶端請求訪問HDFS都是通過向namenode申請來進行
5、secondraynamenode負責合併日誌
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3. 一個datanode 宕機,怎麼一個流程恢復
Datanode宕機了後,如果是短暫的宕機,可以實現寫好指令碼監控,將它啟動起來。如果是長時間宕機了,
那麼datanode上的資料應該已經被備份到其他機器了,那這臺datanode就是一臺新的datanode了,
刪除他的所有資料檔案和狀態檔案,重新啟動。
  • 1
  • 2
  • 3
4. hadoop 的 namenode 宕機,怎麼解決
先分析宕機後的損失,宕機後直接導致client無法訪問,記憶體中的元資料丟失,但是硬碟中的元資料應該還存在,
如果只是節點掛了,重啟即可,如果是機器掛了,重啟機器後看節點是否能重啟,不能重啟就要找到原因修復了。
但是最終的解決方案應該是在設計叢集的初期就考慮到這個問題,做namenode的HA。
  • 1
  • 2
  • 3
5. namenode對元資料的管理
namenode對資料的管理採用了三種儲存形式:

   1、記憶體元資料(NameSystem)

   2、磁碟元資料映象檔案(fsimage映象)

   3、資料操作日誌檔案(可通過日誌運算出元資料)(edit日誌檔案)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
6. 元資料的checkpoint
每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,
並載入到記憶體進行merge(這個過程稱為checkpoint)

namenode和secondary namenode的工作目錄儲存結構完全相同,所以,當namenode故障退出需要重新恢復時
可以從secondary namenode的工作目錄中將fsimage拷貝到namenode的工作目錄,以恢復namenode的元資料
  • 1
  • 2
  • 3
  • 4
  • 5
7. yarn資源排程流程
1、使用者向YARN 中提交應用程式, 其中包括ApplicationMaster 程式、啟動ApplicationMaster 的命令、
使用者程式等。
2、ResourceManager 為該應用程式分配第一個Container, 並與對應的NodeManager 通訊,要求它在這個
   Container 中啟動應用程式的ApplicationMaster。
3、ApplicationMaster 首先向ResourceManager 註冊, 這樣使用者可以直接通過ResourceManage 檢視
   應用程式的執行狀態,然後它將為各個任務申請資源,並監控它的執行狀態,直到執行結束,即重複步驟4~7
4、ApplicationMaster 採用輪詢的方式通過RPC 協議向ResourceManager 申請和領取資源。
5、一旦ApplicationMaster 申請到資源後,便與對應的NodeManager 通訊,要求它啟動任務。
6、NodeManager 為任務設定好執行環境(包括環境變數、JAR 包、二進位制程式等)後,將任務啟動命令
   寫到一個指令碼中,並通過執行該指令碼啟動任務。
7、各個任務通過某個RPC 協議向ApplicationMaster 彙報自己的狀態和進度,以讓ApplicationMaster 
   隨時掌握各個任務的執行狀態,從而可以在任務失敗時重新啟動任務。在應用程式執行過程中,使用者可
   隨時通過RPC 向ApplicationMaster 查詢應用程式的當前執行狀態。
8、應用程式執行完成後,ApplicationMaster 向ResourceManager 登出並關閉自己。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
8. hadoop中combiner和partition的作用
1、combiner是發生在map的最後一個階段,父類就是Reducer,意義就是對每一個maptask的輸出進行
  區域性彙總,以減小網路傳輸量,緩解網路傳輸瓶頸,提高reducer的執行效率。

2、partition的主要作用將map階段產生的所有kv對分配給不同的reducer task處理,可以將reduce階段的
  處理負載進行分攤
  • 1
  • 2
  • 3
  • 4
  • 5
9. 用mapreduce怎麼處理資料傾斜問題?
資料傾斜:map /reduce程式執行時,reduce節點大部分執行完畢,但是有一個或者幾個reduce節點
執行很慢,導致整個程式的處理時間很長,這是因為某一個key的條數比其他key多很多(有時是百倍或
者千倍之多),這條key所在的reduce節點所處理的資料量比其他節點就大很多,從而導致某幾個節點
遲遲執行不完,此稱之為資料傾斜。
  • 1
  • 2
  • 3
  • 4

(1)區域性聚合加全域性聚合。

     第一次在 map 階段對那些導致了資料傾斜的 key 加上 1 到 n 的隨機字首,這樣本來相同的 key 也
會被分到多個 Reducer 中進行區域性聚合,數量就會大大降低。
     第二次 mapreduce,去掉 key 的隨機字首,進行全域性聚合。
思想:二次 mr,第一次將 key 隨機雜湊到不同 reducer 進行處理達到負載均衡目的。第
二次再根據去掉 key 的隨機字首,按原 key 進行 reduce 處理。
這個方法進行兩次 mapreduce,效能稍差。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(2)增加 Reducer,提升並行度

JobConf.setNumReduceTasks(int)
  • 1

(3)實現自定義分割槽

根據資料分佈情況,自定義雜湊函式,將 key 均勻分配到不同 Reducer
  • 1
10. shuffle 階段,你怎麼理解的

1、Map方法之後Reduce方法之前這段處理過程叫Shuffle
2、Map方法之後,資料首先進入到分割槽方法,把資料標記好分割槽,然後把資料傳送到環形緩衝區;環形緩衝區預設
  大小100m,環形緩衝區達到80%時,進行溢寫;溢寫前對資料進行排序,排序按照對key的索引進行字典順序排
  序 ,排序的手段快排;溢寫產生大量溢寫檔案,需要對溢寫檔案進行歸併排序;對溢寫的檔案也可以進行
  Combiner操作,前提是彙總操作,求平均值不行。最後將檔案按照分割槽儲存到磁碟,等待Reduce端拉取。
3、每個Reduce拉取Map端對應分割槽的資料。拉取資料後先儲存到記憶體中,記憶體不夠了,再儲存到磁碟。拉取完所
  有資料後,採用歸併排序將記憶體和磁碟中的資料都進行排序。在進入Reduce方法前,可以對資料進行分組操作。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
11. Mapreduce 的 map 數量 和 reduce 數量是由什麼決定的 ,怎麼配置
1、 map的數量由輸入切片的數量決定,128M切分一個切片,只要是檔案也分為一個切片,
    有多少個切片就有多少個map Task。
2、 reduce數量自己配置。
  • 1
  • 2
  • 3
12. MapReduce優化經驗
1、 設定合理的map和reduce的個數。合理設定blocksize
2、避免出現數據傾斜
3、 combine函式
4、對資料進行壓縮
5、小檔案處理優化:事先合併成大檔案,combineTextInputformat,在hdfs上用mapreduce將小檔案合
   併成SequenceFile大檔案(key:檔名,value:檔案內容)
6、引數優化
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
13. 分別舉例什麼情況要使用 combiner,什麼情況不使用?
求平均數的時候就不需要用combiner,因為不會減少reduce執行數量。在其他的時候,可以依據情況,使用
 combiner,來減少map的輸出數量,減少拷貝到reduce的檔案,從而減輕reduce的壓力,節省網路開銷,提升
 執行效率
  • 1
  • 2
  • 3
14. 簡單描述一下HDFS的系統架構,怎麼保證資料安全?
1、儲存在HDFS系統上的檔案,會分割成128M大小的block儲存在不同的節點上,block的副本數預設3份,也可配置
   成更多份;
2、第一個副本一般放置在與client(客戶端)所在的同一節點上(若客戶端無datanode,則隨機放),第二個副本
   放置到與第一個副本同一機架的不同節點,第三個副本放到不同機架的datanode節點,當取用時遵循就近原則;

3、datanode已block為單位,每3s報告心跳狀態,做10min內不報告心跳狀態則namenode認為block已死掉,
   namonode會把其上面的資料備份到其他一個datanode節點上,保證資料的副本數量;
4、datanode會預設每小時把自己節點上的所有塊狀態資訊報告給namenode;
5、採用safemode模式:datanode會週期性的報告block資訊。Namenode會計算block的損壞率,當閥值
  <0.999f時系統會進入安全模式,HDFS只讀不寫。HDFS元資料採用secondaryname備份或者HA備份
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
15. 在通過客戶端向hdfs中寫資料的時候,如果某一臺機器宕機了,會怎麼處理
   在寫入的時候不會重新重新分配datanode。如果寫入時,一個datanode掛掉,會將已經寫入的資料放置到
   queue的頂部,並將掛掉的datanode移出pipline,將資料寫入到剩餘的datanode,在寫入結束後, 
   namenode會收集datanode的資訊,發現此檔案的replication沒有達到配置的要求(default=3),
   然後尋找一個datanode儲存副本
  • 1
  • 2
  • 3
  • 4
16. Hadoop優化有哪些方面
0)HDFS小檔案影響
(1)影響NameNode的壽命,因為檔案元資料儲存在NameNode的記憶體中
(2)影響計算引擎的任務數量,比如每個小的檔案都會生成一個Map任務
1)資料輸入小檔案處理:
(1)合併小檔案:對小檔案進行歸檔(Har)、自定義Inputformat將小檔案儲存成SequenceFile檔案。
(2)採用ConbinFileInputFormat來作為輸入,解決輸入端大量小檔案場景。
(3)對於大量小檔案Job,可以開啟JVM重用。
2)Map階段
(1)增大環形緩衝區大小。由100m擴大到200m
(2)增大環形緩衝區溢寫的比例。由80%擴大到90%
(3)減少對溢寫檔案的merge次數。
(4)不影響實際業務的前提下,採用Combiner提前合併,減少 I/O。
3)Reduce階段
(1)合理設定Map和Reduce數:兩個都不能設定太少,也不能設定太多。太少,會導致Task等待,延長處理時間
    太多,會導致 Map、Reduce任務間競爭資源,造成處理超時等錯誤。
(2)設定Map、Reduce共存:調整slowstart.completedmaps引數,使Map執行到一定程度後,Reduce也開
    始執行,減少Reduce的等待時間。
(3)規避使用Reduce,因為Reduce在用於連線資料集的時候將會產生大量的網路消耗。
(4)增加每個Reduce去Map中拿資料的並行數
(5)叢集效能可以的前提下,增大Reduce端儲存資料記憶體的大小。 
4)IO傳輸
(1)採用資料壓縮的方式,減少網路IO的的時間。安裝Snappy和LZOP壓縮編碼器。
(2)使用SequenceFile二進位制檔案
5)整體
(1)MapTask預設記憶體大小為1G,可以增加MapTask記憶體大小為4-5g
(2)ReduceTask預設記憶體大小為1G,可以增加ReduceTask記憶體大小為4-5g
(3)可以增加MapTask的cpu核數,增加ReduceTask的CPU核數
(4)增加每個Container的CPU核數和記憶體大小
(5)調整每個Map Task和Reduce Task最大重試次數
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
17. 大量資料求topN(寫出mapreduce的實現思路)
1.維持一個逆序的list(LinkedList)
2.新加入資料,判斷是否達到最大topn,
  如果沒有超過topn最大值,直接加入,重新排序;
  如果大於topn,比較和最後一個值的大小,如果小於最後一個值,不做任何處理
  如果大於最後一個值,替換最後一個值,重新排序
(實現程式碼包括回覆內容,兩種實現方式,第一種List實現,第二種TreeSet實現)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
18. 列出正常工作的hadoop叢集中hadoop都分別啟動哪些程序以及他們的作用
1.NameNode它是hadoop中的主伺服器,管理檔案系統名稱空間和對叢集中儲存的檔案的訪問,儲存有metadate
2.SecondaryNameNode它不是namenode的冗餘守護程序,而是提供週期檢查點和清理任務。幫助NN合併
   editslog,減少NN啟動時間。
3.DataNode它負責管理連線到節點的儲存(一個叢集中可以有多個節點)。每個儲存資料的節點執行一個
   datanode守護程序。
4.ResourceManager(JobTracker)JobTracker負責排程DataNode上的工作。每個DataNode有一個
  TaskTracker它們執行實際工作。
5.NodeManager(TaskTracker)執行任務
6.DFSZKFailoverController高可用時它負責監控NN的狀態,並及時的把狀態資訊寫入ZK。它通過一個獨立
  執行緒週期性的呼叫NN上的一個特定介面來獲取NN的健康狀態。FC也有選擇誰作為Active NN的權利,因為
  最多隻有兩個節點,目前選擇策略還比較簡單(先到先得,輪換)。
7.JournalNode 高可用情況下存放namenode的editlog檔案.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
19. Hadoop總job和Tasks之間的區別是什麼?
1、Job是我們對一個完整的mapreduce程式的抽象封裝
2、Task是job執行時,每一個處理階段的具體例項,如map task,reduce task,maptask和reduce 
   task都會有多個併發執行的例項
  • 1
  • 2
  • 3
20. Hadoop高可用HA模式
HDFS高可用原理:

Hadoop HA(High Available)通過同時配置兩個處於Active/Passive模式的Namenode來解決上述問題,
狀態分別是Active和Standby. Standby Namenode作為熱備份,從而允許在機器發生故障時能夠快速進行故
障轉移,同時在日常維護的時候使用優雅的方式進行Namenode切換。Namenode只能配置一主一備,不能多於兩個
Namenode。

主Namenode處理所有的操作請求(讀寫),而Standby只是作為slave,維護儘可能同步的狀態,使得故障時能夠
快速切換到Standby。為了使Standby Namenode與Active Namenode資料保持同步,兩個Namenode都與一組
Journal Node進行通訊。當主Namenode進行任務的namespace操作時,都會確保持久會修改日誌到
Journal Node節點中。Standby Namenode持續監控這些edit,當監測到變化時,將這些修改同步到自己的
namespace。

當進行故障轉移時,Standby在成為Active Namenode之前,會確保自己已經讀取了Journal Node中的所有
edit日誌,從而保持資料狀態與故障發生前一致。

為了確保故障轉移能夠快速完成,Standby Namenode需要維護最新的Block位置資訊,即每個Block副本存放
在叢集中的哪些節點上。為了達到這一點,Datanode同時配置主備兩個Namenode,並同時傳送Block報告和心跳
到兩臺Namenode。

確保任何時刻只有一個Namenode處於Active狀態非常重要,否則可能出現數據丟失或者資料損壞。當兩臺
Namenode都認為自己的Active Namenode時,會同時嘗試寫入資料(不會再去檢測和同步資料)。為了防止這種
腦裂現象,Journal Nodes只允許一個Namenode寫入資料,內部通過維護epoch數來控制,從而安全地進行故障
轉移。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
21. 簡要描述安裝配置一個hadoop叢集的步驟
    1、使用root賬戶登入。
    2、 修改IP。
    3、修改Host主機名。
    4、 配置SSH免密碼登入。
    5、關閉防火牆。
    6、 安裝JDK。
    7、上傳解壓Hadoop安裝包。
    8、配置Hadoop的核心配置檔案hadoop-evn.sh,core-site.xml,mapred-site.xml,hdfs-site.xml,yarn-site.xml
    9、配置hadoop環境變數
    10、格式化hdfs # bin/hadoop  namenode  -format
    11、啟動節點start-all.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
22. fsimage和edit的區別
fsimage:filesystem image 的簡寫,檔案映象。

客戶端修改檔案時候,先更新記憶體中的metadata資訊,只有當對檔案操作成功的時候,才會寫到editlog。

fsimage是檔案meta資訊的持久化的檢查點。secondary namenode會定期的將fsimage和editlog合併dump成
新的fsimage	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
23. yarn的三大排程策略
1)Hadoop排程器重要分為三類:
     FIFO 、Capacity Scheduler(容量排程器)和Fair Sceduler(公平排程器)。
         Hadoop2.7.2預設的資源排程器是 容量排程器
2)區別:
  • 1
  • 2
  • 3
  • 4

FIFO排程器:先進先出,同一時間佇列中只有一個任務在執行。

容量排程器:多佇列;每個佇列內部先進先出,同一時間佇列中只有一個任務在執行。佇列並行度為佇列的個數

公平排程器:多佇列;每個佇列內部按照缺額大小分配資源啟動任務,同一時間佇列中有多個任務執行。佇列的並行度大於等於佇列的個數。
一定要強調生產環境中不是使用的FifoScheduler,面試的時侯會發現候選人大概瞭解這幾種排程器的區別,但是問在生產環境用哪種,卻說使用的FifoScheduler(企業生產環境一定不會用這個排程的)