1、按條件篩選session
2、聚合統(tǒng)計(jì):統(tǒng)計(jì)出符合條件的session中沾谜,訪問時(shí)長在1s-3s向胡、4s-6s、7s-9s、10s-30s、30s-60s、1m-3m褒侧、3m-10m、10m-30m谊迄、30m以上各個(gè)范圍內(nèi)的session占比闷供;訪問步長在1-3、4-6统诺、7-9歪脏、10-30、30-60粮呢、60以上各個(gè)范圍內(nèi)的session占比
3婿失、在符合條件的session中,按照時(shí)間比例隨機(jī)抽取1000個(gè)session
4啄寡、在符合條件的session中豪硅,獲取點(diǎn)擊、下單和支付數(shù)量排名前10的品類
5挺物、對于排名前10的品類懒浮,分別獲取其點(diǎn)擊次數(shù)排名前10的session
說在前面的話,本節(jié)課是我們正規(guī)企業(yè)級大數(shù)據(jù)項(xiàng)目開發(fā)流程的第三個(gè)步驟识藤。就是說嵌溢,在調(diào)研完了基礎(chǔ)數(shù)據(jù)眯牧、分析完了需求之后蹋岩,就需要針對我們手頭上有的基礎(chǔ)數(shù)據(jù)和PM提出來的需求赖草,來進(jìn)行技術(shù)方案的設(shè)計(jì)。所謂技術(shù)方案剪个,指的就是秧骑,基于現(xiàn)有的數(shù)據(jù),針對提出的需求扣囊,實(shí)現(xiàn)所有需求的整個(gè)技術(shù)架構(gòu)乎折、關(guān)鍵的技術(shù)點(diǎn)等。在這個(gè)過程中侵歇,需要考慮到實(shí)現(xiàn)所有需求骂澄,需要使用以及可能涉及到的技術(shù)點(diǎn)。另外惕虑,在這個(gè)過程中坟冲,有時(shí)也會涉及到技術(shù)的選項(xiàng)。比如溃蔫,如果說健提,我們的Spark程序在中間,需要對某個(gè)RDD的數(shù)據(jù)寫入外部的緩存伟叛,以便于后續(xù)的算子可以直接通過緩存讀取數(shù)據(jù)私痹。那么就需要對緩存進(jìn)行技術(shù)選項(xiàng),redis统刮、memcached紊遵、spark tachyon。
說明一下侥蒙,技術(shù)架構(gòu)暗膜,其實(shí)在之前,介紹這個(gè)基礎(chǔ)數(shù)據(jù)的時(shí)候辉哥,已經(jīng)講解了桦山。前端+J2EE+Spark+MySQL。
實(shí)現(xiàn)需求需要使用的以及涉及到的技術(shù)點(diǎn)醋旦,和技術(shù)實(shí)現(xiàn)思路恒水,是我們這里的重點(diǎn)。也就是說饲齐,實(shí)現(xiàn)上述幾個(gè)需求钉凌,你的技術(shù)實(shí)現(xiàn)的思路,以及在思路中捂人,可能使用到的技術(shù)的要點(diǎn)御雕。
1矢沿、按條件篩選session
這里首先提出第一個(gè)問題,你要按條件篩選session酸纲,但是這個(gè)篩選的粒度是不同的捣鲸,比如說搜索詞、訪問時(shí)間闽坡,那么這個(gè)都是session粒度的栽惶,甚至是action粒度的;那么還有疾嗅,就是針對用戶的基礎(chǔ)信息進(jìn)行篩選外厂,年齡、性別代承、職業(yè)汁蝶。。论悴;所以說篩選粒度是不統(tǒng)一的掖棉。
第二個(gè)問題,就是說意荤,我們的每天的用戶訪問數(shù)據(jù)量是很大的啊片,因?yàn)閡ser_visit_action這個(gè)表,一行就代表了用戶的一個(gè)行為玖像,比如點(diǎn)擊或者搜索紫谷;那么在國內(nèi)一個(gè)大的電商企業(yè)里面,如果每天的活躍用戶數(shù)量在千萬級別的話捐寥。那么可以告訴大家笤昨,這個(gè)user_visit_action表,每天的數(shù)據(jù)量大概在至少5億以上握恳,在10億左右瞒窒。
那么針對這個(gè)篩選粒度不統(tǒng)一的問題,以及數(shù)據(jù)量巨大(10億/day)乡洼,可能會有兩個(gè)問題崇裁;首先第一個(gè),就是束昵,如果不統(tǒng)一篩選粒度的話拔稳,那么就必須得對所有的數(shù)據(jù)進(jìn)行全量的掃描;第二個(gè)锹雏,就是全量掃描的話巴比,量實(shí)在太大了,一天如果在10億左右,那么10天呢(100億)轻绞,100呢采记,1000億。量太大的話政勃,會導(dǎo)致Spark作業(yè)的運(yùn)行速度大幅度降低唧龄。極大的影響平臺使用者的用戶體驗(yàn)。
所以為了解決這個(gè)問題稼病,那么我們選擇在這里选侨,對原始的數(shù)據(jù),進(jìn)行聚合然走,什么粒度的聚合呢?session粒度的聚合戏挡。也就是說芍瑞,用一些最基本的篩選條件,比如時(shí)間范圍褐墅,從hive表中提取數(shù)據(jù)拆檬,然后呢,按照session_id這個(gè)字段進(jìn)行聚合妥凳,那么聚合后的一條記錄竟贯,就是一個(gè)用戶的某個(gè)session在指定時(shí)間內(nèi)的訪問的記錄,比如搜索過的所有的關(guān)鍵詞逝钥、點(diǎn)擊過的所有的品類id屑那、session對應(yīng)的userid關(guān)聯(lián)的用戶的基礎(chǔ)信息。
聚合過后艘款,針對session粒度的數(shù)據(jù)持际,按照使用者指定的篩選條件,進(jìn)行數(shù)據(jù)的篩選哗咆。篩選出來符合條件的用session粒度的數(shù)據(jù)蜘欲。其實(shí)就是我們想要的那些session了。
2晌柬、聚合統(tǒng)計(jì)
如果要做這個(gè)事情姥份,那么首先要明確,我們的spark作業(yè)是分布式的年碘。所以也就是說澈歉,每個(gè)spark task在執(zhí)行我們的統(tǒng)計(jì)邏輯的時(shí)候,可能就需要對一個(gè)全局的變量盛泡,進(jìn)行累加操作闷祥。比如代表訪問時(shí)長在1s-3s的session數(shù)量,初始是0,然后呢分布式處理所有的session凯砍,判斷每個(gè)session的訪問時(shí)長箱硕,如果是1s-3s內(nèi)的話,那么就給1s-3s內(nèi)的session計(jì)數(shù)器悟衩,累加1剧罩。
那么在spark中,要實(shí)現(xiàn)分布式安全的累加操作座泳,基本上只有一個(gè)最好的選擇惠昔,就是Accumulator變量。但是挑势,問題又來了镇防,如果是基礎(chǔ)的Accumulator變量,那么可能需要將近20個(gè)Accumulator變量潮饱,1s-3s来氧、4s-6s。香拉。啦扬。。凫碌;但是這樣的話扑毡,就會導(dǎo)致代碼中充斥了大量的Accumulator變量,導(dǎo)致維護(hù)變得更加復(fù)雜盛险,在修改代碼的時(shí)候瞄摊,很可能會導(dǎo)致錯(cuò)誤。比如說判斷出一個(gè)session訪問時(shí)長在4s-6s枉层,但是代碼中不小心寫了一個(gè)bug(由于Accumulator太多了)泉褐,比如說,更新了1s-3s的范圍的Accumulator變量鸟蜡。導(dǎo)致統(tǒng)計(jì)出錯(cuò)膜赃。
所以,對于這個(gè)情況揉忘,那么我們就可以使用自定義Accumulator的技術(shù)跳座,來實(shí)現(xiàn)復(fù)雜的分布式計(jì)算。也就是說泣矛,就用一個(gè)Accumulator疲眷,來計(jì)算所有的指標(biāo)。
3您朽、在符合條件的session中狂丝,按照時(shí)間比例隨機(jī)抽取1000個(gè)session
這個(gè)呢换淆,需求上已經(jīng)明確了。那么剩下的就是具體的實(shí)現(xiàn)了几颜。具體的實(shí)現(xiàn)這里不多說倍试,技術(shù)上來說,就是要綜合運(yùn)用Spark的countByKey蛋哭、groupByKey县习、mapToPair等算子,來開發(fā)一個(gè)復(fù)雜的按時(shí)間比例隨機(jī)均勻采樣抽取的算法谆趾。(大數(shù)據(jù)算法)
4躁愿、在符合條件的session中,獲取點(diǎn)擊沪蓬、下單和支付數(shù)量排名前10的品類
這里的話呢彤钟,需要對每個(gè)品類的點(diǎn)擊、下單和支付的數(shù)量都進(jìn)行計(jì)算怜跑。然后呢样勃,使用Spark的自定義Key二次排序算法的技術(shù),來實(shí)現(xiàn)所有品類性芬,按照三個(gè)字段,點(diǎn)擊數(shù)量剧防、下單數(shù)量植锉、支付數(shù)量依次進(jìn)行排序,首先比較點(diǎn)擊數(shù)量峭拘,如果相同的話俊庇,那么比較下單數(shù)量,如果還是相同鸡挠,那么比較支付數(shù)量辉饱。
5、對于排名前10的品類拣展,分別獲取其點(diǎn)擊次數(shù)排名前10的session
這個(gè)需求彭沼,需要使用Spark的分組取TopN的算法來進(jìn)行實(shí)現(xiàn)。也就是說對排名前10的品類對應(yīng)的數(shù)據(jù)备埃,按照品類id進(jìn)行分組姓惑,然后求出每組點(diǎn)擊數(shù)量排名前10的session。
最后總結(jié)一下按脚,通過學(xué)習(xí)這個(gè)模塊于毙,通過業(yè)務(wù)功能的開發(fā),還不說性能調(diào)優(yōu)辅搬、troubleshooting唯沮、數(shù)據(jù)傾斜方面的東西。僅僅是業(yè)務(wù)功能的開發(fā),可以掌握到的技術(shù)點(diǎn):
1介蛉、通過底層數(shù)據(jù)聚合萌庆,來減少spark作業(yè)處理數(shù)據(jù)量,從而提升spark作業(yè)的性能(從根本上提升spark性能的技巧)
2甘耿、自定義Accumulator實(shí)現(xiàn)復(fù)雜分布式計(jì)算的技術(shù)
3踊兜、Spark按時(shí)間比例隨機(jī)抽取算法
4、Spark自定義key二次排序技術(shù)
5佳恬、Spark分組取TopN算法
6捏境、通過Spark的各種功能和技術(shù)點(diǎn),進(jìn)行各種聚合毁葱、采樣垫言、排序、取TopN業(yè)務(wù)的實(shí)現(xiàn)