Hadoop面試問題和回答2
[toc]
參考:徹底了解mapreduce核心Shuffle--解惑各種mapreduce問題
1 shuffle 是什么侦副? 怎么調(diào)優(yōu)?
shuffle將map的輸出作為reduce端的輸入液兽,包括map端的combine和partition,以及reduce端的copy和combine掌动;
其目的就是:完整地從map task端拉取數(shù)據(jù)到reduce 端四啰;在跨節(jié)點(diǎn)拉取數(shù)據(jù)時(shí),盡可能地減少對帶寬的不必要消耗粗恢,減少磁盤IO對task執(zhí)行的影響柑晒。
調(diào)優(yōu):
減少I/O操作和提高網(wǎng)絡(luò)傳輸效率
2 每個map task都有一個內(nèi)存緩沖區(qū),存儲著map的輸出結(jié)果眷射,當(dāng)緩沖區(qū)快滿的時(shí)候需要將緩沖區(qū)的數(shù)據(jù)該如何處理匙赞?
每個map task都有一個內(nèi)存緩沖區(qū),存儲著map的輸出結(jié)果妖碉,當(dāng)緩沖區(qū)快滿的時(shí)候罚屋,需要將緩沖區(qū)的數(shù)據(jù)以一個臨時(shí)文件的方式存放到磁盤,當(dāng)整個map task結(jié)束后再對磁盤中這個map task產(chǎn)生的所有臨時(shí)文件進(jìn)行合并嗅绸,生成最終的正式輸出文件脾猛,然后等待reduce task來拉數(shù)據(jù)。
3 MapReduce提供Partitioner接口鱼鸠,它的作用是什么猛拴?
根據(jù)key或value及reduce的數(shù)量來決定當(dāng)前的這對輸出數(shù)據(jù)最終應(yīng)該交由哪個reduce處理。默認(rèn)對key hash后再以reduce數(shù)量取模蚀狰。默認(rèn)的取模方式只是為了平均reduce的處理能力愉昆,防止數(shù)據(jù)傾斜;如果用戶自己對Partitioner有需求麻蹋,可以訂制并設(shè)置到j(luò)ob上跛溉。
4 溢寫是為什么不影響往緩沖區(qū)寫map結(jié)果的線程?
關(guān)鍵詞:閾值 啟動 鎖定 執(zhí)行
溢寫線程啟動時(shí)不應(yīng)該阻止map的結(jié)果輸出扮授,所以整個緩沖區(qū)有個溢寫的比例spill.percent芳室。這個比例默認(rèn)是0.8,也就是當(dāng)緩沖區(qū)的數(shù)據(jù)已經(jīng)達(dá)到閾值(buffer size * spill percent = 100MB * 0.8 = 80MB)刹勃,溢寫線程啟動堪侯,鎖定這80MB的內(nèi)存,執(zhí)行溢寫過程荔仁。Map task的輸出結(jié)果還可以往剩下的20MB內(nèi)存中寫伍宦,互不影響芽死。
5 當(dāng)溢寫線程啟動后,需要對這80MB空間內(nèi)的key做排序(Sort)次洼。排序是MapReduce模型默認(rèn)的行為关贵,這里的排序也是對誰的排序?
關(guān)鍵字:序列化字節(jié)
當(dāng)溢寫線程啟動后卖毁,需要對這80MB空間內(nèi)的key做排序(Sort)坪哄。排序是MapReduce模型默認(rèn)的行為,這里的排序也是對序列化的字節(jié)做的排序势篡。
6 溢寫過程中如果有很多個key/value對需要發(fā)送到某個reduce端去翩肌,那么如何處理這些key/value值?
關(guān)鍵字:拼接 減少索引
如果有很多個key/value對需要發(fā)送到某個reduce端去禁悠,那么需要將這些key/value值拼接到一塊念祭,減少與partition相關(guān)的索引記錄。
7 哪些場景才能使用Combiner呢碍侦?
關(guān)鍵字:類型一致 不影響 累加 最大值
Combiner的輸出是Reducer的輸入粱坤,Combiner絕不能改變最終的計(jì)算結(jié)果。所以從我的想法來看瓷产,Combiner只應(yīng)該用于那種Reduce的輸入key/value與輸出key/value類型完全一致站玄,且不影響最終結(jié)果的場景。比如累加濒旦,最大值等株旷。Combiner的使用一定得慎重,如果用好尔邓,它對job執(zhí)行效率有幫助晾剖,反之會影響reduce的最終結(jié)果。
8 Merge的作用是什么梯嗽?
關(guān)鍵字:歸并 溢寫文件 過程
最終磁盤中會至少有一個這樣的溢寫文件存在(如果map的輸出結(jié)果很少齿尽,當(dāng)map執(zhí)行完成時(shí),只會產(chǎn)生一個溢寫文件)灯节,因?yàn)樽罱K的文件只有一個循头,所以需要將這些溢寫文件歸并到一起,這個過程就叫做Merge
9 每個reduce task不斷的通過什么協(xié)議從JobTracker那里獲取map task是否完成的信息炎疆?
關(guān)鍵字:RPC
每個reduce任務(wù)不斷地通過RPC從JobTracker那里獲取map任務(wù)是否完成的信息卡骂。
10 reduce中Copy過程采用是什么協(xié)議?
關(guān)鍵字:拉取 fetcher http
Copy過程磷雇,簡單地拉取數(shù)據(jù)偿警。Reduce進(jìn)程啟動一些數(shù)據(jù)copy線程(Fetcher),通過HTTP方式請求map任務(wù)所在的TaskTracker獲取map任務(wù)的輸出文件唯笙。
11 reduce中merge過程有幾種方式螟蒸?
關(guān)鍵字:閾值 溢寫 merge 結(jié)束
merge有三種形式:
- 內(nèi)存到內(nèi)存
- 內(nèi)存到磁盤
- 磁盤到磁盤。
默認(rèn)情況下第一種形式不啟用崩掘,讓人比較困惑七嫌,是吧。當(dāng)內(nèi)存中的數(shù)據(jù)量到達(dá)一定閾值苞慢,就啟動內(nèi)存到磁盤的merge诵原。與map 端類似,這也是溢寫的過程挽放,這個過程中如果你設(shè)置有Combiner绍赛,也是會啟用的,然后在磁盤中生成了眾多的溢寫文件辑畦。第二種merge方式一直在運(yùn)行吗蚌,直到?jīng)]有map端的數(shù)據(jù)時(shí)才結(jié)束,然后啟動第三種磁盤到磁盤的merge方式生成最終的那個文件纯出。
12 Combiner 過程是 屬于map階段還是屬于reduce階段蚯妇?
關(guān)鍵字:聚合 排序 迭代 一個map 多個map
combiner最基本是實(shí)現(xiàn)本地key的聚合,對map輸出的key排序暂筝,value進(jìn)行迭代箩言。
combiner的目的是減少map網(wǎng)絡(luò)流量。
combiner的對象是對于map
combiner具有和reduce相似的功能焕襟,是一個Reducer的實(shí)現(xiàn)類陨收。只不過combiner合并對象,是對于一個map鸵赖。reduce合并對象畏吓,是對于多個map。
13 map和reduce的數(shù)量怎么設(shè)定卫漫?
map的數(shù)量:
通常是由hadoop集群的DFS塊大小確定的菲饼,也就是輸入文件的總塊數(shù),正常的map數(shù)量的并行規(guī)模大致是每一個Node是10~100個列赎。通過conf.setNumMapTasks(int num)
設(shè)置宏悦;
reduce的數(shù)量:
正確的reduce任務(wù)的個數(shù)應(yīng)該是0.95或者1.75 *(節(jié)點(diǎn)數(shù) ×mapred.tasktracker.tasks.maximum參數(shù)值)。如果任務(wù)數(shù)是節(jié)點(diǎn)個數(shù)的0.95倍包吝,那么所有的reduce任務(wù)能夠在 map任務(wù)的輸出傳輸結(jié)束后同時(shí)開始運(yùn)行饼煞。如果任務(wù)數(shù)是節(jié)點(diǎn)個數(shù)的1.75倍,那么高速的節(jié)點(diǎn)會在完成他們第一批reduce任務(wù)計(jì)算之后開始計(jì)算第二批 reduce任務(wù)诗越,這樣的情況更有利于負(fù)載均衡砖瞧。通過conf.setNumReduceTasks(int num)
設(shè)置。
參考:hadoop中map和reduce的數(shù)量設(shè)置問題
Boy-20180330-15:20