Coding

1.基礎:wordCount

2.三個重要自定義接口:partitioner羹奉、combiner教寂、自定義排序(WritableComparator)

partitioner用于自定義maptask執(zhí)行結果分區(qū)吆玖,按照分區(qū)結果啟動相應數(shù)量reduce紧帕,默認使用對key進行hash的方式分區(qū)挨措。(例子:對手機流量統(tǒng)計同時按照歸屬地進行分區(qū))自定義一個partitioner繼承抽象類:Partitioner然后在job對象中惭缰,設置自定義partitioner: job.setPartitionerClass(CustomPartitioner.class)珠漂,即可在maptask處理數(shù)據時(將數(shù)據寫入緩沖區(qū))對數(shù)據進行自定義分區(qū)晚缩。

combiner用于處理maptask到reduceTask之間的中間結果,Combiner將有相同key的key/value對的value加起來媳危,減少溢寫到磁盤的數(shù)據量荞彼。Combiner會優(yōu)化MapReduce的中間結果,所以它在整個模型中會多次使用待笑。使用combiner要注意不能破壞最終的結果鸣皂,不適用于求平均值這種情況,具體問題具體分析。(例子:結合wordCount即可寞缝,可以發(fā)現(xiàn)每個mapTask執(zhí)行結果變成了類似reduceTask執(zhí)行結果<hello,n(n>1)>)癌压。

自定義排序:比如需要以某個bean作為key并按照bean中的某個屬性進行排序,需對這個bean實現(xiàn)WritableComparable接口荆陆,自定義排序邏輯滩届。(對手機流量統(tǒng)計結果按照總流量大小進行排序輸出)。

3.coding

3.1 兩表join算法的實現(xiàn)

select a.id,a.date,b.name,b.category_id,b.price from t_order a join t_product b on a.pid = b.id

join

在Reduce端實現(xiàn):

思路:

自定義join后的實體類型infoBean被啼,包含兩個表join后的屬性帜消,外加一個flag標識是哪個表的數(shù)據

mapTask:通過文件名判斷是哪種數(shù)據(order還是product),切分行浓体,賦值給infoBean泡挺,構造k-v鍵值對,key為join條件

reduceTask:可知一個productBean會對應多個orderBean命浴,在reduce階段娄猫,一次讀一組key相同的數(shù)據,通過flag區(qū)分是哪種bean(orderBean必然是一組咳促,productBean則是一個)稚新,對orderBean進行遍歷,將所缺的product數(shù)據由productBean跪腹,set進去即可褂删。

在Map端實現(xiàn):解決數(shù)據傾斜的問題

根據join條件,比如有很大一部分pid分區(qū)后涌入一個reduce冲茸,而其他pid只有少數(shù)屯阀,卻也涌入其他reduce,就會造成數(shù)據量大的reduce處理起來較慢轴术,并發(fā)效率低的情況难衰。解決方式是在Map端實現(xiàn),適用于關聯(lián)表中有小表的情形逗栽;可以將小表分發(fā)到所有的map節(jié)點盖袭,這樣,map節(jié)點就可以在本地對自己所讀到的大表數(shù)據進行join并輸出最終結果彼宠,可以大大提高join操作的并發(fā)度鳄虱,加快處理速度。

思路:

先在mapper類中預先定義好小表凭峡,進行join------引入實際場景中的解決方案:一次加載數(shù)據庫或者用distributedcache

在mapper類中重寫?setup方法拙已,該方法在map任務初始化時調用,在此處將小表讀取放入本地緩存摧冀。在map方法中只讀取大表倍踪,然后將小表和其關聯(lián)即可系宫,無需reduce。

指定需要緩存一個文件到所有的maptask運行節(jié)點工作目錄的方法:

3.2? 找出共同好友(difficult)

思路:

重點:好友關系是單向的建车,如何得到一組數(shù)據扩借,以兩個用戶為key,value為兩者的共同好友癞志。

第一步 :map

讀一行? A:B,C,D,F,E,O

輸出? ? <B,A><C,A><D,A><F,A><E,A><O,A>? ?(B在A的好友列表往枷、C在A的好友列表,D在A的好友列表凄杯。。秉宿。)

第二步:reduce

拿到的數(shù)據比如<C,A><C,B><C,E><C,F><C,G>......

輸出:<C? A,B,E,F,G…….>? ? ?——>C為key戒突,value為,列表中有C作為好友的人描睦,即膊存,A,B,E,F,G…都有C作為好友。

第三步:map忱叭,以第二步輸出作為輸入

讀入一行<C? A,B,E,F,G…….>

輸出<A-B,C><A-E,C><A-F,C>……還要把A,B,E,F,G…….先排序防止A-B和B-A這種情況

從而得到兩兩共同好友C

第四步:reduce

讀入數(shù)據 <A-B,C><A-B,F><A-B,G>.......

輸出: A-B? C,F,G,.....

A-B為key隔崎,收集到key對應的所有value,就是這兩兩的共同好友

3.3? 流量統(tǒng)計

1.對流量日志中的用戶統(tǒng)計總上韵丑、下行流量

map:切分數(shù)據爵卒,對日志進行處理,將電話號碼作為key撵彻,將上行流量钓株、下行流量、總流量生成一個bean作為value陌僵。

reduce:一個key轴合,得到一組bean,然后統(tǒng)計總流量碗短。

2.統(tǒng)計流量且按照流量大小倒序排序

使用第一步的結果作為輸入受葛,使bean作為key,電話號碼作為value偎谁,實現(xiàn)WritableComparable接口总滩,自定義排序方法,這樣就自動排序了搭盾。因為每個bean都是不同的咳秉,所以對于reduce來說,不存在一個key對應一組value鸯隅,所以reduce一次只處理一個k-v澜建,將v作為key向挖,key作v,得到排序后的結果炕舵。

3.根據號碼歸屬地對數(shù)據分區(qū)何之,將數(shù)據寫到不同數(shù)據

實現(xiàn)方法:自定義Partitioner,實現(xiàn)getPartition方法咽筋,然后在客戶端程序定義

job.setPartitionerClass(ProvincePartitioner.class);

自定義partition后溶推,要根據自定義partitioner的邏輯設置相應數(shù)量的reduce task

job.setNumReduceTasks(n);

這樣就可以按照自定義方式對數(shù)據進行分區(qū)處理了

注意:如果reduceTask的數(shù)量>= getPartition的結果數(shù)? ,則會多產生幾個空的輸出文件part-r-000xx

如果? ? 1<reduceTask的數(shù)量<getPartition的結果數(shù) 奸攻,則有一部分分區(qū)數(shù)據無處安放蒜危,會Exception!6媚汀辐赞!

如果 reduceTask的數(shù)量=1,則不管mapTask端輸出多少個分區(qū)文件硝训,最終結果都交給這一個reduceTask响委,最終也就只會產生一個結果文件 part-r-00000

3.4? web日志預處理

需求:對web訪問日志中的各字段識別切分,去除日志中不合法的記錄

定義一個流量數(shù)據的bean

定義一個數(shù)據校驗函數(shù)窖梁,當數(shù)據不全或者數(shù)據中日志的請求狀態(tài)字段為400赘风,設置為非法記錄。

使用mapper對數(shù)據進行處理纵刘,每次讀取一行邀窃,bean為key,當bean不合法彰导,不寫入蛔翅。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市位谋,隨后出現(xiàn)的幾起案子山析,更是在濱河造成了極大的恐慌,老刑警劉巖掏父,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笋轨,死亡現(xiàn)場離奇詭異,居然都是意外死亡赊淑,警方通過查閱死者的電腦和手機爵政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陶缺,“玉大人钾挟,你說我怎么就攤上這事”グ叮” “怎么了掺出?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵徽千,是天一觀的道長。 經常有香客問我汤锨,道長双抽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任闲礼,我火速辦了婚禮牍汹,結果婚禮上,老公的妹妹穿的比我還像新娘柬泽。我一直安慰自己慎菲,他們只是感情好,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布锨并。 她就那樣靜靜地躺著钧嘶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪琳疏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天闸拿,我揣著相機與錄音空盼,去河邊找鬼。 笑死新荤,一個胖子當著我的面吹牛揽趾,可吹牛的內容都是我干的。 我是一名探鬼主播苛骨,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼篱瞎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痒芝?” 一聲冷哼從身側響起俐筋,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎严衬,沒想到半個月后澄者,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡请琳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年粱挡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俄精。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡询筏,死狀恐怖,靈堂內的尸體忽然破棺而出竖慧,到底是詐尸還是另有隱情嫌套,我是刑警寧澤逆屡,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站灌危,受9級特大地震影響康二,放射性物質發(fā)生泄漏。R本人自食惡果不足惜勇蝙,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一沫勿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧味混,春花似錦产雹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馆衔,卻和暖如春瘟判,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背角溃。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工拷获, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人减细。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓匆瓜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親未蝌。 傳聞我的和親對象是個殘疾皇子驮吱,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容