Hadoop面試問題和回答
[toc]
1:什么是Hadoop?
答:是google的核心算法MapReduce的一個開源實現(xiàn)。用于海量數(shù)據(jù)的并行處理。hadoop的核心主要包含:HDFS和MapReduce:
HDFS:是分布式文件系統(tǒng),用于分布式存儲海量數(shù)據(jù)。
MapReduce:是分布式數(shù)據(jù)處理模型,本質(zhì)是并行處理。
2:用Hadoop來做什么的?
答:分布式的海量存儲、大規(guī)模的日志分析、離線的數(shù)據(jù)處理,結(jié)合云計算,可以進(jìn)行數(shù)據(jù)挖掘等
3:什么是MapReduce?
答:是一種分布式的處理數(shù)據(jù)的計算模型,采用分而治之的思想,把處理過程高度抽象為兩個函數(shù):map()函數(shù)和reduce函數(shù),map函數(shù)將任務(wù)分解成多個任務(wù),reduce負(fù)責(zé)把分解后的多個任務(wù)結(jié)果匯總起來。
詳情
MapReduce借用了函數(shù)式編程的概念,是一種用分布式來處理數(shù)據(jù)的計算模型。
MapReduce采用"分而治之"的思想,把對大規(guī)模數(shù)據(jù)集的操作,分發(fā)給一個主節(jié)點管理下的各個分節(jié)點共同完成,然后通過整合各個節(jié)點的中間結(jié)果,得到最終結(jié)果。簡單地說,MapReduce就是"任務(wù)的分解與結(jié)果的匯總"。
在分布式計算中,MapReduce框架負(fù)責(zé)處理了并行編程中分布式存儲、工作調(diào)度、負(fù)載均衡、容錯均衡、容錯處理以及網(wǎng)絡(luò)通信等復(fù)雜問題,把處理過程高度抽象為兩個函數(shù):map和reduce,map負(fù)責(zé)把任務(wù)分解成多個任務(wù),reduce負(fù)責(zé)把分解后多任務(wù)處理的結(jié)果匯總起來。
4 Hadoop中,用于執(zhí)行MapReduce任務(wù)的機(jī)器角色有兩個?
一共有兩個,分別是JobTracker和TaskTracker:
JobTracker:用于作業(yè)調(diào)度的,一個Hadoop集群中只有一個JobTracker,位于master
TaskTracker:用于作業(yè)執(zhí)行,位于各slave上。
5 MapReduce提交作業(yè)的流程?
備注:要會畫圖

1 客戶端編寫好MapReduce程序,提交作業(yè)給JobTracker;
2 JobTracker構(gòu)建job,分配作業(yè)ID;
3 檢查作業(yè)的輸出和輸入目錄,沒有問題則對作業(yè)輸入分片的進(jìn)行計算;
4 配置資源,初始化作業(yè),放入內(nèi)部作業(yè)隊列中;
5 初始化完畢后,作業(yè)調(diào)度器獲取輸入分片信息,創(chuàng)建對應(yīng)map任務(wù);
6 通過心跳機(jī)制獲得可用的tasktracker,對其分配任務(wù);
7 執(zhí)行任務(wù),同時jobtracker通過心跳機(jī)制進(jìn)行監(jiān)控,任務(wù)完成,則返回給jobtracker;
8 client去查詢jobtracker,如果任務(wù)執(zhí)行成功,則任務(wù)執(zhí)行結(jié)束,否則再次提交作業(yè)。
詳細(xì)提交作業(yè)流程看:
MapReduce工作機(jī)制
hadoop 學(xué)習(xí)筆記:mapreduce框架詳解
6 MapReduce的計算過程?
分三部分:map shuffer reduce
要回畫圖

map
1)分片(split):FileInputFormat會將輸入文件分割成多個split(等于block,*考點);
2)執(zhí)行map:對分片的鍵值對進(jìn)行map()運算,輸出鍵值對到環(huán)形緩沖區(qū)中(考點);此處要進(jìn)行partition
3)溢寫spill:環(huán)形緩沖區(qū)達(dá)到閾值,啟動溢寫線程,將緩沖區(qū)的數(shù)據(jù)寫入磁盤;
4)合并merge:溢寫會產(chǎn)生多個文件,再寫入磁盤前會進(jìn)行排序(sort)和合并(combiner:對相同的key進(jìn)行合并操作,提高帶寬,考點)
備注:再進(jìn)行合并時,會有partition操作,用來生成reduce的輸入分片,對應(yīng)于具體的reduce,類似于map階段的輸入分片,
shuffer
1)copy過程:Reduce端啟動copy線程,通過Http方式,將map端輸出的有序文件、屬于自己的部分拉取到本地;
2)merge過程:copy數(shù)據(jù)先放在內(nèi)存緩沖區(qū),達(dá)到閾值時,溢寫入磁盤,產(chǎn)生的多個小文件會合并成一個有序的最終文件,這個過程不斷執(zhí)行sort和combine。
reduce
1)將shuffer階段最終生成的有序文件作為reduce的輸入,對每個鍵值調(diào)用reduce()方法,并將結(jié)果寫入HDFS中。
7 Hadoop分塊和分片?
分塊:
為了便于文件的管理和備份,HDFS使用塊作為存儲系統(tǒng)當(dāng)中的最小單位,默認(rèn)一個塊的大小為64MB;
當(dāng)有文件上傳到HDFS上時,若文件大小大于設(shè)置的塊太大,則該文件會被切分存儲為多個塊,多個塊可以存放在不同的DataNode上,整個過程中 HDFS系統(tǒng)會保證一個塊存儲在一個datanode上 。
分片:
Hadoop會將MapReduce的輸入數(shù)據(jù)劃分為等長的小數(shù)據(jù)塊,稱為分片;
默認(rèn)情況下,以HDFS的一個塊的大小做為一個分片,即分片大小等于分塊大小;
8 為什么默認(rèn)分片大小與分塊大小要相同呢?
太大,會導(dǎo)致map讀取的數(shù)據(jù)可能跨越不同的節(jié)點,沒有了數(shù)據(jù)本地化的優(yōu)勢
太小,會導(dǎo)致map數(shù)量過多,任務(wù)啟動和切換開銷太大,并行度過高
9 什么是map任務(wù)的數(shù)據(jù)本地化呢?
數(shù)據(jù)本地優(yōu)化是指map任務(wù)中處理的數(shù)據(jù)存儲在各個運行map本身的節(jié)點上,不需要跨界點消耗網(wǎng)絡(luò)帶寬進(jìn)行數(shù)據(jù)傳輸,這能夠使得作業(yè)以最好的狀態(tài)運行。
10 環(huán)形緩沖區(qū)的機(jī)制?
Map過程中環(huán)形緩沖區(qū)是指:數(shù)據(jù)被map處理之后會先放入內(nèi)存,內(nèi)存中的這片區(qū)域就是環(huán)形緩沖區(qū)。
使用環(huán)形數(shù)據(jù)結(jié)構(gòu)是為了有效使用內(nèi)存空間,其數(shù)據(jù)結(jié)構(gòu)是一個字節(jié)數(shù)組(KVBuffer:數(shù)據(jù)區(qū)域 索引數(shù)據(jù)區(qū)域)
具體的執(zhí)行機(jī)制:
MapReduce源碼解析--環(huán)形緩沖區(qū)
正確理解hadoop 2.x 的環(huán)形緩沖區(qū): (一) MR環(huán)形緩沖區(qū)的結(jié)構(gòu)
11 combine、partition和shuffer的區(qū)別?
combine:
把同一個key的鍵值對合并在一起,combine函數(shù)把一個map函數(shù)產(chǎn)生的<key,value>對(多個key,value)合并成一個新的<key2,value2>,將新的<key2,value2>作為輸入到reduce函數(shù)中,這個value2亦可稱之為values,因為有多個。這個合并的目的是為了減少網(wǎng)絡(luò)傳輸。
partition:
partition是分割map每個節(jié)點的結(jié)果,按照key分別映射給不同的reduce,也是可以自定義的。這里其實可以理解歸類。
partition的作用就是把這些數(shù)據(jù)歸類,主要在Shuffle過程中按照Key值將中間結(jié)果分成R份,其中每份都有一個Reduce去負(fù)責(zé),可以通過job.setPartitionerClass()方法進(jìn)行設(shè)置,默認(rèn)的使用hashPartitioner類。
Partitioner:對map()的輸出進(jìn)行partition,即根據(jù)key或value及reduce的數(shù)量來決定當(dāng)前的這對鍵值對最終應(yīng)該交由哪個reduce處理。默認(rèn)是對key哈希后再以reduce task數(shù)量取模,默認(rèn)的取模方式只是為了避免數(shù)據(jù)傾斜。然后該key/value對以及partitionIdx的結(jié)果都會被寫入環(huán)形緩沖區(qū)。
shuffle:
shuffle就是map和reduce之間的過程,包含了兩端的combine和partition。它比較難以理解,因為我們摸不著,看不到它,它只是理論存在的,而且確實存在,它屬于mapreduce的框架。將map端的輸入作為reduce的輸出。
12 如何優(yōu)化網(wǎng)絡(luò)傳輸?
1)在分片時,調(diào)整分片大小和block塊大小相同,不讓分片跨界點存放,防止map時跨節(jié)點讀取數(shù)據(jù)
2)在溢寫時,對小文件進(jìn)行合并,減少冗余文件,提高傳輸效率;其次使用combiner,將key相同的鍵值合并。
3)在shuffle的copy拉去數(shù)據(jù)時,需要網(wǎng)絡(luò)傳輸,默認(rèn)reduce端會并行從5個map端下載數(shù)據(jù),可以調(diào)整這個并行默認(rèn)參數(shù)。與此同時,加大下載等待時間,防止網(wǎng)絡(luò)延遲過大或太慢,導(dǎo)致下載線程誤判為失敗。
4)使用壓縮對數(shù)據(jù)進(jìn)行傳輸。
13 Hadoop中為什么要使用數(shù)據(jù)壓縮?
優(yōu)點:
1,減少存儲磁盤空間,降低單節(jié)點的磁盤IO。
2,加快網(wǎng)絡(luò)傳輸?shù)男省?br>
缺點:
需要花費額外的時間/CPU做壓縮和解壓縮計算
應(yīng)用場景:
1,數(shù)據(jù)更多的是被存儲,而不是被處理。例如使用HDFS作為數(shù)據(jù)存儲,且上層搭建了Hive數(shù)據(jù)倉庫。
2,數(shù)據(jù)本身有不錯的壓縮率。
參考:Hadoop數(shù)據(jù)壓縮
14 Hadoop中的數(shù)據(jù)壓縮有哪幾種呢?
輸入文件壓縮:減少了I/O操作,但加大了cpu的處理時間;
壓縮map程序中間輸出:壓縮這類輸出可減少文件從map程序中寫入到本地磁盤的文件I/O,也可以減少分區(qū)從Mapper節(jié)點傳輸?shù)絉educer節(jié)點的網(wǎng)絡(luò)I/O。;
壓縮MapReduce程序的輸出:對map和reduce的輸出進(jìn)行壓縮;
壓縮方式:
根據(jù):壓縮大小 壓縮速度 是否可分割 冷熱數(shù)據(jù)

Snappy壓縮方式比GZIP方式快幾個數(shù)量級,然而輸出文件更大,大出20%-100%
Hadoop壓縮方式
Boy-20180330-10:30 第一部分結(jié)束