大數據面試之Hadoop


說明,感謝亮哥長期對我的幫助,此處多篇文章均爲亮哥帶我整理。以及參考諸多博主的文章。如果侵權,請及時指出,我會立馬停止該行爲;如有不足之處,還請大佬不吝指教,以期共同進步。

1.Hadoop

1.1 架構模型

1.1.1 1.x的版本架構模型

文件系統核心模塊:
    NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據
    secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理
    DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據

數據計算核心模塊:
    JobTracker:接收用戶的計算請求任務,並分配任務給從節點
    TaskTracker:負責執行主節點JobTracker分配的任務

1.1.2 2.x的版本架構模型

第一種:NameNode與ResourceManager單節點架構模型

文件系統核心模塊:
    NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據
    secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理
    DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據

數據計算核心模塊:
    ResourceManager:接收用戶的計算請求任務,並負責集羣的資源分配
    NodeManager:負責執行主節點APPmaster分配的任務

第二種:NameNode單節點與ResourceManager高可用架構模型

文件系統核心模塊:
    NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據
    secondaryNameNode:主要能用於hadoop當中元數據信息的輔助管理
    DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據

數據計算核心模塊:
    ResourceManager:接收用戶的計算請求任務,並負責集羣的資源分配,以及計算任務的劃分,
        通過zookeeper實現ResourceManager的高可用
    NodeManager:負責執行主節點ResourceManager分配的任務

第三種:NameNode高可用與ResourceManager單節點架構模型

文件系統核心模塊:
    NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據,其中nameNode可以有兩個,形成高可用狀態
    DataNode:集羣當中的從節點,主要用於存儲集羣當中的各種數據
    JournalNode:文件系統元數據信息管理
    
數據計算核心模塊:
    ResourceManager:接收用戶的計算請求任務,並負責集羣的資源分配,以及計算任務的劃分
    NodeManager:負責執行主節點ResourceManager分配的任務

第四種:NameNode與ResourceManager高可用架構模型

文件系統核心模塊:
    NameNode:集羣當中的主節點,主要用於管理集羣當中的各種數據,一般都是使用兩個,實現HA高可用
    JournalNode:元數據信息管理進程,一般都是奇數個
    DataNode:從節點,用於數據的存儲

數據計算核心模塊:
    ResourceManager:Yarn平臺的主節點,主要用於接收各種任務,通過兩個,構建成高可用
    NodeManager:Yarn平臺的從節點,主要用於處理ResourceManager分配的任務

參考

1.2 有哪些角色?每個角色的功能?

1.namenode:
    接收客戶端的讀寫請求
    存儲元數據信息
    接收datanode的心跳報告
    負載均衡
    分配數據塊的存儲節點

2.datanode:
    真正處理客戶端的讀寫請求
    向namenode發送心跳
    向namenode發送塊報告
    真正的數據存儲
    副本之間的相互複製

3.secondarynamenode:
    備份元數據信息
    幫助namenode進行元數據合併  減輕namenode的壓力

4.客戶端
    進行數據塊的物理切分
    向namenode發送讀寫請求
    向namenode發送讀寫響應

參考

1.3 Hadoop的shuffle過程

1.Map端的shuffle
    Map端會處理輸入數據併產生中間結果,這個中間結果會寫到本地磁盤,而不是HDFS。
    每個Map的輸出會先寫到內存緩衝區中,當寫入的數據達到設定的閾值時,系統將會啓動一個線程將緩衝區的數據寫到磁盤,
    這個過程叫做spill(溢寫,默認Buffer大小爲100M,達到80%時會溢寫)。
    
    在spill寫入之前,會先進行二次排序,首先根據數據所屬的partition進行排序,然後每個partition中的數據再按key來排序。
    partition的目是將記錄劃分到不同的Reducer上去,以期望能夠達到負載均衡。
    接着運行combiner(如果設置了的話),combiner的本質也是一個Reducer,
    其目的是對將要寫入到磁盤上的文件先進行一次處理
    
    最後,每個Map任務可能產生多個spill文件,在每個Map任務完成前,
    會通過多路歸併算法將這些spill文件歸併成一個文件。至此,Map的shuffle過程就結束了。
    
2.Reduce端的shuffle
    Reduce端的shuffle主要包括三個階段,copy、sort(merge)和reduce。
    
    首先要將Map端產生的輸出文件拷貝到Reduce端
    接下來就是sort階段,也成爲merge階段,因爲這個階段的主要工作是執行了歸併排序。
    最後就是Reduce過程了,在這個過程中產生了最終的輸出結果,並將其寫到HDFS上。

參考

1.4 Hadoop調優

一、調優的目的
	充分的利用機器的性能,更快的完成mr程序的計算任務。甚至是在有限的機器條件下,能夠支持運行足夠多的mr程序。
二、調優的總體概述
	從mr程序的內部運行機制,我們可以瞭解到一個mr程序由mapper和reducer兩個階段組成,
	其中mapper階段包括數據的讀取、map處理以及寫出操作(排序和合並/sort&merge),
	而reducer階段包含mapper輸出數據的獲取、數據合併(sort&merge)、reduce處理以及寫出操作。
	那麼在這七個子階段中,能夠進行較大力度的進行調優的就是map輸出、reducer數據合併以及reducer個數這三個方面的調優操作。
	也就是說雖然性能調優包括cpu、內存、磁盤io以及網絡這四個大方面,但是從mr程序的執行流程中,
	我們可以知道主要有調優的是內存、磁盤io以及網絡。在mr程序中調優,主要考慮的就是減少網絡傳輸和減少磁盤IO操作,
	故本次課程的mr調優主要包括服務器調優、代碼調優、mapper調優、reducer調優以及runner調優這五個方面。
三、服務器調優
	服務器調優主要包括服務器參數調優和jvm調優。在本次項目中,由於我們使用hbase作爲我們分析數據
	的原始數據存儲表,
	所以對於hbase我們也需要進行一些調優操作。除了參數調優之外,
	和其他一般的java程序一樣,還需要進行一些jvm調優。

	hdfs調優
	1. dfs.datanode.failed.volumes.tolerated: 允許發生磁盤錯誤的磁盤數量,默認爲0,表示不允許datanode發生磁盤異常。
	當掛載多個磁盤的時候,可以修改該值。
	2. dfs.replication: 複製因子,默認3
	3. dfs.namenode.handler.count: namenode節點併發線程量,默認10
	4. dfs.datanode.handler.count:datanode之間的併發線程量,默認10。
	5. dfs.datanode.max.transfer.threads:datanode提供的數據流操作的併發線程量,默認4096。
		一般將其設置爲linux系統的文件句柄數的85%~90%之間,查看文件句柄數語句ulimit -a,修改vim /etc/security/limits.conf, 
		不能設置太大
		文件末尾,添加
			* soft nofile 65535
			* hard nofile 65535
			注意:句柄數不能夠太大,可以設置爲1000000以下的所有數值,一般不設置爲-1。
			異常處理:當設置句柄數較大的時候,重新登錄可能出現unable load session的提示信息,這個時候採用單用戶模式進行修改操作即可。
				單用戶模式:
					啓動的時候按'a'鍵,進入選擇界面,然後按'e'鍵進入kernel修改界面,然後選擇第二行'kernel...',按'e'鍵進行修改,
					在最後添加空格+single即可,按回車鍵回到修改界面,最後按'b'鍵進行單用戶模式啓動,當啓動成功後,
					還原文件後保存,最後退出(exit)重啓系統即可。
	6. io.file.buffer.size: 讀取/寫出數據的buffer大小,默認4096,一般不用設置,推薦設置爲4096的整數倍(物理頁面的整數倍大小)。

	hbase調優
	1. 設置regionserver的內存大小,默認爲1g,推薦設置爲4g。
		修改conf/hbase-env.sh中的HBASE_HEAPSIZE=4g
	2. hbase.regionserver.handler.count: 修改客戶端併發線程數,默認爲10。設置規則爲,當put和scans操作比較的多的時候,將其設置爲比較小的值;
	當get和delete操作比較多的時候,將其設置爲比較大的值。原因是防止頻繁GC操作導致內存異常。
	3. 自定義hbase的分割和緊縮操作,默認情況下hbase的分割機制是當region大小達到hbase.hregion.max.filesize(10g)的時候進行自動分割,
	推薦每個regionserver的region個數在20~500個爲最佳。hbase的緊縮機制是hbase的一個非常重要的管理機制,
	hbase的緊縮操作是非常消耗內存和cpu的,所以一般機器壓力比較大的話,推薦將其關閉,改爲手動控制。
	4. hbase.balancer.period: 設置hbase的負載均衡時間,默認爲300000(5分鐘),在負載比較高的集羣上,將其值可以適當的改大。
	5. hfile.block.cache.size:修改hflie文件塊在內存的佔比,默認0.4。在讀應用比較多的系統中,可以適當的增大該值,
	在寫應用比較多的系統中,可以適當的減少該值,不過不推薦修改爲0。
	6. hbase.regionserver.global.memstore.upperLimit:修改memstore的內存佔用比率上限,默認0.4,當達到該值的時候,會進行flush操作將內容寫的磁盤中。
	7. hbase.regionserver.global.memstore.lowerLimit: 修改memstore的內存佔用比率下限,默認0.38,進行flush操作後,memstore佔用的內存比率必須不大於該值。
	8. hbase.hregion.memstore.flush.size: 當memstore的值大於該值的時候,進行flush操作。默認134217728(128M)。
	9. hbase.hregion.memstore.block.multiplier: 修改memstore阻塞塊大小比率值,默認爲4。也就是說在memstore的大小超過4*hbase.hregion.memstore.flush.size
	的時候就會觸發寫阻塞操作。最終可能會導致出現oom異常。
	
	mapreduce調優
	1. mapreduce.task.io.sort.factor: mr程序進行合併排序的時候,打開的文件數量,默認爲10個.
	2. mapreduce.task.io.sort.mb: mr程序進行合併排序操作的時候或者mapper寫數據的時候,內存大小,默認100M
	3. mapreduce.map.sort.spill.percent: mr程序進行flush操作的閥值,默認0.80。
	4. mapreduce.reduce.shuffle.parallelcopies:mr程序reducer copy數據的線程數,默認5。
	5. mapreduce.reduce.shuffle.input.buffer.percent: reduce複製map數據的時候指定的內存堆大小百分比,默認爲0.70,適當的增加該值可以減少map數據的磁盤溢出,能夠提高系統性能。
	6. mapreduce.reduce.shuffle.merge.percent:reduce進行shuffle的時候,用於啓動合併輸出和磁盤溢寫的過程的閥值,默認爲0.66。
	如果允許,適當增大其比例能夠減少磁盤溢寫次數,提高系統性能。同mapreduce.reduce.shuffle.input.buffer.percent一起使用。
	7. mapreduce.task.timeout:mr程序的task執行情況彙報過期時間,默認600000(10分鐘),設置爲0表示不進行該值的判斷。
	
四、代碼調優
	代碼調優,主要是mapper和reducer中,針對多次創建的對象,進行代碼提出操作。這個和一般的java程序的代碼調優一樣。
五、mapper調優
	mapper調優主要就是就一個目標:減少輸出量。我們可以通過增加combine階段以及對輸出進行壓縮設置進行mapper調優。
	combine介紹:
		實現自定義combine要求繼承reducer類,特點:
		以map的輸出key/value鍵值對作爲輸入輸出鍵值對,作用是減少網絡輸出,在map節點上就合併一部分數據。
		比較適合,map的輸出是數值型的,方便進行統計。
	壓縮設置:
		在提交job的時候分別設置啓動壓縮和指定壓縮方式。
六、reducer調優
	reducer調優主要是通過參數調優和設置reducer的個數來完成。
	reducer個數調優:
		要求:一個reducer和多個reducer的執行結果一致,不能因爲多個reducer導致執行結果異常。
		規則:一般要求在hadoop集羣中的執行mr程序,map執行完成100%後,儘量早的看到reducer執行到33%,可以通過命令hadoop job -status job_id或者web頁面來查看。
			原因: map的執行process數是通過inputformat返回recordread來定義的;而reducer是有三部分構成的,
			分別爲讀取mapper輸出數據、合併所有輸出數據以及reduce處理,其中第一步要依賴map的執行,所以在數據量比較大的情況下,
			一個reducer無法滿足性能要求的情況下,我們可以通過調高reducer的個數來解決該問題。
		優點:充分利用集羣的優勢。
		缺點:有些mr程序沒法利用多reducer的優點,比如獲取top n的mr程序。
七、runner調優
	runner調優其實就是在提交job的時候設置job參數,一般都可以通過代碼和xml文件兩種方式進行設置。

	1. mapred.child.java.opts: 修改childyard進程執行的jvm參數,針對map和reducer均有效,默認:-Xmx200m
	2. mapreduce.map.java.opts: 需改map階段的childyard進程執行jvm參數,默認爲空,當爲空的時候,使用mapred.child.java.opts。
	3. mapreduce.reduce.java.opts:修改reducer階段的childyard進程執行jvm參數,默認爲空,當爲空的時候,使用mapred.child.java.opts。
	4. mapreduce.job.reduces: 修改reducer的個數,默認爲1。可以通過job.setNumReduceTasks方法來進行更改。
	5. mapreduce.map.speculative:是否啓動map階段的推測執行,默認爲true。其實一般情況設置爲false比較好。
	可通過方法job.setMapSpeculativeExecution來設置。
	6. mapreduce.reduce.speculative:是否需要啓動reduce階段的推測執行,默認爲true,其實一般情況設置爲fase比較好。
	可通過方法job.setReduceSpeculativeExecution來設置。
	7. mapreduce.map.output.compress:設置是否啓動map輸出的壓縮機制,默認爲false。在需要減少網絡傳輸的時候,可以設置爲true。
	8. mapreduce.map.output.compress.codec:設置map輸出壓縮機制,默認爲org.apache.hadoop.io.compress.DefaultCodec,
	推薦使用SnappyCodec(在之前版本中需要進行安裝操作,現在版本不太清楚,安裝參數:http://www.cnblogs.com/chengxin1982/p/3862309.html)
	9. hbase參數設置
		由於hbase默認是一條一條數據拿取的,在mapper節點上執行的時候是每處理一條數據後就從hbase中獲取下一條數據,
		通過設置cache值可以一次獲取多條數據,減少網絡數據傳輸。

1.5 combiner和partition的作用

combiner的意義就是對每一個maptask的輸出進行局部彙總,以減小網絡傳輸量

partition的默認實現是hashpartition,是map端將數據按照reduce個數取餘,進行分區,不同的reduce來copy自己的數據。

partition的作用是將數據分到不同的reduce進行計算,加快計算效果。

參考

1.6 Hadoop 3.X 新特性

(1) Java最低版本要求從Java7更改成Java8
(2) HDFS支持糾刪碼(Erasure Coding)
(3) 引入YARN的時間軸服務v.2(YARN Timeline Service v.2)
(4) 重寫了shell腳本
(5) 隱藏底層jar包(shaded client jars)
(6) 支持containers和分佈式調度
(7) MapReduce任務級本地優化
(8) 支持多於兩個的NameNodes
(9) 改變了多個服務的默認端口(例如:HDFS的web界面,端口由50070變成9870)
(10) 支持Microsoft Azure Data Lake文件系統
(11) Intra-datanode(用Intra解決DataNode宕機負載不均衡的問題)
(12) 重寫守護進程以及任務的堆內存管理
(13) 使用S3Guard進行AMAZON S3一致性(解決客戶端同時進行查詢、上傳操作時,數據元和顯示給客戶端的數據不一致問題)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章