天天看點

雲原生資料湖建構、管理與分析—宋軍

内容簡要:

一、資料湖介紹

二、資料湖架構與技術探索

三、阿裡雲雲原生資料湖實踐

(一)什麼是資料湖?

數字化趨勢下,許多企業通過利用資料的價值達到業務上的提升,資料量爆炸性增長使得源頭越來越豐富,例如資料庫資料、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統一進制資料/權限,做中間橫向的基礎設施,打通資料庫的資料與上層引擎。

雲原生資料湖建構、管理與分析—宋軍