内容簡要:
一、資料湖介紹
二、資料湖架構與技術探索
三、阿裡雲雲原生資料湖實踐
(一)什麼是資料湖?
數字化趨勢下,許多企業通過利用資料的價值達到業務上的提升,資料量爆炸性增長使得源頭越來越豐富,例如資料庫資料、APP日志、伺服器日志、LT資料。
在這種背景下,需要更好的資料架構支撐,且能夠更靈活的支撐上層各種各樣場景的分析,與資料庫相關的有:
HDFS/OSS/S3資料存儲類元件;
阿裡雲OSS對象存儲;
Delta Lake資料庫格式;
Hudi/Iceberg資料庫元件;
湖倉一體的DataWarehouse/LakeHouse。
什麼是資料湖?
如下圖所示:

中間是存儲,底層資料通過實時或離線的方式進入資料庫中,上層在資料庫中做分析或學習,這是比較簡單的Pipeline。
阿裡雲資料庫雲上流程如下圖所示:
資料的流入有許多産品支援,主要圍繞OSS對象存儲。資料流入後,支援資料分析和服務,包括對流入的資料做資料治理、安全權限。
上圖為Delta Lake網站上資料湖的一種場景。
通過流式或者批式的方式導入到資料湖上,資料湖底層的存儲如HDFS、S3、Azure Data Lake Storage對象存儲,上層是資料庫格式,提供更豐富的場景支撐能力。
上圖為另外一個資料庫格式下,Hudi網站上一個Pipeline圖。它有很多資料源,通過Hudi的工具,将資料寫到Hudi格式裡面。 Hudi格式底層是一些分布式存儲或者對象存儲,還有Alluxio加速。
目前資料湖的定義存在些許差别。
如Wikipedia對資料湖的定義是原始資料的存儲,支援後續分析和學習,存儲結構化資料和非結構化資料,可以建構線上下的機房裡面,也可以在雲上建構資料庫。
AWS對資料湖的定義是一個中心化的存儲,存儲結構化資料和非結構化資料,可以做各種各樣的分析。
微軟對資料湖的定義是提供許多相關的産品與工具,讓開發者或者資料科學家能夠存儲各種各樣的資料類型,提供各種各樣分析的能力或平台。
概括來說,資料庫是:
·一個中心化的存儲,接入不同資料源,可以存儲半結構化、結構化和非結構化的資料。
·存儲偏原始的資料,可以支撐上層各種各樣的分析。
Keywords:
·Centralized repository;
·Streaming&batch ingest;
·Semi-structured/unstructured/structured;
·Data as-is/raw data;
·Support different types of analytics.
資料湖偏原始的資料,資料入庫的時候不需要做模組化,資料倉庫需要提前做各種模組化,管理與定義Schema,然後資料才能進來。資料湖是資料先進來,分析的時候抓取Schema,再去做分析。資料倉庫是結構化的資料。
資料湖類型比較豐富,是開放的存儲。上層可以對接分析引擎,例如可以機器學習、查詢,或者在資料湖基礎上建構一個數倉。資料湖較為開放、靈活。對比之下,資料倉庫較為封閉。存儲與引擎為一體,存儲在引擎下面,做優化時需要結合引擎。
資料倉庫導入過程會對檔案做優化或索引,對資料品質由Schema保證,上層的資料治理權限較為完善。資料湖靈活、開放,但在資料治理、安全上有隐患,導入時可能存在小檔案的問題。
現在資料倉庫向湖倉一體方向發展,結合資料湖的靈活性和開放性,以及資料倉庫的資料治理與安全,導入的資料品質,整套的體系較為完善。
資料湖體系裡面,各自有不同的位置,HDFS/OSS/S3是資料湖存儲,Delta Lake/Hudi/Iceberg是資料庫格式,DataWarehouse/LakeHouse資料湖上層應用場景。
(二)為什麼要用資料湖?
企業做數字化轉型,需要從不同的角度與地點采集資料,将爆炸性增長的資料挖掘與利用。
資料源和資料類型越來越多,如LT相關的資料,業務資料庫相關的資料等。資料湖暫時無規劃的資料,等有需要的時候再将資料做分析處理,導入到資料倉裡做後續查詢。資料湖有非常靈活的特性,能夠支撐上層分析場景,豐富的資料可以用于支援後續的分析與架構。
(三)資料湖問題與挑戰
根據公開媒體報道,資料湖建設失敗的案例不在少數。
不經考慮、未加管理、毫無條理的資料存儲不能給資料分析帶來任何幫助,如果缺少必要的資料管理、中繼資料擷取、品質管理、安全管理能力和過程,或是未能正确圍繞一個業務中心正确開展,資料湖終将變成無用的資料沼澤。
基于上圖的結構,分析資料湖在實踐中會遇到哪些問題:
Ø 資料攝入(入湖)
·資料源太多,入湖開發成本高;
·資料品質無法保障(髒資料、重複資料、Schema缺少……);
·要求實時入湖做分析時,中間資料可能分出現問題。
Ø 資料存儲
·資料量增長,需要考慮成本、擴充性、性能的問題。
Ø 資料管理分析
·缺乏中繼資料管理、發現,分析困難;
·性能與安全上沒有保障。
(一)資料庫架構
如上圖所示,資料庫架構Pipeline分為很多層。
原始是資料源,其次是攝入層,指資料入湖包括實時與成批的導入。第三層是存儲層,支撐後續不同場景的計算。接着是應用層,橫向向後是資料治理,包括運維的資料品質等。在這個架構下,能夠更好的挖掘資料庫的資料價值,并發揮出其價值。
(二)資料攝⼊/⼊湖
資料攝入(入湖)需要解決的問題,總結如下:
Ø 資料源很多,同步/ETL開發成本;
Ø 如何避免資料沼澤,提高資料品質/可用性;
Ø 提供資料更新訂正能力,Schema演化;
Ø 如何保證鍊路上的Exactly Once;
Ø 實時入湖讀寫如何隔離,防止髒讀。
如何去解決資料攝⼊(⼊湖)的問題,下面以某個産品為例:
對于解決資料源很多,同步/ETL開發成本的問題,整體上通過拖拽或者配置的方式,拖拽資料源進行配置,建構Pipeline。或者通過常用資料源/ETL算子進行配置的方式建構Pipeline。定義ETL算子在相關場景下是可以複用的,通過資料源把它抽象到産品中。對于典型的實時數倉(資料庫Binlog同步),鍊路上還是有很多工作。
資料攝入/入湖還需要解決以下幾個問題:
1)避免資料沼澤,提高資料品質/可用性;
2)提供資料更新訂正能力, Schema演化;
3)如何保證鍊路上的Exactly Once;
4)實時⼊湖讀寫如何隔離,防止髒讀。
資料湖整體功能趨向統一,如DELTA LAKE提供資料更新訂正能⼒,Scheme演化能力。但是它們各有所長,如Hudi比較擅長的Upset場景,ICEBERG偏向于索引與性能。
DELTA LAKE如何解決Update&Delete&Merge等相關問題?
底層資料是Parquet格式,可以管理源資料,中間是MetadataManagement,上面支援Transactions。
基于這三層,資料可以通過Streaming實時寫入Delta Lake,後續可以用Presto或者Spark實時查詢。
這種方式有隔離的特性支撐,相當于有Update&Delete&Merge、演化Schema和查詢 Time Travel曆史上某個時間點資料的能力。
(三)資料湖存儲
資料量很大時需要考慮成本(包括運維成本)、擴充、性能,選擇不同的存儲方式有不同的特點。
HDFS
1)叢集規模瓶頸;
2)NameNode壓力;
3)規劃叢集複雜;
4)運維難度大;
5)成本高;
6)性能高。
對象存儲OSS/Amazon S3
1)按需計費,無限擴容;
2)存算分離,規劃簡單;
3)運維簡單;
4)性能需優化(帶寬/中繼資料操作)。
(四)資料湖分析
資料湖如何支撐上層的多場景多引擎高性能挖掘資料價值。
總結如下:
Ø 統一進制資料管理/發現;
Ø 引擎深度優化;
Ø 多種接口多語言通路支援(posix/filesystem/c++/java/…);
Ø 企業級安全(認證/權限/…)。
如上圖所示,阿裡雲雲原生資料湖架構由多個部分組成。
首先資料源裡有日志資料、資料庫資料。資料源通過資料庫建構産品,管理資料庫的語言資料、通路控制、表或列的權限等,提供入湖解決方案,包括資料湖中繼資料、通路控制、入湖工具,建構入湖的Pipeline。
資料湖存儲是圍繞對象存儲OSS,支援Delta Lake、Hudi、Iceberg等資料庫格式,能夠解決資料标準、低頻、歸檔等資料湖上面的問題。
在這個基礎上,為了支撐上層的引擎分析、資料挖掘,提供了JindoFS。JindoFS是能夠把大資料體系結合起來的中間層。能夠封裝的标準的API,使上層的Spark、Presto能夠對接上OSS資料。
再往上是雲原生計算引擎,如EMS基本上都是開源的元件。最上層為資料開發治理,使用者做資料開發治理的平台。
(五)資料湖建構/DLF
資料庫建構(DLF)主要功能是橫向的基礎設施,解決資料庫的管理。
功能包括:
Ø 資料入湖
支援多種資料源一鍵入湖模闆;
支援Delta/Hudi/Parqute等格式;
支援實時入湖(CDC\KAFKA\SLS\…)。
Ø 中繼資料服務
相容開源生态API;
自動爬取Schema;
多引擎對接(Spark/Hive/MC/Holo/…)。
Ø 權限管理
支援表/列權限控制;
支援OSS權限托管。
下面是資料入湖核心上做的工作。
從架構來看,底層是Delta Lake、OSS、Hudi、HDFS,上面是Spark、Presto等引擎。對Delta/Hudi做了性能優化和功能的增強,如自動的小檔案合并,SparkSQL和Spark Streaming SQL深度內建,讓使用者能夠用SQL的方式寫Pipeline,降低開發門檻,查詢引擎優化,OSS Rename原子性。
如上圖所示,Spark Streaming SQL是官方文檔,可以像寫離線SQL那樣去寫流失的作業的這種SQL,功能包括動态分區表等。
(六)資料湖存儲/JindoFS
JindoFS是在OSS和引擎之間把大資料串起來的一個元件,它同時做了性能優化。
阿裡雲OSS SDK 是對象存儲接口,本身并不能直接用于 Hadoop/Spark
• 類似于 AWS 的 EMRFS,Hadoop 社群的 S3A FS
• 對 OSS 通路支援 RAM/AK 免密,支援 Credentials Provider
• 和 Hadoop 社群版本相比:
o 核⼼代碼Native 優化,各種基本操作大幅性能提升(> 60%)
o 大目錄Listing操作,快1X
o 大目錄Rename操作,快3X
o 支援無需Rename的Job Committer
• 提供Cache模式/Block模式
• 提供 POSIX/FUSE 支援
• 提供 TensorFlow FileSystem Connector
• 提供 Python SDK
• 在大檔案/小檔案訓練資料測試上,具有顯著性能優勢
• 支援多種選項:預設無緩存、中繼資料緩存和資料緩存
• 針對訓練材料Batch大檔案和大量小檔案分别優化
• 支援指令式預加載、周期性自動加載到緩存,加速後續訓練
• 支援轉儲加載結構化半結構化資料到緩存,加速後續訓練
(七)資料湖分析
資料湖分析主要是DLF統一進制資料/權限,做中間橫向的基礎設施,打通資料庫的資料與上層引擎。