天天看點

大資料架構,從Lambda到IOTA

經過這麼多年的發展,已經從大資料1.0的BI/Datawarehouse時代,經過大資料2.0的Web/APP過渡,進入到了IOT的大資料3.0時代,而随之而來的是資料架構的變化。

▌Lambda架構

在過去Lambda資料架構成為每一個公司大資料平台必備的架構,它解決了一個公司大資料批量離線處理和實時資料處理的需求。一個典型的Lambda架構如下:

大資料架構,從Lambda到IOTA

資料從底層的資料源開始,經過各種各樣的格式進入大資料平台,在大資料平台中經過Kafka、Flume等資料元件進行收集,然後分成兩條線進行計算。一條線是進入流式計算平台(例如 Storm、Flink或者Spark Streaming),去計算實時的一些名額;另一條線進入批量資料處理離線計算平台(例如Mapreduce、Hive,Spark SQL),去計算T+1的相關業務名額,這些名額需要隔日才能看見。

Lambda架構經曆多年的發展,其優點是穩定,對于實時計算部分的計算成本可控,批量處理可以用晚上的時間來整體批量計算,這樣把實時計算和離線計算高峰分開,這種架構支撐了資料行業的早期發展,但是它也有一些緻命缺點,并在大資料3.0時代越來越不适應資料分析業務的需求。缺點如下:

● 實時與批量計算結果不一緻引起的資料口徑問題:因為批量和實時計算走的是兩個計算架構和計算程式,算出的結果往往不同,經常看到一個數字當天看是一個資料,第二天看昨天的資料反而發生了變化。

● 批量計算在計算視窗内無法完成:在IOT時代,資料量級越來越大,經常發現夜間隻有4、5個小時的時間視窗,已經無法完成白天20多個小時累計的資料,保證早上上班前準時出資料已成為每個大資料團隊頭疼的問題。

●資料源變化都要重新開發,開發周期長:每次資料源的格式變化,業務的邏輯變化都需要針對ETL和Streaming做開發修改,整體開發周期很長,業務反應不夠迅速。

● 伺服器存儲大:資料倉庫的典型設計,會産生大量的中間結果表,造成資料急速膨脹,加大伺服器存儲壓力。

▌Kappa架構

針對Lambda架構的需要維護兩套程式等以上缺點,LinkedIn的Jay Kreps結合實際經驗和個人體會提出了Kappa架構。Kappa架構的核心思想是通過改進流計算系統來解決資料全量處理的問題,使得實時計算和批處理過程使用同一套代碼。此外Kappa架構認為隻有在有必要的時候才會對曆史資料進行重複計算,而如果需要重複計算時,Kappa架構下可以啟動很多個執行個體進行重複計算。

一個典型的Kappa架構如下圖所示:

大資料架構,從Lambda到IOTA

Kappa架構的核心思想,包括以下三點:

1.用Kafka或者類似MQ隊列系統收集各種各樣的資料,你需要幾天的資料量就儲存幾天。

2.當需要全量重新計算時,重新起一個流計算執行個體,從頭開始讀取資料進行處理,并輸出到一個新的結果存儲中。

3.當新的執行個體做完後,停止老的流計算執行個體,并把老的一些結果删除。

Kappa架構的優點在于将實時和離線代碼統一起來,友善維護而且統一了資料口徑的問題。而Kappa的缺點也很明顯:

● 流式處理對于曆史資料的高吞吐量力不從心:所有的資料都通過流式計算,即便通過加大并發執行個體數亦很難适應IOT時代對資料查詢響應的即時性要求。

● 開發周期長:此外Kappa架構下由于采集的資料格式的不統一,每次都需要開發不同的Streaming程式,導緻開發周期長。

● 伺服器成本浪費:Kappa架構的核心原理依賴于外部高性能存儲redis,hbase服務。但是這2種系統元件,又并非設計來滿足全量資料存儲設計,對伺服器成本嚴重浪費。

▌IOTA架構

而在IOT大潮下,智能手機、PC、智能硬體裝置的計算能力越來越強,而業務需求要求資料實時響應需求能力也越來越強,過去傳統的中心化、非實時化資料處理的思路已經不适應現在的大資料分析需求,我提出新一代的大資料IOTA架構來解決上述問題,整體思路是設定标準資料模型,通過邊緣計算技術把所有的計算過程分散在資料産生、計算和查詢過程當中,以統一的資料模型貫穿始終,進而提高整體的預算效率,同時滿足即時計算的需要,可以使用各種Ad-hoc Query來查詢底層資料:

大資料架構,從Lambda到IOTA

IOTA整體技術結構分為幾部分:

● Common Data Model:貫穿整體業務始終的資料模型,這個模型是整個業務的核心,要保持SDK、cache、曆史資料、查詢引擎保持一緻。對于使用者資料分析來講可以定義為“主-謂-賓”或者“對象-事件”這樣的抽象模型來滿足各種各樣的查詢。以大家熟悉的APP使用者模型為例,用“主-謂-賓”模型描述就是“X使用者 – 事件1 – A頁面(2018/4/11 20:00) ”。當然,根據業務需求的不同,也可以使用“産品-事件”、“地點-時間”模型等等。模型本身也可以根據協定(例如 protobuf)來實作SDK端定義,中央存儲的方式。此處核心是,從SDK到存儲到處理是統一的一個Common Data Model。

●Edge SDKs & Edge Servers:這是資料的采集端,不僅僅是過去的簡單的SDK,在複雜的計算情況下,會賦予SDK更複雜的計算,在裝置端就轉化為形成統一的資料模型來進行傳送。例如對于智能Wi-Fi采集的資料,從AC端就變為“X使用者的MAC 位址-出現- A樓層(2018/4/11 18:00)”這種主-謂-賓結構,對于攝像頭會通過Edge AI Server,轉化成為“X的Face特征- 進入- A火車站(2018/4/11 20:00)”。也可以是上面提到的簡單的APP或者頁面級别的“X使用者 – 事件1 – A頁面(2018/4/11 20:00) ”,對于APP和H5頁面來講,沒有計算工作量,隻要求埋點格式即可。

● Real Time Data:實時資料緩存區,這部分是為了達到實時計算的目的,海量資料接收不可能海量實時入曆史資料庫,那樣會出現建立索引延遲、曆史資料碎片檔案等問題。是以,有一個實時資料緩存區來存儲最近幾分鐘或者幾秒鐘的資料。這塊可以使用Kudu或者Hbase等元件來實作。這部分資料會通過Dumper來合并到曆史資料當中。此處的資料模型和SDK端資料模型是保持一緻的,都是Common Data Model,例如“主-謂-賓”模型。

● Historical Data:曆史資料沉浸區,這部分是儲存了大量的曆史資料,為了實作Ad-hoc查詢,将自動建立相關索引提高整體曆史資料查詢效率,進而實作秒級複雜查詢百億條資料的回報。例如可以使用HDFS存儲曆史資料,此處的資料模型依然SDK端資料模型是保持一緻的Common Data Model。

● Dumper:Dumper的主要工作就是把最近幾秒或者幾分鐘的實時資料,根據彙聚規則、建立索引,存儲到曆史存儲結構當中,可以使用map reduce、C、Scala來撰寫,把相關的資料從Realtime Data區寫入Historical Data區。

● Query Engine:查詢引擎,提供統一的對外查詢接口和協定(例如SQL JDBC),把Realtime Data和Historical Data合并到一起查詢,進而實作對于資料實時的Ad-hoc查詢。例如常見的計算引擎可以使用presto、impala、clickhouse等。

● Realtime model feedback:通過Edge computing技術,在邊緣端有更多的互動可以做,可以通過在Realtime Data去設定規則來對Edge SDK端進行控制,例如,資料上傳的頻次降低、語音控制的迅速回報,某些條件和規則的觸發等等。簡單的事件處理,将通過本地的IOT端完成,例如,嫌疑犯的識别現在已經有很多攝像頭本身帶有此功能。

IOTA大資料架構,主要有如下幾個特點:

●去ETL化:ETL和相關開發一直是大資料處理的痛點,IOTA架構通過Common Data Model的設計,專注在某一個具體領域的資料計算,進而可以從SDK端開始計算,中央端隻做采集、建立索引和查詢,提高整體資料分析的效率。

● Ad-hoc即時查詢:鑒于整體的計算流程機制,在手機端、智能IOT事件發生之時,就可以直接傳送到雲端進入real time data區,可以被前端的Query Engine來查詢。此時使用者可以使用各種各樣的查詢,直接查到前幾秒發生的事件,而不用在等待ETL或者Streaming的資料研發和處理。

● 邊緣計算(Edge-Computing):将過去統一到中央進行整體計算,分散到資料産生、存儲和查詢端,資料産生既符合Common Data Model。同時,也給與Realtime model feedback,讓用戶端傳送資料的同時馬上進行回報,而不需要所有事件都要到中央端處理之後再進行下發。

大資料架構,從Lambda到IOTA

如上圖,IOTA架構有各種各樣的實作方法,為了驗證IOTA架構,易觀也自主設計并實作了“秒算”引擎,目前支援易觀内部月活5.5億裝置端進行計算的同時,也基于“秒算”引擎研發出了可以獨立部署在企業客戶内,進行數字使用者分析和營銷的“易觀方舟”,可以通路ark.analysys.cn進行體驗。

在大資料3.0時代,Lambda大資料架構已經無法滿足企業使用者日常大資料分析和精益營運的需要,去ETL化的IOTA大資料架構才是未來。

原文:http://www.sohu.com/a/228020781_115326

繼續閱讀