目錄
1. 大資料的特點(4V特征)
2. 談談 Hadoop 的優缺點
3. 為什么 HDFS 不適合存小檔案
4. Hadoop 的核心組件有哪些,并說明下功能
5. Hadoop 與關系型資料庫對比
6. 如果集群中 DataNode 出現錯誤(比如 DataNode 行程死亡或者網路故障造成無法與 NameNode 通信),集群能否立即將宕機的DataNode下線?另外DataNode 下線后,集群將進行什么作業?
7. 簡單說明下 HDFS 中,NameNode ,SecondaryNameNode 和 DataNode 的作用
8. 簡單描述一下 dfs-start.sh 的啟動流程(或者 NameNode 的啟動流程)
9. 什么情況下集群會進入安全模式
10. HDFS 的讀寫執行流程
11. HDFS 的可靠性策略有哪些
12. 如果一個 DataNode 宕機了,如何做恢復
13. MapReduce 的執行流程
14. Yarn 的 Job 提交流程
15. Hadoop 中資料塊(Block)大小如何確定,現有一個檔案大小為260M,Block大小設定為128MB,在進行 split 操作時,會生成幾個 Block
16. Block 大小設定成多少合適
17. MapReduce 中有哪些關鍵類
18. Mapper 中 setup 方法是干嘛的
19. Hadoop Shuffle 原理
20. MapReduce 的調優
21. Hadoop 中支持的存盤格式和壓縮演算法
1. 大資料的特點(4V特征)
- Volume(大資料量):90% 的資料是過去兩年產生
- Velocity(速度快):資料增長速度快,時效性高
- Variety(多樣化):資料種類和來源多樣化 結構化資料、半結構化資料、非結構化資料
- Value(價值密度低):需挖掘獲取資料價值
2. 談談 Hadoop 的優缺點
優點:
- 高擴展性:在集群間分配任務資料,可方便的擴展數以千計的節點
- 高可靠性:Hadoop底層維護多個資料副本
- 高容錯性:Hadoop框架能夠自動將失敗的任務重新分配
- 低成本:Hadoop架構允許部署在廉價的機器上
- 靈活,可存盤任意型別資料
- 開源,社區活躍
缺點:
- Hadoop不適用于低延遲資料訪問
- Hadoop不能高效存盤大量小檔案
- Hadoop不支持多用戶寫入并任意修改檔案:一個檔案只能有一個寫者,僅支持append
3. 為什么 HDFS 不適合存小檔案
HDFS 檔案存盤是以 Block 進行存盤的(Hadoop 2.x 以后 Block 大小默認為128M),而 Block 元資料大小大概在 150 位元組左右,Block 的元資料會在 NameNode 啟動時加載到記憶體,也就意味著一個小檔案就要占用 NameNode 150 位元組記憶體,如果小檔案過多,NameNode 記憶體很有可能被消耗殆盡,但整個集群存盤資料的量卻很小,失去了HDFS的意義,同時也會影響 NameNode 的尋址時間,導致尋址時間過長
4. Hadoop 的核心組件有哪些,并說明下功能
HDFS:分布式檔案系統,解決分布式存盤
MapReduce:分布式計算框架
YARN:分布式資源管理系統,在 Hadoop 2.x 中引入
Common:支持所有其他模塊的公共工具程式
5. Hadoop 與關系型資料庫對比

6. 如果集群中 DataNode 出現錯誤(比如 DataNode 行程死亡或者網路故障造成無法與 NameNode 通信),集群能否立即將宕機的DataNode下線?另外DataNode 下線后,集群將進行什么作業?
(1)不能立即下線,NameNode不會立即把該節點判定死亡,HDFS 默認的超時時長為10分30秒,如果定義timeout為超時時長,則超時時長的計算公式為:timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval,默認的heartbeat.recheck.interval為5分鐘,dfs.heartbeat.interval默認為3秒
(2)DateNode 下線后,集群將復制下線的 DataNode 管理的塊,在其他 DataNode 上做備份
7. 簡單說明下 HDFS 中,NameNode ,SecondaryNameNode 和 DataNode 的作用
NameNode:
- master 的角色,是 Hadoop 集群的管理者,也被稱為 HDFS 的元資料節點,集群中只能有一個 Active 的 NameNode 對外提供服務
- 管理著 HDFS 的名稱空間(檔案目錄樹)及資料塊(Block)映射資訊及副本資訊
- 負責對接客戶端的讀寫請求
SecondaryNameNode:
- 負責鏡像備份
- 完成日志和鏡像的定期合并,即合并 NameNode 的 edit logs 到 fsimage 檔案中
DataNode:
- worker的角色,負責具體的執行操作
- 存盤實際的資料塊(Block)
- 執行資料塊的讀/寫操作
8. 簡單描述一下 dfs-start.sh 的啟動流程(或者 NameNode 的啟動流程)
第一階段:NameNode 啟動
- 第一次啟動 NameNode 會執行格式化并創建 fsimage 和 edits 檔案,如果不是第一次啟動,則直接加載 fsimage 和 edits 到記憶體中
- 客戶端對元資料進行增刪改的請求
- NameNode 記錄操作日志,更新滾動日志
- NameNode 在記憶體總隊資料進行增刪改查
第二階段:DataNode 啟動
- 在集群啟動時向 NameNode 注冊存活狀態
- 啟動時立即執行匯報 Block 資訊,之后每隔1小時匯報一次
- 與 NameNode 建立 3秒一次的心跳機制,匯報當前健康狀態和磁盤使用情況
第三階段:SecondaryNameNode 啟動
- SecondaryNameNode 詢問 NameNode 是否需要 checkpoint,直接帶回 NameNode 是否需要 checkpoint 的結果
- SecondaryNameNode 請求執行 checkpoint
- 將 NameNode 滾動前的編輯日志和鏡像檔案拷貝至 SecondaryNameNode
- SecondaryNameNode 加載編輯日志和鏡像檔案到記憶體中進行合并
- 生成新的鏡像檔案 fsimage.chkpoint
- 拷貝 fsimage.chkpoint 到 NameNode
- NameNode 將fsimage.chkpoint 重新命名成fsimage
另外,在這3個階段完成之前,集群處于安全模式
9. 什么情況下集群會進入安全模式
集群啟動時:
由于 NameNode 在啟動時加載的是所有塊位置的映射資訊,而非完整的塊資料,所以需要各個 DataNode 向 NameNode 發送最新的塊串列資訊來驗證塊是否有效,在此期間 NameNode 的檔案系統對于客戶端來說是只讀的
Block例外損壞:
當 NameNode 發現集群中的 Block 丟失數量大于設定閾值時,NameNode 會進入安全模式,對低于閾值的 Block 在其他 DataNode 節點上做備份
在執行負載均衡操作時需要進入安全模式:
由于在做負載均衡操作時會對Block進行復制和洗掉操作,所以需要進入安全模式
10. HDFS 的讀寫執行流程
寫資料執行流程
- 客戶端通過 Distributed FileSystem 模塊向 NameNode 請求上傳檔案,NameNode 需要檢查目標檔案是否已存在,父目錄是否存在
- NameNode 回傳是否可以上傳,不能上傳則會回傳例外
- 確認可以上傳后,客戶端請求第一個 Block 上傳到哪幾個 DataNode 服務器上
- NameNode 回傳3個 DataNode 節點,例如dn1、dn2、dn3
- 客戶端通過 FSDataOutputStream 模塊請求 dn1 上傳資料,dn1 收到請求會繼續呼叫 dn2,然后dn2 呼叫 dn3,建立通信管道
- dn1、dn2、dn3 逐級應答客戶端
- 客戶端向 dn1 以 packet(64KB)為單位上傳第一個 Block,dn1 收到一個 packet 就會傳給 dn2,dn2 傳給 dn3,dn1 每傳一個 packet 會放入應答佇列等待應答
- 當第一個 Block 上傳完之后,客戶端會再次請求 NameNode 上傳第二個 Block 服務,直至所有Block 都完成上傳
讀資料執行流程

- 首先呼叫 FileSystem.open() 方法,獲取到 DistributedFileSystem 實體
- DistributedFileSystem 向 NameNode 發起 RPC(遠程程序呼叫)請求獲得檔案的開始部分或者全部 Block 串列,對于每個回傳的 Block,都包含 Block 所在的 DataNode 地址,這些 DataNode 會按照 Hadoop 定義的集群拓撲結構得出與客戶端的距離,然后進行排序,如果客戶端本身就是一個 DataNode 節點,那么會優先從本地讀取檔案
- DistributedFileSystem 會向客戶端回傳一個支持檔案定位的輸入流物件 FSDataInputStream,用于客戶端讀取資料,FSDataInputStream 包含一個 DFSInputStream 物件,這個物件用來管理 DataNode 和 NameNode 之間的 I/O
- 客戶端呼叫 read() 方法,DFSInputSteam 就會找出離客戶端最近的 DataNode 并連接 DataNode
- DFSInputStream 物件中包含檔案開始部分的資料塊所在的 DataNode 地址,首先它會連接包含檔案的第一個塊最近的 DataNode,隨后在資料流中重復呼叫 read() 函式,直到一個塊全部讀完為止,如果第一個塊資料全部讀完,就會關閉指向第一個塊的 DataNode 連接,接著讀取下一個塊
- 如果所有塊都讀完,就會關閉掉所有的流
11. HDFS 的可靠性策略有哪些
檔案完整性:
- 檔案建立時,每個資料塊都產生校驗和,校驗和保存在 .meta 檔案內
- 客戶端獲取資料時可以檢查校驗和是否相同,從而發現資料塊是否損壞
- 如果正在讀取的資料塊損壞,則可以繼續讀取其他副本,同時 NameNode 標記該資料塊已經損壞,然后復制資料塊達到預期的檔案備份數
- DataNode 在其檔案創建后三周驗證其checksum
網路或機器失效時:
- 副本冗余
- 機架感知策略(副本放置策略)
- 心跳機制策略
NameNode 掛掉時:
- 主備切換(體現了 Hadoop 集群的高可用)
- 鏡像檔案和操作日志磁盤存盤
- 鏡像檔案和操作日志可一個存盤多份,多磁盤存盤
其他保障可靠性機制:
- 快照:
- 回收站機制
- 安全模式
12. 如果一個 DataNode 宕機了,如何做恢復
將宕機的 DataNode 上的資料洗掉,重新當成新節點加入到集群即可
13. MapReduce 的執行流程

- 預處理;CombineTextInputFormat(針對小檔案多的情形)
- 切片:切片大小為設定的切片大小上下限和Block大小的中位值,根據切片的數量啟對應數量的Map數量
- 在每個Map端呼叫readRecord中read()方法并發(mapper)按行讀取
- 讀取內容存入OutputContainer(削峰) #第一次IO結束
- 環形緩沖區讀取OutputContainer中的資料
- 當環形緩沖區資料達到80%時溢寫成小檔案,小檔案中的內容磁區有序,磁區內鍵有序,采用的排序方法為快排() #第二次IO結束,如果有Combiner方法,會在此時執行
- 小檔案合并成大檔案,歸并排序,大檔案磁區有序,磁區內鍵有序 #第三次IO結束
- Reduce根據磁區號讀取各自對應的磁區檔案 #第四次IO結束
- 讀取磁區檔案,根據鍵歸并排序后落盤 #第五次IO結束
14. Yarn 的 Job 提交流程

作業提交:
(1)client 呼叫 job.waitForCompletion 方法,想整個集群提交 MapReduce 作業,
(2)client 向 ResourceManager 申請一個作業 id
(3)ResourceManager 給 Client 回傳該 job 資源的提交路徑(HDFS 路徑)和作業 id,每個作業都有唯一的 id
(4)client 發送 jar 包、切片資訊和組態檔到指定的資源提交路徑
(5)client 提交完資源后,向 ResourceManager 申請運行 ApplicationMaster
作業初始化:
(6)當 ResourceManager 收到 client 的請求后,將該 job 添加到容器調度器(Resource Scheduler)中
(7)在某一個空閑的 NodeManager 領取到該 job
(8)該 NodeManager 創建 Container,并產生 ApplicationMaster
(9)下載 Client 提交的資源到本地,根據分片資訊生成 MapTask 和 ReduceTask
任務分配:
(10)ApplicationMaster 向 ResourceManager 申請運行多個 MapTask 任務資源
(11)ResourceManager 將運行 MapTask 任務分配給空閑的多個 NodeManager,NodeManager 分別領取任務并創建容器
任務運行:
(12)ApplicationMaster 向接收到任務的 NodeManager 發送程式啟動腳本,每個接收到任務的 NodeManager 啟動 MapTask,MapTask 對資料進行處理,并磁區排序
(13)ApplicationMaster 等待所有 MapTask 運行完畢后,向 ResourceManager 申請容器運行 ReduceTask
(14)程式運行完畢后,ApplicationMaster 會向 ResourceManager 申請注銷自己
(15)進度和狀態更新,Yarn 中的任務將其進度和狀態(包括 counter)回傳給應用管理器,客戶端每秒(通過 mapreduce.client.progressmonitor.pollinterval 設定)向應用管理器請求進度更新并展示給用戶,可以從 Yarn WebUI 查看任務執行狀態
作業完成:
除了向應用管理器請求作業進度外,客戶端每5分鐘都會通過呼叫 waitForCompletion() 方法來檢查作業是否完成,時間間隔可以通過 mapreduce.client.completion.polinterval 來設定,作業完成后,應用管理器和 container 會清理作業狀態,作業的資訊會被作業歷史服務器存盤以備之后用戶核查
15. Hadoop 中資料塊(Block)大小如何確定,現有一個檔案大小為260M,Block大小設定為128MB,在進行 split 操作時,會生成幾個 Block
根據官網描述,Hadoop 2.7.3 版本之前,Block 默認大小為 64MB,Hadoop 2.7.3 以后,Block 默認大小為 128MB,可以通過修改hdfs-site.xml檔案中的dfs.blocksize對應的值
會產生2個 Block,因為每次切片時,都要先判斷剩余部分是否大于 Block 大小的1.1倍,不大于1.1倍就劃分到一個 Block
16. Block 大小設定成多少合適
- HDFS中平均尋址時間大概為10ms;
- 經過前任的大量測驗發現,尋址時間為傳輸時間的1%時,為最佳狀態,所以最佳傳輸時間:10ms/0.01=1000s=1s
- 目前磁盤的傳輸速度普遍為100MB/s,最佳block大小計算:100MB/s*1s=100MB,所以我們設定block大小為128MB
- 實際中,磁盤傳輸速率為200MB/s時,一般設定block大小為256MB;磁盤傳輸速率為400MB/s時,一般設定block大小為512MB
17. MapReduce 中有哪些關鍵類
GenericOptionsParser:為了 Hadoop 框架決議命令列引數的工具類
InputFormate介面可以實作的類:FileInputFormat、ComposableInputformat 等,主要用于檔案為輸入及切割
Mapper:將輸入的 kv 對映射成中間資料 kv 對集合,Maps 將輸入記錄轉變為中間記錄
Reducer:根據 key 將中間資料集合處理合并為更小的資料結果集
Partitioner:對資料按照 key 進行磁區
OutputCollecter:檔案輸出
Combine:本地聚合,Mapper 端的 reduce
18. Mapper 中 setup 方法是干嘛的
setup 方法用于管理 Mapper 生命周期中的資源,加載一些初始化作業,每個 job 執行一次,setup 在完成 Mapper 構造,即將開始執行 map 動作前執行
19. Hadoop Shuffle 原理
定義:
把 map 方法之后 reduce 方法之前這段處理程序稱之為 Shuffle
具體步驟:
- maptask 的輸出資料會被寫入環形緩沖區(起到削峰的作用),并記錄偏移量
- 環形緩沖區默認大小為100M,當資料達到80%即80M時,記錄終止偏移量,并溢寫成小檔案
- 將小檔案資料進行磁區,磁區內進行快速排序(磁區有序,磁區內鍵有序)
- maptask 結束后,形成的多個小檔案會進行歸并排序并合并成大檔案(磁區有序,磁區內鍵有序)
- 執行 reducetask 任務,去執行 maptask 的機器上拉取 屬于自己磁區的資料
- reducetask 對拉取過來的資料進行歸并排序(磁區內鍵有序)
20. MapReduce 的調優
MapReduce 優化方法主要從6個方面考慮:資料輸入、Map 階段、Reduce 階段、IO 傳輸、資料傾斜和常用調優引數
資料輸入:
- 合并小檔案,在執行 MapReduce 任務之前將小檔案合并,大量小檔案會產生大量的 map 任務,增大 map 任務裝載次數,而任務的裝載比較耗時,從而導致 MapReduce 運行較慢
- 采用 CombineTextInputFormat.setMinInputSplitSize 來定義最小切片大小,解決輸入端大量小檔案的場景
Map 階段:
- 減少溢寫次數,通過調整 io.sort.mb 及 sort.spill.percent 引數值,增大觸發溢寫的記憶體上限,減少溢寫次數,從而減少磁盤 IO
- 減少合并次數,通過調整 io.sort.factor 引數,增大 merge 的檔案數目,減少 merge 次數,從而縮短 MapReduce 處理時間
- 在 map 之后,不影響業務邏輯的前提下,先進行 combine 處理,減少 IO
Reduce 階段:
- 合理設定 map 和 reduce 數量,兩個數量都不能太少或者太多,太少會導致 task 等待時間過長,延長處理時間,太多,會導致 map 和 reduce 任務之間競爭資源,造成處理超時等錯誤
- 設定 map 和 reduce 共存,調整 slow start completedmaps 引數,使 map 運行到一定程度后,reduce 也開始執行,從而減少 reduce 等待時間
- 規避使用 reduce,因為 reduce 在用于連接資料集的時候會產生大量的網路消耗
- 合理設定 reduce 端的 buffer,可以通過設定引數來配置,使得 buffer 中的一部分資料可以直接輸送到 reduce,從而減少 IO 開銷,MapReduce.Reduce.input.buffer.percent 的默認值 為 0.0,當值大于 0 時,會保留在指定比例的記憶體讀 buffer 中的資料直接拿給 reduce 使用
IO傳輸:
- 采用資料壓縮的方式,減少任務的 IO 時間
- 使用 seq 二進制檔案
21. Hadoop 中支持的存盤格式和壓縮演算法
存盤格式:
- SequenceFile:以二進制鍵值對的形式存盤資料
- Avro:將資料定義和資料一起存盤在一條訊息中,其中資料定義以JSON格式存盤,資料以二進制格式存盤
- RCFile:以列格式保存每個行組資料,他不是存盤第一行然后是第二行,而是存盤所有行上的第一列,然后是所有行上的第二列,以此類推
- Parquet:是 Hadoop 的一種列存盤格式,提供了搞笑的編碼和壓縮方案
壓縮演算法:
| 壓縮演算法 | 壓縮比 | 壓縮速度 | 解壓速度 |
|---|---|---|---|
| gzip | 13.4% | 17.5 MB/s | 58 MB/s |
| bzip2 | 13.2% | 2.4 MB/s | 9.5 MB/s |
| lzo | 20.5% | 49.3 MB/s | 74.6 MB/s |
| snappy | 22.2% | 59.3 MB/s | 74.0 MB/s |
- gzip 演算法
?? 特點:
???? hadoop 內置支持,支持native庫,使用方便,壓縮比高
???? 不支持 split,
???? 在壓縮后的檔案大小與 HDFS 塊大小差距不大時,可使用此演算法
??應用場景:
???? 一天或者一個小時的日志壓縮成一個 gzip 檔案,運行mapreduce程式的時候通過多個gzip檔案達到并發,
- bzip2 演算法
?? 特點:
???? hadoop 內置支持,支持 split,壓縮比很高,
???? 不支持 native 庫,壓縮/解壓速度慢
???? 對于歷史性很大的檔案,想盡可能節省磁盤空間,還要支持split
?? 應用場景:
???? mapreduce 的輸出,壓縮存檔,作為冷資料使用,通常是對大檔案的壓縮,
- lzo 演算法
?? 特點:
???? 支持 native 庫,壓縮/解壓速度也比較快,合理的壓縮率;支持 split (需要建索引,檔案修改后需要重新建索引),yum 安裝 lzop 命令后,使用方便
???? hadoop 內置不支持,需要手動編譯安裝,
???? 大檔案的存盤,作為熱資料使用
?? 應用場景:
???? 一個大檔案壓縮后依然是兩個或多個 HDFS 塊的大小,還不希望作為冷資料使用
- snappy 演算法
?? 特點:
???? 高速壓縮速度和合理的壓縮率,支持native庫
???? hadoop 內置不支持,需要手動編譯安裝,不支持 split,沒有 linux 命令可使用
?? 應用場景:
???? mapreduce 程序中 map 的輸出,reduce 或另一個 map 的輸入
22. Hadoop 的資源調度器有哪些
FIFO(先入先出調度器)
Hadoop 1.x 默認調度器
只有一個佇列,將一個一個 job 任務按照時間先后順序進行服務
Capacity Scheduler(容量調度器)
hadoop 2.x 默認調度器
支持多個佇列,每個佇列可以配置一定量的資源,每個采用 FIFO 的方式調度
防止同一個用戶的 job 任務獨占佇列中的資源,調度器會對同一用戶提交的 job 任務所占資源進行限制
分配新的 job 任務時,首先計算每個佇列中正在運行 task 個數與其佇列應該分配的資源量做比值,然后選擇最小的佇列
其次,按照 job 任務的優先級和時間順序,同時要考慮到用戶的資源量和記憶體的限制,對佇列中的 job 任務進行排序執行
多個佇列同時按照任務佇列內的先后順序一次執行,
Fair Scheduler(公平調度器)
支持多個佇列,每個佇列可以配置一定資源,每個佇列中的 job 任務公平共享器所在佇列的所有資源
佇列中的 job 任務都是按照優先級分配資源,優先級越高分配的資源越多,但是為了確保公平每個 job 任務都會分配到資源,游俠你是根據每個 job 任務的理想獲取資源量減去實際獲取資源量的差值決定的,差值越大優先級越高
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298321.html
標籤:其他
