實(shí)時(shí)數(shù)據(jù)倉庫-通用寬表

離線數(shù)據(jù)倉庫都是T+1離線分析數(shù)據(jù)廓脆,運(yùn)營人員今天看昨天的數(shù)據(jù)報(bào)表之宿,當(dāng)客戶為店鋪或者商品做活動(dòng)并且想看當(dāng)前的活動(dòng)效果就只能等到明天來觀察已烤,然后根據(jù)結(jié)果調(diào)整活動(dòng)策略鸠窗,這樣可能錯(cuò)過最佳的調(diào)整時(shí)機(jī),當(dāng)網(wǎng)站做大型活動(dòng)胯究,領(lǐng)導(dǎo)或公司就特別想看到活動(dòng)實(shí)時(shí)帶來的效益拧抖,比如阿里每年的雙11庐完,幾分鐘破億、破10億。當(dāng)前最新的訂單量腐碱、銷售額等,隨著大家對(duì)數(shù)據(jù)及時(shí)性的要求越來越高掠拳,實(shí)時(shí)計(jì)算應(yīng)景產(chǎn)生冒掌。常見的開源實(shí)時(shí)計(jì)算框架有storm、s4株婴、spark等怎虫。這里只討論和關(guān)注storm部分。使用過storm開發(fā)過實(shí)時(shí)需求的同學(xué)都知道困介,storm對(duì)于單數(shù)據(jù)流的處理無論是開發(fā)難度或者處理執(zhí)行效率都相當(dāng)不錯(cuò)大审,部門有好多這樣的任務(wù)跑的也一直比較穩(wěn)定。但是當(dāng)2個(gè)或2個(gè)以上的數(shù)據(jù)流進(jìn)行關(guān)聯(lián)座哩,然后再進(jìn)行邏輯處理徒扶,可能問題就凸顯出來了,比如誰先到誰后到八回,誰一直不到酷愧,等待時(shí)間、過期怎么處理等等缠诅。今天這里主要討論如何簡單高效的將2個(gè)多于2個(gè)的數(shù)據(jù)流進(jìn)行關(guān)聯(lián)合并處理溶浴。如下圖,我們要實(shí)現(xiàn)實(shí)時(shí)的通用寬表層管引。按照主題實(shí)現(xiàn)通用寬表士败,以后只要有關(guān)于這個(gè)主題的實(shí)時(shí)需求都可以從通用層計(jì)算實(shí)現(xiàn)。
Image
Image

實(shí)時(shí)數(shù)據(jù)倉庫相比較離線數(shù)倉褥伴,實(shí)時(shí)性更高谅将,這就要求數(shù)據(jù)流盡量短,層次相對(duì)簡化重慢,相比較離線饥臂,這里的ods和明細(xì)表就可以合并等于從業(yè)務(wù)庫實(shí)時(shí)同步數(shù)據(jù)寫入到kafka中的一個(gè)topic。關(guān)于數(shù)據(jù)采集這里不做討論似踱,部門是部署腳本監(jiān)控業(yè)務(wù)庫的DML語句隅熙,將create稽煤、update、delete的數(shù)據(jù)實(shí)時(shí)同步寫入到kafka囚戚。那么我們要實(shí)現(xiàn)多個(gè)數(shù)據(jù)流實(shí)時(shí)關(guān)聯(lián)合并組成寬記錄酵熙,
這里有幾點(diǎn)要求
實(shí)時(shí)性
延遲要低,分鐘級(jí)驰坊、秒級(jí)

一致性
保證數(shù)據(jù)的準(zhǔn)確一致性匾二,不能丟數(shù)據(jù),寧可多算不可漏掉數(shù)據(jù)

易用性
實(shí)時(shí)數(shù)據(jù)有三種狀態(tài)增拳芙、刪察藐、改,對(duì)于下游使用這個(gè)寬表要做到易用态鳖,能抽象通用的匯總模型

思路
1.如何解決誰先到誰后到誰遲遲不到的問題转培?storm的例子中有兩個(gè)數(shù)據(jù)流的join的案例,是使用內(nèi)存來存儲(chǔ)先到的數(shù)據(jù)浆竭,設(shè)置過期時(shí)間浸须,這樣就有兩個(gè)問題,過期就表明會(huì)丟數(shù)據(jù)邦泄,由于實(shí)時(shí)數(shù)據(jù)特點(diǎn)有增有改有刪删窒,即使關(guān)聯(lián)上已經(jīng)往下發(fā)送,但是考慮到update顺囊、delete肌索,那內(nèi)存中數(shù)據(jù)不能立即clear,內(nèi)存消耗也是個(gè)問題特碳,很容易吃滿內(nèi)存诚亚,溢出。如果放到內(nèi)存不合適午乓,那就借助存儲(chǔ)數(shù)據(jù)庫站宗,比如hbase、redis益愈,mysql等梢灭,這里第一版是使用的hbase,如果后期性能跟不上可升級(jí)為redis蒸其。2.如何解決更新敏释、刪除數(shù)據(jù)對(duì)之前合并結(jié)果的影響這里定義了一種操作叫做逆操作。比如金額最早為5元摸袁,后續(xù)變成3元钥顽,那這條記錄我會(huì)把前后都傳遞給下游,3|5,下游如果有匯總靠汁,那就 - 5 + 3耳鸯,如果只是合并不做計(jì)算湿蛔,那就只取 3就可以了膀曾。
整體的結(jié)構(gòu)圖

就像倒立的二叉樹县爬,拓?fù)浣Y(jié)構(gòu)呈螺旋狀,每個(gè)節(jié)點(diǎn)都是storm的bolt步驟添谊,直到最后一個(gè)bolt就組成了我們想要的寬表A财喳、B、C斩狱、D耳高、E、F代表kafka的topicGHIK都是中間的bolt過程所踊,都是hbase表泌枪,L代表最后的寬表,寫到入kafka秕岛,等待下游消費(fèi)使用碌燕。
Image
Image

如圖上所示,除了消費(fèi)各自topic的數(shù)據(jù)寫法不一致外继薛,其他節(jié)點(diǎn)都是將左邊和右邊合并修壕,然后繼續(xù)往下發(fā)送,所以這些點(diǎn)都是可以抽象成一個(gè)通用的bolt來處理遏考。
GeneralMerge
Map<String, String> left = (Map<String, String>)tuple.getValueByField("left");Map<String, String> right = (Map<String, String>)tuple.getValueByField("right");if(left != null && right!=null) { left.putAll(right);}獲取左邊右邊慈鸠,然后merge起來

圖里邊最小的單元如下圖,都是2個(gè)流關(guān)聯(lián)組成寬記錄往下emit灌具,然后再跟右邊的結(jié)果合并青团。一直到最后的節(jié)點(diǎn)
Image
Image

仔細(xì)觀察,整個(gè)拓?fù)浣Y(jié)構(gòu)都是由一個(gè)個(gè)這樣的最小單元組成的咖楣,那么最小單元是否可以繼續(xù)抽象成通用的模型呢督笆。拆分下這個(gè)單元,就是由2個(gè)數(shù)據(jù)流截歉、關(guān)聯(lián)關(guān)系胖腾、流到哪、數(shù)據(jù)流數(shù)據(jù)要存儲(chǔ)到什么表中抽象出來就是左邊的表瘪松,右表的表咸作,表和表之間的關(guān)系【leftjoin、innerjoin】這些信息抽象成對(duì)象
Param leftParam = new Params(hb_table1,hb_table1_index,"L|R");Param rightParam = new Params(hb_table2,hb_table2_index,"L&R");

hb_table{1,2}代表數(shù)據(jù)存儲(chǔ)的表名hb_table{1,2}_index代表數(shù)據(jù)自己的主鍵和另一方關(guān)聯(lián)鍵的索引表宵睦,比如不都是主鍵之間進(jìn)行joinL|R代表 左關(guān)聯(lián)记罚,代表左邊的數(shù)據(jù)到了,會(huì)先去找右邊的數(shù)據(jù)壳嚎,即使右邊的數(shù)據(jù)還未到桐智,發(fā)現(xiàn)關(guān)聯(lián)關(guān)系為L|R,左關(guān)聯(lián)末早,左邊也往下發(fā)送。最小單元的處理過程就是 先定義數(shù)據(jù)流的信息说庭,讀取topic然磷,保存數(shù)據(jù)、索引表刊驴,找對(duì)方然后發(fā)送,如下代碼
//獲取數(shù)據(jù)流信息Map<String, String> leftMap = preParseProcess.process(tuple, leftParam); leftMap = save(tuple, leftMap); //保存emit(tuple,collector, leftMap); //找對(duì)方然后發(fā)送

數(shù)據(jù)傳遞
新增類型姿搜,封裝到map中往下傳遞
更新類型,在更新的字段上標(biāo)記新值捆憎、舊值舅柜,比如 new_value + split + old_value,下游使用時(shí)躲惰,已經(jīng)告訴了你更新后的值致份、更新后的值,自己根據(jù)業(yè)務(wù)處理即可
刪除類型础拨,在每個(gè)字段后標(biāo)記刪除標(biāo)簽氮块,如 old_value + split + DEL

優(yōu)缺點(diǎn)
中間結(jié)果多、表多太伊、操作hbase頻繁對(duì)hbase有一定的壓力雇锡、拓?fù)浣Y(jié)構(gòu)比較多,運(yùn)維比較麻煩
將多個(gè)數(shù)據(jù)流匯總成一個(gè)通用寬表僚焦,下游再有這主題的任何實(shí)時(shí)需求都可以很方便的使用和編寫锰提。提高工作效率,減少驗(yàn)證數(shù)據(jù)成本芳悲。

結(jié)論
方案可行
延遲在分鐘內(nèi)
除了運(yùn)單等變化的字段其他字段可以與離線數(shù)據(jù)吻合
提高實(shí)時(shí)開發(fā)的效率
待續(xù)....困的受不鳥了立肘。。名扛。谅年。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肮韧,隨后出現(xiàn)的幾起案子融蹂,更是在濱河造成了極大的恐慌,老刑警劉巖弄企,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件超燃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拘领,警方通過查閱死者的電腦和手機(jī)意乓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來约素,“玉大人届良,你說我怎么就攤上這事笆凌。” “怎么了士葫?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵乞而,是天一觀的道長。 經(jīng)常有香客問我为障,道長晦闰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任鳍怨,我火速辦了婚禮,結(jié)果婚禮上跪妥,老公的妹妹穿的比我還像新娘鞋喇。我一直安慰自己,他們只是感情好眉撵,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布侦香。 她就那樣靜靜地躺著,像睡著了一般纽疟。 火紅的嫁衣襯著肌膚如雪罐韩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天污朽,我揣著相機(jī)與錄音散吵,去河邊找鬼。 笑死蟆肆,一個(gè)胖子當(dāng)著我的面吹牛矾睦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播炎功,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼枚冗,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蛇损?” 一聲冷哼從身側(cè)響起赁温,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎淤齐,沒想到半個(gè)月后股囊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡床玻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年毁涉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锈死。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贫堰,死狀恐怖穆壕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情其屏,我是刑警寧澤喇勋,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站偎行,受9級(jí)特大地震影響川背,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛤袒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一熄云、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧妙真,春花似錦缴允、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锈候,卻和暖如春薄料,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背泵琳。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工摄职, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人虑稼。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓琳钉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛛倦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子歌懒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容