作者:郭煒
經(jīng)過這么多年的發(fā)展壶笼,已經(jīng)從大數(shù)據(jù)1.0的BI/Datawarehouse時(shí)代,經(jīng)過大數(shù)據(jù)2.0的Web/APP過渡雁刷,進(jìn)入到了IOT的大數(shù)據(jù)3.0時(shí)代覆劈,而隨之而來的是數(shù)據(jù)架構(gòu)的變化。
▌Lambda架構(gòu)
在過去Lambda數(shù)據(jù)架構(gòu)成為每一個(gè)公司大數(shù)據(jù)平臺(tái)必備的架構(gòu)沛励,它解決了一個(gè)公司大數(shù)據(jù)批量離線處理和實(shí)時(shí)數(shù)據(jù)處理的需求。一個(gè)典型的Lambda架構(gòu)如下:
數(shù)據(jù)從底層的數(shù)據(jù)源開始鹦筹,經(jīng)過各種各樣的格式進(jìn)入大數(shù)據(jù)平臺(tái)址貌,在大數(shù)據(jù)平臺(tái)中經(jīng)過Kafka、Flume等數(shù)據(jù)組件進(jìn)行收集,然后分成兩條線進(jìn)行計(jì)算套像。一條線是進(jìn)入流式計(jì)算平臺(tái)(例如 Storm乘盼、Flink或者Spark Streaming)虚青,去計(jì)算實(shí)時(shí)的一些指標(biāo);另一條線進(jìn)入批量數(shù)據(jù)處理離線計(jì)算平臺(tái)(例如Mapreduce螺男、Hive棒厘,Spark SQL)下隧,去計(jì)算T+1的相關(guān)業(yè)務(wù)指標(biāo),這些指標(biāo)需要隔日才能看見何乎。
Lambda架構(gòu)經(jīng)歷多年的發(fā)展土辩,其優(yōu)點(diǎn)是穩(wěn)定,對(duì)于實(shí)時(shí)計(jì)算部分的計(jì)算成本可控拷淘,批量處理可以用晚上的時(shí)間來整體批量計(jì)算启涯,這樣把實(shí)時(shí)計(jì)算和離線計(jì)算高峰分開,這種架構(gòu)支撐了數(shù)據(jù)行業(yè)的早期發(fā)展扁瓢,但是它也有一些致命缺點(diǎn)补君,并在大數(shù)據(jù)3.0時(shí)代越來越不適應(yīng)數(shù)據(jù)分析業(yè)務(wù)的需求。缺點(diǎn)如下:
●?實(shí)時(shí)與批量計(jì)算結(jié)果不一致引起的數(shù)據(jù)口徑問題:因?yàn)榕亢蛯?shí)時(shí)計(jì)算走的是兩個(gè)計(jì)算框架和計(jì)算程序伟桅,算出的結(jié)果往往不同楣铁,經(jīng)掣猓看到一個(gè)數(shù)字當(dāng)天看是一個(gè)數(shù)據(jù)赫冬,第二天看昨天的數(shù)據(jù)反而發(fā)生了變化溃列。
●?批量計(jì)算在計(jì)算窗口內(nèi)無法完成:在IOT時(shí)代,數(shù)據(jù)量級(jí)越來越大补鼻,經(jīng)常發(fā)現(xiàn)夜間只有4、5個(gè)小時(shí)的時(shí)間窗口雅任,已經(jīng)無法完成白天20多個(gè)小時(shí)累計(jì)的數(shù)據(jù)沪么,保證早上上班前準(zhǔn)時(shí)出數(shù)據(jù)已成為每個(gè)大數(shù)據(jù)團(tuán)隊(duì)頭疼的問題。
●數(shù)據(jù)源變化都要重新開發(fā)加酵,開發(fā)周期長:每次數(shù)據(jù)源的格式變化哭当,業(yè)務(wù)的邏輯變化都需要針對(duì)ETL和Streaming做開發(fā)修改,整體開發(fā)周期很長陋葡,業(yè)務(wù)反應(yīng)不夠迅速彻采。
●?服務(wù)器存儲(chǔ)大:數(shù)據(jù)倉庫的典型設(shè)計(jì)肛响,會(huì)產(chǎn)生大量的中間結(jié)果表,造成數(shù)據(jù)急速膨脹剃浇,加大服務(wù)器存儲(chǔ)壓力猎物。
▌Kappa架構(gòu)
針對(duì)Lambda架構(gòu)的需要維護(hù)兩套程序等以上缺點(diǎn),LinkedIn的Jay Kreps結(jié)合實(shí)際經(jīng)驗(yàn)和個(gè)人體會(huì)提出了Kappa架構(gòu)淘讥。Kappa架構(gòu)的核心思想是通過改進(jìn)流計(jì)算系統(tǒng)來解決數(shù)據(jù)全量處理的問題蒲列,使得實(shí)時(shí)計(jì)算和批處理過程使用同一套代碼。此外Kappa架構(gòu)認(rèn)為只有在有必要的時(shí)候才會(huì)對(duì)歷史數(shù)據(jù)進(jìn)行重復(fù)計(jì)算炼邀,而如果需要重復(fù)計(jì)算時(shí)剪侮,Kappa架構(gòu)下可以啟動(dòng)很多個(gè)實(shí)例進(jìn)行重復(fù)計(jì)算洛退。
一個(gè)典型的Kappa架構(gòu)如下圖所示:
Kappa架構(gòu)的核心思想兵怯,包括以下三點(diǎn):
1.用Kafka或者類似MQ隊(duì)列系統(tǒng)收集各種各樣的數(shù)據(jù)媒区,你需要幾天的數(shù)據(jù)量就保存幾天。
2.當(dāng)需要全量重新計(jì)算時(shí)绪爸,重新起一個(gè)流計(jì)算實(shí)例宙攻,從頭開始讀取數(shù)據(jù)進(jìn)行處理,并輸出到一個(gè)新的結(jié)果存儲(chǔ)中递惋。
3.當(dāng)新的實(shí)例做完后溢陪,停止老的流計(jì)算實(shí)例形真,并把老的一些結(jié)果刪除。
Kappa架構(gòu)的優(yōu)點(diǎn)在于將實(shí)時(shí)和離線代碼統(tǒng)一起來王财,方便維護(hù)而且統(tǒng)一了數(shù)據(jù)口徑的問題裕便。而Kappa的缺點(diǎn)也很明顯:
●?流式處理對(duì)于歷史數(shù)據(jù)的高吞吐量力不從心:所有的數(shù)據(jù)都通過流式計(jì)算偿衰,即便通過加大并發(fā)實(shí)例數(shù)亦很難適應(yīng)IOT時(shí)代對(duì)數(shù)據(jù)查詢響應(yīng)的即時(shí)性要求改览。
●?開發(fā)周期長:此外Kappa架構(gòu)下由于采集的數(shù)據(jù)格式的不統(tǒng)一缤言,每次都需要開發(fā)不同的Streaming程序胆萧,導(dǎo)致開發(fā)周期長。
●?服務(wù)器成本浪費(fèi):Kappa架構(gòu)的核心原理依賴于外部高性能存儲(chǔ)redis,hbase服務(wù)订晌。但是這2種系統(tǒng)組件蚌吸,又并非設(shè)計(jì)來滿足全量數(shù)據(jù)存儲(chǔ)設(shè)計(jì)羹唠,對(duì)服務(wù)器成本嚴(yán)重浪費(fèi)。
▌IOTA架構(gòu)
而在IOT大潮下缝彬,智能手機(jī)跌造、PC壳贪、智能硬件設(shè)備的計(jì)算能力越來越強(qiáng),而業(yè)務(wù)需求要求數(shù)據(jù)實(shí)時(shí)響應(yīng)需求能力也越來越強(qiáng)磕蒲,過去傳統(tǒng)的中心化、非實(shí)時(shí)化數(shù)據(jù)處理的思路已經(jīng)不適應(yīng)現(xiàn)在的大數(shù)據(jù)分析需求站削,我提出新一代的大數(shù)據(jù)IOTA架構(gòu)來解決上述問題孵稽,整體思路是設(shè)定標(biāo)準(zhǔn)數(shù)據(jù)模型,通過邊緣計(jì)算技術(shù)把所有的計(jì)算過程分散在數(shù)據(jù)產(chǎn)生惦积、計(jì)算和查詢過程當(dāng)中狮崩,以統(tǒng)一的數(shù)據(jù)模型貫穿始終伦乔,從而提高整體的預(yù)算效率董习,同時(shí)滿足即時(shí)計(jì)算的需要皿淋,可以使用各種Ad-hoc Query來查詢底層數(shù)據(jù):
IOTA整體技術(shù)結(jié)構(gòu)分為幾部分:
●?Common Data Model:貫穿整體業(yè)務(wù)始終的數(shù)據(jù)模型窝趣,這個(gè)模型是整個(gè)業(yè)務(wù)的核心,要保持SDK妇拯、cache洗鸵、歷史數(shù)據(jù)膘滨、查詢引擎保持一致。對(duì)于用戶數(shù)據(jù)分析來講可以定義為“主-謂-賓”或者“對(duì)象-事件”這樣的抽象模型來滿足各種各樣的查詢丹弱。以大家熟悉的APP用戶模型為例铲咨,用“主-謂-賓”模型描述就是“X用戶 – 事件1 – A頁面(2018/4/11 20:00) ”纤勒。當(dāng)然,根據(jù)業(yè)務(wù)需求的不同北滥,也可以使用“產(chǎn)品-事件”、“地點(diǎn)-時(shí)間”模型等等菊霜。模型本身也可以根據(jù)協(xié)議(例如 protobuf)來實(shí)現(xiàn)SDK端定義济赎,中央存儲(chǔ)的方式司训。此處核心是,從SDK到存儲(chǔ)到處理是統(tǒng)一的一個(gè)Common Data Model勾徽。
●?Edge SDKs & Edge Servers:這是數(shù)據(jù)的采集端统扳,不僅僅是過去的簡單的SDK咒钟,在復(fù)雜的計(jì)算情況下,會(huì)賦予SDK更復(fù)雜的計(jì)算倾鲫,在設(shè)備端就轉(zhuǎn)化為形成統(tǒng)一的數(shù)據(jù)模型來進(jìn)行傳送萍嬉。例如對(duì)于智能Wi-Fi采集的數(shù)據(jù)帚湘,從AC端就變?yōu)椤癤用戶的MAC 地址-出現(xiàn)- A樓層(2018/4/11 18:00)”這種主-謂-賓結(jié)構(gòu),對(duì)于攝像頭會(huì)通過Edge AI Server捅厂,轉(zhuǎn)化成為“X的Face特征- 進(jìn)入- A火車站(2018/4/11 20:00)”资柔。也可以是上面提到的簡單的APP或者頁面級(jí)別的“X用戶 – 事件1 – A頁面(2018/4/11 20:00) ”贿堰,對(duì)于APP和H5頁面來講,沒有計(jì)算工作量故硅,只要求埋點(diǎn)格式即可吃衅。
●?Real Time Data:實(shí)時(shí)數(shù)據(jù)緩存區(qū),這部分是為了達(dá)到實(shí)時(shí)計(jì)算的目的峻呕,海量數(shù)據(jù)接收不可能海量實(shí)時(shí)入歷史數(shù)據(jù)庫趣效,那樣會(huì)出現(xiàn)建立索引延遲、歷史數(shù)據(jù)碎片文件等問題妄帘。因此鬼廓,有一個(gè)實(shí)時(shí)數(shù)據(jù)緩存區(qū)來存儲(chǔ)最近幾分鐘或者幾秒鐘的數(shù)據(jù)尤慰。這塊可以使用Kudu或者Hbase等組件來實(shí)現(xiàn)。這部分?jǐn)?shù)據(jù)會(huì)通過Dumper來合并到歷史數(shù)據(jù)當(dāng)中。此處的數(shù)據(jù)模型和SDK端數(shù)據(jù)模型是保持一致的,都是Common Data Model驳规,例如“主-謂-賓”模型。
●?Historical Data:歷史數(shù)據(jù)沉浸區(qū)趾代,這部分是保存了大量的歷史數(shù)據(jù),為了實(shí)現(xiàn)Ad-hoc查詢飘哨,將自動(dòng)建立相關(guān)索引提高整體歷史數(shù)據(jù)查詢效率,從而實(shí)現(xiàn)秒級(jí)復(fù)雜查詢百億條數(shù)據(jù)的反饋。例如可以使用HDFS存儲(chǔ)歷史數(shù)據(jù)腕扶,此處的數(shù)據(jù)模型依然SDK端數(shù)據(jù)模型是保持一致的Common Data Model。
●?Dumper:Dumper的主要工作就是把最近幾秒或者幾分鐘的實(shí)時(shí)數(shù)據(jù),根據(jù)匯聚規(guī)則、建立索引圆兵,存儲(chǔ)到歷史存儲(chǔ)結(jié)構(gòu)當(dāng)中衙傀,可以使用map reduce、C钙畔、Scala來撰寫,把相關(guān)的數(shù)據(jù)從Realtime Data區(qū)寫入Historical Data區(qū)。
●?Query Engine:查詢引擎现斋,提供統(tǒng)一的對(duì)外查詢接口和協(xié)議(例如SQL JDBC),把Realtime Data和Historical Data合并到一起查詢,從而實(shí)現(xiàn)對(duì)于數(shù)據(jù)實(shí)時(shí)的Ad-hoc查詢倦西。例如常見的計(jì)算引擎可以使用presto、impala秦躯、clickhouse等踱承。
●?Realtime model feedback:通過Edge computing技術(shù)昙沦,在邊緣端有更多的交互可以做,可以通過在Realtime Data去設(shè)定規(guī)則來對(duì)Edge SDK端進(jìn)行控制丘损,例如,數(shù)據(jù)上傳的頻次降低、語音控制的迅速反饋而钞,某些條件和規(guī)則的觸發(fā)等等。簡單的事件處理袱结,將通過本地的IOT端完成,例如而晒,嫌疑犯的識(shí)別現(xiàn)在已經(jīng)有很多攝像頭本身帶有此功能贱枣。
IOTA大數(shù)據(jù)架構(gòu)纽哥,主要有如下幾個(gè)特點(diǎn):
●去ETL化:ETL和相關(guān)開發(fā)一直是大數(shù)據(jù)處理的痛點(diǎn)簇捍,IOTA架構(gòu)通過Common Data Model的設(shè)計(jì),專注在某一個(gè)具體領(lǐng)域的數(shù)據(jù)計(jì)算梯投,從而可以從SDK端開始計(jì)算尔许,中央端只做采集味廊、建立索引和查詢余佛,提高整體數(shù)據(jù)分析的效率。
●?Ad-hoc即時(shí)查詢:鑒于整體的計(jì)算流程機(jī)制憔恳,在手機(jī)端、智能IOT事件發(fā)生之時(shí),就可以直接傳送到云端進(jìn)入real time data區(qū),可以被前端的Query Engine來查詢。此時(shí)用戶可以使用各種各樣的查詢压恒,直接查到前幾秒發(fā)生的事件,而不用在等待ETL或者Streaming的數(shù)據(jù)研發(fā)和處理伦吠。
●?邊緣計(jì)算(Edge-Computing):將過去統(tǒng)一到中央進(jìn)行整體計(jì)算芯勘,分散到數(shù)據(jù)產(chǎn)生荷愕、存儲(chǔ)和查詢端,數(shù)據(jù)產(chǎn)生既符合Common Data Model抛杨。同時(shí)蝶桶,也給與Realtime model feedback真竖,讓客戶端傳送數(shù)據(jù)的同時(shí)馬上進(jìn)行反饋恢共,而不需要所有事件都要到中央端處理之后再進(jìn)行下發(fā)讨韭。
如上圖透硝,IOTA架構(gòu)有各種各樣的實(shí)現(xiàn)方法濒生,為了驗(yàn)證IOTA架構(gòu)罪治,易觀也自主設(shè)計(jì)并實(shí)現(xiàn)了“秒算”引擎觉义,目前支持易觀內(nèi)部月活5.5億設(shè)備端進(jìn)行計(jì)算的同時(shí)晒骇,也基于“秒算”引擎研發(fā)出了可以獨(dú)立部署在企業(yè)客戶內(nèi),進(jìn)行數(shù)字用戶分析和營銷的“易觀方舟”厉碟,可以訪問ark.analysys.cn進(jìn)行體驗(yàn)崭参。
在大數(shù)據(jù)3.0時(shí)代款咖,Lambda大數(shù)據(jù)架構(gòu)已經(jīng)無法滿足企業(yè)用戶日常大數(shù)據(jù)分析和精益運(yùn)營的需要,去ETL化的IOTA大數(shù)據(jù)架構(gòu)才是未來海洼。