面試題二:請簡述Hadoop常用的配置文件及Hadoop集群搭建過程
1、配置文件:
Hadoop2.x的配置文件有core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves
Hadoop3.x的配置文件有core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、workers
2、簡單的集群搭建過程:
JDK安裝
配置SSH免密登錄
配置hadoop核心文件
格式化namenode
面試題四:HDFS對於小文件的處理有哪些需要注意的地方?
(1)存儲層面:
1個文件塊,佔用namenode多大內存150位元組
1億個小文件*150位元組
1個文件塊 * 150位元組
128G能存儲多少文件塊? 128 * 1024*1024*1024byte/150位元組 = 9億文件塊
(2)計算層面:
每個小文件都會起到一個MapTask,佔用了大量計算資源
(1)採用har歸檔方式,將小文件歸檔
(2)採用CombineTextInputFormat
(3)有小文件場景開啟JVM重用;如果沒有小文件,不要開啟JVM重用,因為會一直佔用使用到的task卡槽,直到任務完成才釋放。
JVM重用可以使得JVM實例在同一個job中重新使用N次,N的值可以在Hadoop的mapred-site.xml文件中進行配置。通常在10-20之間
<property> <name>mapreduce.job.jvm.numtasks</name> <value>10</value> <description>How many tasks to runper jvm,if set to -1 ,there is nolimit</description></property>面試題五:描述Shuffle的過程,並說明如何進行優化。
優化從四個方面考慮,分別是Map階段、Reduce階段、IO傳輸和整體考慮。
1、Map階段
2、Reduce階段
合理設置Map和Reduce數:兩個都不能設置太少,也不能設置太多。太少,會導致Task等待,延長處理時間;太多,會導致 Map、Reduce任務間競爭資源,造成處理超時等錯誤。
設置Map、Reduce共存:調整slowstart.completedmaps參數,使Map運行到一定程度後,Reduce也開始運行,減少Reduce的等待時間。
規避使用Reduce,因為Reduce在用於連接數據集的時候將會產生大量的網絡消耗。
增加每個Reduce去Map中拿數據的並行數
集群性能可以的前提下,增大Reduce端存儲數據內存的大小。
3、IO傳輸
採用數據壓縮的方式,減少網絡IO的的時間。安裝Snappy和LZOP壓縮編碼器。
壓縮:
map輸入端主要考慮數據量大小和切片,支持切片的有Bzip2、LZO。注意:LZO要想支持切片必須創建索引;
map輸出端主要考慮速度,速度快的snappy、LZO;
reduce輸出端主要看具體需求,例如作為下一個mr輸入需要考慮切片,永久保存考慮壓縮率比較大的gzip。
4、整體
NodeManager默認內存8G,需要根據伺服器實際配置靈活調整,例如128G內存,配置為100G內存左右,yarn.nodemanager.resource.memory-mb。
單任務默認內存8G,需要根據該任務的數據量靈活調整,例如128m數據,配置1G內存,yarn.scheduler.maximum-allocation-mb。
mapreduce.map.memory.mb:控制分配給MapTask內存上限,如果超過會kill掉進程(報:Container is running beyond physical memorylimits. Current usage:565MB of512MB physical memory used;Killing Container)。默認內存大小為1G,如果數據量是128m,正常不需要調整內存;如果數據量大於128m,可以增加MapTask內存,最大可以增加到4-5g。
mapreduce.reduce.memory.mb:控制分配給ReduceTask內存上限。默認內存大小為1G,如果數據量是128m,正常不需要調整內存;如果數據量大於128m,可以增加ReduceTask內存大小為4-5g。
mapreduce.map.java.opts:控制MapTask堆內存大小。(如果內存不夠,報:java.lang.OutOfMemoryError)
mapreduce.reduce.java.opts:控制ReduceTask堆內存大小。(如果內存不夠,報:java.lang.OutOfMemoryError)
可以增加MapTask的CPU核數,增加ReduceTask的CPU核數
增加每個Container的CPU核數和內存大小
在hdfs-site.xml文件中配置多目錄(多磁碟)
NameNode有一個工作線程池,用來處理不同DataNode的並發心跳以及客戶端並發的元數據操作。
,比如集群規模為8臺時,此參數設置為41。可通過簡單的python代碼計算該值,代碼如下。
[atguigu@hadoop102 ~]$ pythonPython 2.7.5 (default,Apr 11 2018, 07:36:10)[GCC 4.8.5 20150623(Red Hat 4.8.5-28)] on linux2Type "help","copyright", "credits" or "license" for moreinformation.>>> import math>>> printint(20*math.log(8))41>>> quit()1、Hadoop調度器重要分為三類:
FIFO 、Capacity Scheduler(容量調度器)和Fair Sceduler(公平調度器)。
Apache默認的資源調度器是容量調度器;
CDH默認的資源調度器是公平調度器。
2、主要區別:
FIFO調度器:支持單隊列、先進先出 生產環境不會用。
容量調度器:支持多隊列,保證先進入的任務優先執行。
公平調度器:支持多隊列,保證每個任務公平享有隊列資源。資源不夠時可以按照缺額分配。
3、在生產環境下怎麼選擇?
大廠:如果對並發度要求比較高,選擇公平,要求伺服器性能必須OK;
中小公司,集群伺服器資源不太充裕選擇容量。
4、在生產環境怎麼創建隊列?
調度器默認就1個default隊列,不能滿足生產要求。
按照框架:hive /spark/ flink 每個框架的任務放入指定的隊列(企業用的不是特別多)
按照業務模塊:登錄註冊、購物車、下單、業務部門1、業務部門2
5、 創建多隊列的好處?
搭建完Hadoop集群後需要對HDFS讀寫性能和MR計算能力測試。測試jar包在hadoop的share文件夾下。
集群總吞吐量= 帶寬*集群節點個數/副本數
例如:100m/s * 10臺/ 3= 333m/s
注意:如果測試數據在本地,那副本數-1。因為這個副本不佔集群吞吐量。如果數據在集群外,向該集群上傳,需要佔用帶寬。本公式就不用減1。
1、如果MR造成系統宕機。此時要控制Yarn同時運行的任務數,和每個任務申請的最大內存。調整參數:yarn.scheduler.maximum-allocation-mb(單個任務可申請的最多物理內存量,默認是8192MB)2、如果寫入文件過快造成NameNode宕機。那麼調高Kafka的存儲大小,控制從Kafka到HDFS的寫入速度。例如,可以調整Flume每批次拉取數據量的大小參數batchsize。
1、提前在map進行combine,減少傳輸的數據量
在Mapper加上combiner相當於提前進行reduce,即把一個Mapper中的相同key進行了聚合,減少shuffle過程中傳輸的數據量,以及Reducer端的計算量。
如果導致數據傾斜的key大量分布在不同的mapper的時候,這種方法就不是很有效了。
2、導致數據傾斜的key 大量分布在不同的mapper
(1)局部聚合加全局聚合。
第一次在map階段對那些導致了數據傾斜的key 加上1到n的隨機前綴,這樣本來相同的key 也會被分到多個Reducer中進行局部聚合,數量就會大大降低。
第二次mapreduce,去掉key的隨機前綴,進行全局聚合。
思想:二次mr,第一次將key隨機散列到不同reducer進行處理達到負載均衡目的。第二次再根據去掉key的隨機前綴,按原key進行reduce處理。
這個方法進行兩次mapreduce,性能稍差。
(2)增加Reducer,提升並行度
JobConf.setNumReduceTasks(int)(3)實現自定義分區
根據數據分布情況,自定義散列函數,將key均勻分配到不同Reducer。
關注公眾號,回復關鍵字「Hadoop」,還能獲取全部資料,不要錯過!微信號|bigdata_story
B站|大數據那些事
想獲取更多更全資料
掃碼加好友入群
歡迎各位大佬加入開源共享
共同面對大數據領域疑難問題
來稿請投郵箱:miaochuanhai@126.com