天天看點

Hadoop常見面試題總結

1.HDFS讀寫流程

1.1 讀

Hadoop常見面試題總結

(1)client跟namenode通信查詢中繼資料,namenode通過查詢中繼資料,找到檔案塊所在的datanode伺服器

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

(3) datanode開始發送資料(從磁盤裡面讀取資料放入流,以packet為機關來做校驗,大小為64k)

(4)用戶端以packet為機關接收,現在本地緩存,然後寫入目标檔案

1.2 寫

Hadoop常見面試題總結

(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的伺服器。

注:

a.在通過用戶端向hdfs中寫資料的時候,如果某一台機器當機了,在寫入的時候不會重新重新配置設定datanode。如果寫入時,一個datanode挂掉,會将已經寫入的資料放置到queue的頂部,并将挂掉的datanode移出pipline,将資料寫入到剩餘的datanode,在寫入結束後, namenode會收集datanode的資訊,發現此檔案的replication沒有達到配置的要求(default=3),然後尋找一個datanode儲存副本。。

b. datanode根據網絡拓撲結構以及就近原則,傳回三個節點給namenode。

2.hdfs的體系結構

hdfs有namenode、secondraynamenode、datanode組成。為n+1模式

2.1 NameNode負責管理和記錄整個檔案系統的中繼資料

2.2 DataNode 負責管理使用者的檔案資料塊,檔案會按照固定的大小(blocksize)切成若幹塊後分布式存儲在若幹台datanode上,每一個檔案塊可以有多個副本,并存放在不同的datanode上,Datanode會定期向Namenode彙報自身所儲存的檔案block資訊,而namenode則會負責保持檔案的副本數量

2.3 HDFS的内部工作機制對用戶端保持透明,用戶端請求通路HDFS都是通過向namenode申請來進行

2.4 secondraynamenode負責合并日志

3.一個datanode 當機,怎麼一個流程恢複

Datanode當機了後,如果是短暫的當機,可以實作寫好腳本監控,将它啟動起來。如果是長時間當機了,那麼datanode上的資料應該已經被備份到其他機器了,那這台datanode就是一台新的datanode了,删除他的所有資料檔案和狀态檔案,重新啟動。

4.hadoop 的 namenode 當機,怎麼解決

先分析當機後的損失,當機後直接導緻client無法通路,記憶體中的中繼資料丢失,但是硬碟中的中繼資料應該還存在,如果隻是節點挂了,重新開機即可,如果是機器挂了,重新開機機器後看節點是否能重新開機,不能重新開機就要找到原因修複了。但是最終的解決方案應該是在設計叢集的初期就考慮到這個問題,做namenode的HA。

5.namenode對中繼資料的管理

namenode對資料的管理采用了三種存儲形式:

(1)記憶體中繼資料(NameSystem)

(2)磁盤中繼資料鏡像檔案(fsimage鏡像)

(3)資料記錄檔檔案(可通過日志運算出中繼資料)(edit日志檔案)

6.中繼資料的checkpoint

每隔一段時間,會由secondary namenode将namenode上積累的所有edits和一個最新的fsimage下載下傳到本地,并加載到記憶體進行merge(這個過程稱為checkpoint)

Hadoop常見面試題總結

namenode和secondary namenode的工作目錄存儲結構完全相同,是以,當namenode故障退出需要重新恢複時,可以從secondary namenode的工作目錄中将fsimage拷貝到namenode的工作目錄,以恢複namenode的中繼資料

7.fsimage 和 edits 是幹什麼的?為什麼要使用

edits:記錄 client 執行建立,移動,修改檔案的資訊,同時展現了 HDFS 的最新的狀态(二進制檔案)。

它分布在磁盤上的多個檔案,名稱由字首 edits 及字尾組成.字尾值是該檔案包含的事務 ID,同一時刻隻有一個檔案處于可讀寫狀态.為避免資料丢失,事務完成後 client 端在執行成功前,檔案會進行更新和同步,當 NN 向多個目錄寫資料時,隻有在所有操作更新并同步到每個副本之後執行才成功。

fsimage:記錄的是資料塊的位置資訊、資料塊的備援資訊(二進制檔案)

由于 edits 檔案記錄了最新狀态資訊,并且随着操作越多,edits 檔案就會越大,把 edits 檔案中最新的資訊寫到 fsimage 檔案中就解決了 edits 檔案數量多不友善管理的情況。

沒有展現 HDFS 的最新狀态。

每個 fsimage 檔案都是檔案系統中繼資料的一個完整的永久性的檢查點。

為什麼使用?

NN 使用了 FsImage+EditLog 整合的方案;

滾動将增量的 EditLog 更新到 FsImage,以保證更近時點的 FsImage 和更小的 EditLog 體積

8.MR

8.1 原理

Mapreduce是一個分布式運算程式的程式設計架構,是使用者開發“基于hadoop的資料分析應用”的核心架構;

Mapreduce核心功能是将使用者編寫的業務邏輯代碼和自帶預設元件整合成一個完整的分布式運算程式,并發運作在一個hadoop叢集上

8.2 為什麼要用mapreduce

(1)海量資料在單機上處理因為硬體資源限制,無法勝任

(2)而一旦将單機版程式擴充到叢集來分布式運作,将極大增加程式的複雜度和開發難度

(3)引入mapreduce架構後,開發人員可以将絕大部分工作集中在業務邏輯的開發上,而将分布式計算中的複雜性交由架構來處理

8.3 mapreduce結構及核心運作機制

8.3.1一個完整的mapreduce程式在分布式運作時有三類執行個體程序:

MRAppMaster:負責整個程式的過程排程及狀态協調

mapTask:負責map階段的整個資料處理流程

ReduceTask:負責reduce階段的整個資料處理流程

思想:分而治之,先分後合

8.3.2 整體流程圖

Hadoop常見面試題總結

其中,maptask的數量是不能設定的,reducetask可以自己設定job.setNumReduceTasks(5);

8.3.3 流程解析

1.一個mr程式啟動的時候,最先啟動的是MRAppMaster,MRAppMaster啟動後根據本次job的描述資訊,計算出需要的maptask執行個體數量,然後向叢集申請機器啟動相應數量的maptask程序

2.maptask程序啟動之後,根據給定的資料切片範圍進行資料處理,主體流程為:

利用客戶指定的inputformat來擷取RecordReader讀取資料,形成輸入KV對

将輸入KV對傳遞給客戶定義的map()方法,做邏輯運算,并将map()方法輸出的KV對收集到緩存

将緩存中的KV對按照K分區排序後不斷溢寫到磁盤檔案

3.MRAppMaster監控到所有maptask程序任務完成之後,會根據客戶指定的參數啟動相應數量的reducetask程序,并告知reducetask程序要處理的資料範圍(資料分區)

4.Reducetask程序啟動之後,根據MRAppMaster告知的待處理資料所在位置,從若幹台maptask運作所在機器上擷取到若幹個maptask輸出結果檔案,并在本地進行重新歸并排序,然後按照相同key的KV為一個組,調用客戶定義的reduce()方法進行邏輯運算,并收集運算輸出的結果KV,然後調用客戶指定的outputformat将結果資料輸出到外部存儲

8.4 reducer 數量設定

(1)reduce個數的設定極大影響任務執行效率,不指定reduce個數的情況下,Hive會猜測确定一個reduce個數,基于以下兩個設定:

hive.exec.reducers.bytes.per.reducer(每個reduce任務處理的資料量,預設為1000^3=1G)

hive.exec.reducers.max(每個任務最大的reduce數,預設為999)

計算reducer數的公式很簡單N=min(參數2,總輸入資料量/參數1)

即,如果reduce的輸入(map的輸出)總大小不超過1G,那麼隻會有一個reduce任務;

(2)直接設定reduce數量

set mapred.reduce.tasks = 15;

9.shuffle

9.1 概述

mapreduce中,map階段處理的資料如何傳遞給reduce階段,是mapreduce架構中最關鍵的一個流程,這個流程就叫shuffle;

shuffle: 洗牌、發牌——(核心機制:資料分區,排序,緩存);

具體來說:就是将maptask輸出的處理結果資料,分發給reducetask,并在分發的過程中,對資料按key進行了分區和排序;

9.2 主要流程

Hadoop常見面試題總結

shuffle是MR處理流程中的一個過程,它的每一個處理步驟是分散在各個map task和reduce task節點上完成的,整體來看,分為3個操作:

(1)分區partition

(2)Sort根據key排序

(3)Combiner進行局部value的合并

具體來說就是将maptask輸出的處理結果資料,分發給reducetask,并在分發的過程中,對資料按key進行了分區和排序;

9.3 詳細流程

Hadoop常見面試題總結

(1)maptask收集我們的map()方法輸出的kv對,先進入分區方法,把資料标記好分區,然後把資料發送到記憶體緩沖區(預設100M)中

(2)當環形緩沖區達到80%時,進行溢寫,從記憶體緩沖區不斷溢出本地磁盤檔案,可能會溢出多個檔案 (溢寫前對資料進行快速排序,排序按照key的索引進行字典順序排序)

(3)多個溢出檔案會被合并成大的溢出檔案(歸并排序算法),對溢寫的檔案也可以進行combiner操作,前提是彙總操作,求平均值不行。

(4)在溢出過程中,及合并的過程中,都要調用partitoner進行分組和針對key進行排序

(5)reducetask根據自己的分區号,去各個maptask機器上取相應的結果分區資料,拉取的資料先存儲在記憶體中,記憶體不夠了,再存儲到磁盤。

(6)reducetask會取到同一個分區的來自不同maptask的結果檔案,reducetask會将這些檔案再進行合并(歸并排序)

(7)合并成大檔案後,shuffle的過程也就結束了,後面進入reducetask的邏輯運算過程(從檔案中取出一個一個的鍵值對group,調用使用者自定義的reduce()方法)

注意

Shuffle中的緩沖區大小會影響到mapreduce程式的執行效率,原則上說,緩沖區越大,磁盤io的次數越少,執行速度就越快

緩沖區的大小可以通過參數調整, 參數:io.sort.mb 預設100M

10.Yarn的資源排程流程

Hadoop常見面試題總結

10.1 使用者向YARN 中送出應用程式, 其中包括ApplicationMaster 程式、啟動ApplicationMaster 的指令、使用者程式等。

10.2 ResourceManager 為該應用程式配置設定第一個Container, 并與對應的NodeManager 通信,要求它在這個Container 中啟動應用程式的ApplicationMaster。

10.3 ApplicationMaster 首先向ResourceManager 注冊, 這樣使用者可以直接通過ResourceManage 檢視應用程式的運作狀态,然後它将為各個任務申請資源,并監控它的運作狀态,直到運作結束,即重複步驟4~7。

10.4 ApplicationMaster 采用輪詢的方式通過RPC 協定向ResourceManager 申請和領取資源。

10.5 一旦ApplicationMaster 申請到資源後,便與對應的NodeManager 通信,要求它啟動任務。

10.6 NodeManager 為任務設定好運作環境(包括環境變量、JAR 包、二進制程式等)後,将任務啟動指令寫到一個腳本中,并通過運作該腳本啟動任務。

10.7 各個任務通過某個RPC 協定向ApplicationMaster 彙報自己的狀态和進度,以讓ApplicationMaster 随時掌握各個任務的運作狀态,進而可以在任務失敗時重新啟動任務。在應用程式運作過程中,使用者可随時通過RPC 向ApplicationMaster 查詢應用程式的目前運作狀态。

10.8 應用程式運作完成後,ApplicationMaster 向ResourceManager 登出并關閉自己。

11.Hadoop優化有哪些方面

11.1 HDFS 小檔案影響

(1)影響 NameNode 的壽命,因為檔案中繼資料存儲在 NameNode 的記憶體中

(2)影響計算引擎的任務數量,比如每個小的檔案都會生成一個 Map 任務

11.2 資料輸入小檔案處理:

(1)合并小檔案:對小檔案進行歸檔(Har)、自定義 Inputformat 将小檔案存儲成SequenceFile 檔案。

(2)采用 ConbinFileInputFormat 來作為輸入,解決輸入端大量小檔案場景。

(3)對于大量小檔案 Job,可以開啟 JVM 重用。

11.3 Map 階段

(1)增大環形緩沖區大小。由 100m 擴大到 200m

(2)增大環形緩沖區溢寫的比例。由 80%擴大到 90%

(3)減少對溢寫檔案的 merge 次數。(10 個檔案,一次 20 個 merge)

(4)不影響實際業務的前提下,采用 Combiner 提前合并,減少 I/O。

11.4 Reduce 階段

(1)合理設定 Map 和 Reduce 數:兩個都不能設定太少,也不能設定太多。太少,會導緻 Task 等待,延長處理時間;太多,會導緻 Map、Reduce 任務間競争資源,造成處理逾時等錯誤。

(2)設定 Map、Reduce 共存:調整 slowstart.completedmaps 參數,使 Map 運作到一定程度後,Reduce 也開始運作,減少 Reduce 的等待時間。

(3)規避使用 Reduce,因為 Reduce 在用于連接配接資料集的時候将會産生大量的網絡消耗。

(4)增加每個 Reduce 去 Map 中拿資料的并行數

(5)叢集性能可以的前提下,增大 Reduce 端存儲資料記憶體的大小。

11.5 IO 傳輸

(1)采用資料壓縮的方式,減少網絡 IO 的的時間。安裝 Snappy 和 LZOP 壓縮編碼器。

(2)使用 SequenceFile 二進制檔案

11.6 整體

(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 最大重試次數

12.列出正常工作的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檔案.

13.Hadoop總job和Tasks之間的差別是什麼?

Job是我們對一個完整的mapreduce程式的抽象封裝

Task是job運作時,每一個處理階段的具體執行個體,如map task,reduce task,maptask和reduce task都會有多個并發運作的執行個體

14.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數來控制,進而安全地進行故障轉移。

15.yarn的三大排程政策

FIFO Scheduler把應用按送出的順序排成一個隊列,這是一個先進先出隊列,在進行資源配置設定的時候,先給隊列中最頭上的應用進行配置設定資源,待最頭上的應用需求滿足後再給下一個配置設定,以此類推。

Capacity(容量)排程器,有一個專門的隊列用來運作小任務,但是為小任務專門設定一個隊列會預先占用一定的叢集資源,這就導緻大任務的執行時間會落後于使用FIFO排程器時的時間。

在Fair(公平)排程器中,我們不需要預先占用一定的系統資源,Fair排程器會為所有運作的job動态的調整系統資源。當第一個大job送出時,隻有這一個job在運作,此時它獲得了所有叢集資源;當第二個小任務送出後,Fair排程器會配置設定一半資源給這個小任務,讓這兩個任務公平的共享叢集資源。

需要注意的是,在下圖Fair排程器中,從第二個任務送出到獲得資源會有一定的延遲,因為它需要等待第一個任務釋放占用的Container。小任務執行完成之後也會釋放自己占用的資源,大任務又獲得了全部的系統資源。最終的效果就是Fair排程器即得到了高的資源使用率又能保證小任務及時完成。

繼續閱讀