常用的幾種大資料架構剖析
資料分析工作雖然隱藏在業務系統背後,但是具有非常重要的作用,資料分析的結果對決策、業務發展有著舉足輕重的作用。隨著大資料技術的發展,資料探勘、資料探索等專有名詞曝光度越來越高,但是在類似於Hadoop系列的大資料分析系統大行其道之前,資料分析工作已經經歷了長足的發展,尤其是以BI系統為主的資料分析,已經有了非常成熟和穩定的技術方案和生態系統,對於BI系統來說,大概的架構圖如下:
可以看到在BI系統裡面,核心的模組是Cube,Cube是一個更高層的業務模型抽象,在Cube之上可以進行多種操作,例如上鑽、下鑽、切片等操作。大部分BI系統都基於關係型資料庫,關係型資料庫使用SQL語句進行操作,但是SQL在多維操作和分析的表示能力上相對較弱,所以Cube有自己獨有的查詢語言MDX,MDX表示式具有更強的多維表現能力,所以以Cube為核心的分析系統基本佔據著資料統計分析的半壁江山,大多數的資料庫服務廠商直接提供了BI套裝軟體服務,輕易便可搭建出一套Olap分析系統。不過BI的問題也隨著時間的推移逐漸顯露出來:
- BI系統更多的以分析業務資料產生的密度高、價值高的結構化資料為主,對於非結構化和半結構化資料的處理非常乏力,例如圖片,文字,音訊的儲存,分析。
- 由於資料倉庫為結構化儲存,在資料從其他系統進入資料倉庫這個東西,我們通常叫做ETL過程,ETL動作和業務進行了強繫結,通常需要一個專門的ETL團隊去和業務做銜接,決定如何進行資料的清洗和轉換。
- 隨著異構資料來源的增加,例如如果存在視訊,文字,圖片等資料來源,要解析資料內容進入資料倉庫,則需要非常複雜等ETL程式,從而導致ETL變得過於龐大和臃腫。
- 當資料量過大的時候,效能會成為瓶頸,在TB/PB級別的資料量上表現出明顯的吃力。
- 資料庫的正規化等約束規則,著力於解決資料冗餘的問題,是為了保障資料的一致性,但是對於資料倉庫來說,我們並不需要對資料做修改和一致性的保障,原則上來說資料倉庫的原始資料都是隻讀的,所以這些約束反而會成為影響效能的因素。
- ETL動作對資料的預先假設和處理,導致機器學習部分獲取到的資料為假設後的資料,因此效果不理想。例如如果需要使用資料倉庫進行異常資料的挖掘,則在資料入庫經過ETL的時候就需要明確定義需要提取的特徵資料,否則無法結構化入庫,然而大多數情況是需要基於異構資料才能提取出特徵。
在一系列的問題下,以Hadoop體系為首的大資料分析平臺逐漸表現出優異性,圍繞Hadoop體系的生態圈也不斷的變大,對於Hadoop系統來說,從根本上解決了傳統資料倉庫的瓶頸的問題,但是也帶來一系列的問題:
- 從資料倉庫升級到大資料架構,是不具備平滑演進的,基本等於推翻重做。
- 大資料下的分散式儲存強調資料的只讀性質,所以類似於Hive,HDFS這些儲存方式都不支援update,HDFS的write操作也不支援並行,這些特性導致其具有一定的侷限性。
基於大資料架構的資料分析平臺側重於從以下幾個維度去解決傳統資料倉庫做資料分析面臨的瓶頸:
- 分散式計算:分散式計算的思路是讓多個節點平行計算,並且強調資料本地性,儘可能的減少資料的傳輸,例如Spark通過RDD的形式來表現資料的計算邏輯,可以在RDD上做一系列的優化,來減少資料的傳輸。
- 分散式儲存:所謂的分散式儲存,指的是將一個大檔案拆成N份,每一份獨立的放到一臺機器上,這裡就涉及到檔案的副本,分片,以及管理等操作,分散式儲存主要優化的動作都在這一塊。
- 檢索和儲存的結合:在早期的大資料元件中,儲存和計算相對比較單一,但是目前更多的方向是在儲存上做更多的手腳,讓查詢和計算更加高效,對於計算來說高效不外乎就是查詢資料快,讀取資料快,所以目前的儲存不單單的儲存資料內容,同時會新增很多元資訊,例如索引資訊。像類似於parquet和carbondata都是這樣的思想。
總的來說,目前圍繞Hadoop體系的大資料架構大概有以下幾種:
傳統大資料架構
之所以叫傳統大資料架構,是因為其定位是為了解決傳統BI的問題,簡單來說,資料分析的業務沒有發生任何變化,但是因為資料量、效能等問題導致系統無法正常使用,需要進行升級改造,那麼此類架構便是為了解決這個問題。可以看到,其依然保留了ETL的動作,將資料經過ETL動作進入資料儲存。
優點:簡單,易懂,對於BI系統來說,基本思想沒有發生變化,變化的僅僅是技術選型,用大資料架構替換掉BI的元件。
缺點:對於大資料來說,沒有BI下如此完備的Cube架構,雖然目前有kylin,但是kylin的侷限性非常明顯,遠遠沒有BI下的Cube的靈活度和穩定度,因此對業務支撐的靈活度不夠,所以對於存在大量報表,或者複雜的鑽取的場景,需要太多的手工定製化,同時該架構依舊以批處理為主,缺乏實時的支撐。
適用場景:資料分析需求依舊以BI場景為主,但是因為資料量、效能等問題無法滿足日常使用。
流式架構
在傳統大資料架構的基礎上,流式架構非常激進,直接拔掉了批處理,資料全程以流的形式處理,所以在資料接入端沒有了ETL,轉而替換為資料通道。經過流處理加工後的資料,以訊息的形式直接推送給了消費者。雖然有一個儲存部分,但是該儲存更多的以視窗的形式進行儲存,所以該儲存並非發生在資料湖,而是在外圍系統。
優點:沒有臃腫的ETL過程,資料的實效性非常高。
缺點:對於流式架構來說,不存在批處理,因此對於資料的重播和歷史統計無法很好的支撐。對於離線分析僅僅支撐視窗之內的分析。
適用場景:預警,監控,對資料有有效期要求的情況。
Lambda架構
Lambda架構算是大資料系統裡面舉足輕重的架構,大多數架構基本都是Lambda架構或者基於其變種的架構。Lambda的資料通道分為兩條分支:實時流和離線。實時流依照流式架構,保障了其實時性,而離線則以批處理方式為主,保障了最終一致性。什麼意思呢?流式通道處理為保障實效性更多的以增量計算為主輔助參考,而批處理層則對資料進行全量運算,保障其最終的一致性,因此Lambda最外層有一個實時層和離線層合併的動作,此動作是Lambda裡非常重要的一個動作,大概的合併思路如下:
優點:既有實時又有離線,對於資料分析場景涵蓋的非常到位。
缺點:離線層和實時流雖然面臨的場景不相同,但是其內部處理的邏輯卻是相同,因此有大量榮譽和重複的模組存在。
適用場景:同時存在實時和離線需求的情況。
Kappa架構
Kappa架構在Lambda 的基礎上進行了優化,將實時和流部分進行了合併,將資料通道以訊息佇列進行替代。因此對於Kappa架構來說,依舊以流處理為主,但是資料卻在資料湖層面進行了儲存,當需要進行離線分析或者再次計算的時候,則將資料湖的資料再次經過訊息佇列重播一次則可。
優點:Kappa架構解決了Lambda架構裡面的冗餘部分,以資料可重播的超凡脫俗的思想進行了設計,整個架構非常簡潔。
缺點:雖然Kappa架構看起來簡潔,但是施難度相對較高,尤其是對於資料重播部分。
適用場景:和Lambda類似,改架構是針對Lambda的優化。
Unifield架構
以上的種種架構都圍繞海量資料處理為主,Unifield架構則更激進,將機器學習和資料處理揉為一體,從核心上來說,Unifield依舊以Lambda為主,不過對其進行了改造,在流處理層新增了機器學習層。可以看到資料在經過資料通道進入資料湖後,新增了模型訓練部分,並且將其在流式層進行使用。同時流式層不單使用模型,也包含著對模型的持續訓練。
優點:Unifield架構提供了一套資料分析和機器學習結合的架構方案,非常好的解決了機器學習如何與資料平臺進行結合的問題。
缺點:Unifield架構實施複雜度更高,對於機器學習架構來說,從軟體包到硬體部署都和資料分析平臺有著非常大的差別,因此在實施過程中的難度係數更高。
適用場景:有著大量資料需要分析,同時對機器學習方便又有著非常大的需求或者有規劃。
總結
以上幾種架構為目前資料處理領域使用比較多的幾種架構,當然還有非常多其他架構,不過其思想都會或多或少的類似。資料領域和機器學習領域會持續發展,以上幾種思想或許終究也會變得過時。