快樂大數(shù)據(jù)第四課 Mapreduce的優(yōu)化
1.Shuffle的過程
(1)每個Mag Task把輸出結(jié)果寫到內(nèi)存中的環(huán)形緩沖區(qū)湃望;當(dāng)內(nèi)存環(huán)形緩沖區(qū)寫入的數(shù)據(jù)量達(dá)到一定
閾值時收奔,后臺線程會把數(shù)據(jù)溢出寫到磁盤(根據(jù)分區(qū)號(數(shù)據(jù)的哈希值/reduce task的ID的余數(shù)),把數(shù)據(jù)寫入不同的分區(qū)撒会,對每個分區(qū)上的數(shù)據(jù)進(jìn)行排序)毫目。
(2)隨著Map Task的不斷進(jìn)行蔬啡,磁盤上的溢出文件會越來越多。在Shuffle過程中镀虐,Aplication Master會將這些溢出
文件合并箱蟆,對于一個分區(qū)下的不同分片,使用歸并排序刮便,同一分區(qū)內(nèi)數(shù)據(jù)進(jìn)行有序排序空猜。
(3)Reduce Task通過網(wǎng)絡(luò)遠(yuǎn)程拷貝mapTask的結(jié)果中屬于它的分區(qū)文件。合并所有已經(jīng)拷貝過的數(shù)據(jù)文件诺核,使用歸并排序算法抄肖,將相同key的數(shù)據(jù)歸為一組久信,不同key之間有序排列窖杀。最終生成一個key對應(yīng)一組值的數(shù)據(jù)集,一個key對應(yīng)的一組數(shù)據(jù)調(diào)用一次reduce方法
"-Djava.ext.dirs=D:\java1.8\jre\lib\ext", "D:\java1.8\jre1.8\bin\server\jvm.dll"
2.Combiner總結(jié)
(1)Combiner調(diào)用的地方
? ? MapTask的環(huán)形緩沖區(qū)向磁盤溢寫文件調(diào)用Combiner
? ? map階段在合并本地多個文件寫入一個大文件之前調(diào)用Combiner
(2)使用Combiner的好處
? 減少Map Task輸出數(shù)據(jù)量裙士,由于臨時結(jié)果寫入本地磁盤入客,所以能減少磁盤I/O
? 減少Reduce-Map網(wǎng)絡(luò)傳輸數(shù)據(jù)量,由于reduce需要遠(yuǎn)程通過
應(yīng)用場景:針對結(jié)果可以疊加的場景 SUM(YES)腿椎,Average(NO)
設(shè)置方法:(local reducer)
? job.setCombinerClass(WordCountReducer.class)
3.YARN調(diào)度器
數(shù)據(jù)本地性 任務(wù)運(yùn)行與需要處理的數(shù)據(jù)在同一個節(jié)點桌硫,則稱為該任務(wù)具有“數(shù)據(jù)本地性”
數(shù)據(jù)本地性級別(性能由高到低排列)
? 同節(jié)點(node-local)
? 同機(jī)架(rack-local)
? 跨機(jī)架(off-switch)
4.推測執(zhí)行
? ? 發(fā)現(xiàn)執(zhí)行慢的任務(wù),在其他機(jī)器上執(zhí)行一個備份任務(wù)啃炸,同時運(yùn)行铆隘,誰先運(yùn)行
? ? 完,則采用誰的結(jié)果南用。但對于存在的大數(shù)據(jù)量的負(fù)載傾斜膀钠,或者向數(shù)據(jù)庫寫
? 數(shù)據(jù)掏湾。不適合推測執(zhí)行
5.YARN-調(diào)度器
? 之前采用FIFO(先入先出)的法則。資源利用低肿嘲,緊急的作業(yè)無法插隊
? 隨后采用多隊列分開調(diào)度的方法:所有資源按照比例劃分到不同的隊列融击。每個隊列實現(xiàn)單獨的調(diào)度測了
? 優(yōu)點是讓更多的應(yīng)用程序獲得資源,使用靈活雳窟,資源利用率高尊浪。
? 調(diào)度器包括? CapacityScheduler調(diào)度器和FairScheduler調(diào)度器。
5(1)CapacityScheduler配置方法
? capacity-scheduler.xml參數(shù)說明
? ? ? capacity:隊列占用的集群資源容量百分比封救,所有隊列的容量之和少于100
? ? maximum-capacity 由于存在資源共享拇涤,因此一個隊列使用的資源可能超過其容量,最多使用
? 可通過該參數(shù)限制.配置完成后無需重啟YARN誉结,使用管理命令刷新調(diào)度設(shè)置
? ? bin/yarn madmin -refreshQueues
5(2)FairScheduler調(diào)度器
? ? ? 以隊列方式組織作業(yè)工育,基于最小資源量和公平共享量進(jìn)行調(diào)度;支持資源搶占搓彻。內(nèi)部隊列中
? ? 可用的策略:FIFO fair(默認(rèn))如绸,基于內(nèi)存使用量調(diào)度分配資源
? ? 任務(wù)延時調(diào)度:提高數(shù)據(jù)本地性和提高系統(tǒng)整體吞吐率。
實戰(zhàn)
A演示公平調(diào)度器
? 在node02上旭贬,cd /usr/local/hadoop/etc/hadoop
? 編輯公平調(diào)度器后怔接,重啟
? ? yarn-daemon.sh stop resourcemanager
? ? yarn-daemon.sh start resourcemanager
新建 data_bi用戶
echo data_bi |passwd --stdin data_bi
以用戶data_bi完成wordcount的例子 闡釋 公平調(diào)度器中不同用戶完成作業(yè)的過程。
B廣告曝光的例子
B1 計算曝光量
首先在第一臺機(jī)器上切換到用戶 hadoop
su hadoop
cd ~
mkdir jobs
在jobs目錄下:
刪除之前的 MapReducePro-1.0-SNAPSHOT.jar
rm -f MapReducePro-1.0-SNAPSHOT.jar
上傳最新的
rz
mkdir mr_pvdata
cd mr_pvdata
rz
廣告文件
格式? 地域ID? 用戶ID 曝光還是點擊 日期
在根目錄下創(chuàng)建文件夾存數(shù)據(jù)
hadoop fs -mkdir -p? /addata/pv_click_datas
上傳數(shù)據(jù)
hadoop fs -put ad_data_2017122*? /addata/pv_click_datas
hadoop fs -ls /addata/pv_click_datas
cd ~/jobs
hadoop jar MapReducePro-1.0-SNAPSHOT.jar bigdata.mr.MrPvSortByDayApp /addata/pv_click_datas? /addata/pv_click_datas/out
hadoop fs -ls /addata/pv_click_datas/out
查看排序結(jié)果
hadoop fs -cat /addata/pv_click_datas/out/part-r-00000
B2把28號的數(shù)據(jù)單獨建立一個文件夾稀轨,再把28號的數(shù)據(jù)傳上去扼脐,然后計算曝光率
hadoop fs -mkdir /addata/dt=20171228
hadoop fs -put ~/jobs/mr_pvdata/ad_data_20171228.txt /addata/dt=20171228
hadoop fs -ls hadoop fs /addata/dt=20171228
在jobs目錄下
hadoop jar MapReducePro-1.0-SNAPSHOT.jar bigdata.mr.MrPvClickByAreaDayApp /addata/dt=20171228 /addata/dt=20171228/out
hadoop fs -ls /addata/dt=20171228/out
查看曝光率的結(jié)果
hadoop fs -cat /addata/dt=20171228/out/part-r-00000
B3 統(tǒng)計同一年齡段不同性別人的最高打分
hadoop fs -mkdir /addata/user_core
cd ~/jobs/mr_pvdata
hadoop fs? -put user_core.txt /addata/user_core
cd ..
在jobs目錄下
hadoop jar MapReducePro-1.0-SNAPSHOT.jar bigdata.mr.MrUserAgeMaxCoreApp /addata/user_core? /addata/user_core/out
查看結(jié)果
會有三個 ,每個年齡段一個
hadoop fs -ls /addata/user_core/out
hadoop fs -cat /addata/user_core/out/part-r-00002
hadoop fs -cat /addata/user_core/out/part-r-00001
hadoop fs -cat /addata/user_core/out/part-r-00000