Delta Lake和Hudi是數據湖方案中常用的存儲機制,為數據湖提供流處理、批處理能力。MaxCompute基于阿里云DLF、RDS或Flink、OSS產品提供了支持Delta或Hudi存儲機制的湖倉一體架構。您可以通過MaxCompute查詢到實時數據,即時洞察業務數據變化。
背景信息
通常,企業構建和應用數據湖需要經歷數據入湖、數據湖存儲與管理、數據探索與分析過程。MaxCompute基于阿里云DLF(Data Lake Formation)、RDS(Relational Database Service)或Flink、OSS(Object Storage Service)產品提供了支持Delta Lake或Hudi存儲機制的湖倉一體架構,架構圖如下。
模塊 | 對應阿里云產品 | 說明 |
在線數據庫 | 準備的入湖數據來源,即數據湖的數據來源。 | |
實時計算 | 準備的入湖數據來源,即數據湖的數據來源。 | |
數據入湖 | 對接在線數據庫,管理入湖數據來源。 | |
數據湖存儲與管理 | 將在線數據庫中的源數據引入數據湖時,OSS會作為數據湖的統一存儲,存儲機制包含Delta Lake和Hudi兩種。同時,DLF采用元數據管理功能管理元數據庫和元數據表。 | |
數據湖探索與分析 |
| 對數據湖數據進行分析。 |
前提條件
已開通如下服務或已創建實例、項目:
已開通OSS服務。
更多開通OSS服務操作,請參見開通OSS服務。
已開通DTS服務。
您可以單擊此處一鍵授權,為后續操作MaxCompute項目的阿里云賬號授予AliyunDTSDefaultrole角色,授權即表示開通了DTS服務。
已創建RDS MySQL實例或Flink全托管實例。
如果您想實現基于DLF、RDS、OSS支持Delta Lake或Hudi存儲機制,需創建RDS MySQL實例,詳情請參見創建RDS MySQL實例。
如果您想實現基于DLF、Flink、OSS支持Hudi存儲機制,需創建Flink全托管實例,詳情請參見開通實時計算Flink版。
已開通DataWorks服務。
更多開通DataWorks操作,請參見開通DataWorks。
已開通DLF。
已創建MaxCompute項目(非External Project)。
更多創建MaxCompute項目信息,請參見創建MaxCompute項目。假設已創建的MaxCompute項目名稱為
doc_test_prod
,所屬地域為華東2(上海)。
使用限制
基于Delta Lake或Hudi存儲機制的湖倉一體方案的使用限制如下:
僅華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華南1(深圳)、中國香港、新加坡和德國(法蘭克福)地域支持構建湖倉一體能力。
MaxCompute需要與DLF、OSS、RDS或Flink部署在同一地域。
MaxCompute只支持對Hudi、Delta Lake格式文件的全部列進行讀取,不支持增量讀、快照讀以及寫等操作。
基于DLF、RDS、OSS支持Delta Lake或Hudi存儲機制
操作流程
為操作MaxCompute項目的賬號授予訪問DLF和OSS的權限。
創建OSS存儲空間作為數據湖的統一存儲路徑。
創建RDS數據庫,準備入湖數據。
通過創建數據源對接RDS與DLF。
基于DLF創建數據入湖任務,將RDS數據庫中的表數據實時同步并回放到數據湖中。
通過DataWorks控制臺的數據湖集成界面創建External Project,對數據湖數據進行分析。
步驟一:授予MaxCompute訪問DLF和OSS的權限
步驟二:在OSS中創建存儲空間及目錄
創建OSS存儲空間作為數據湖的統一存儲路徑。
登錄OSS管理控制臺。
在左側導航欄,單擊Bucket列表,在Bucket列表頁面,單擊創建Bucket。
在創建Bucket面板填寫Bucket名稱,例如
mc-dlf-oss
,并選擇地域,例如華東2(上海)
后,單擊確定。在左側導航欄,單擊文件管理后,在右側區域單擊新建目錄并填寫目錄名,例如
covid-19
,單擊確定。
步驟三:準備入湖數據
基于阿里云RDS構造數據庫,并創建表、準備入湖數據。
訪問RDS實例列表,在上方選擇地域。例如
華東2(上海)
,然后單擊目標實例ID。創建RDS數據庫賬號。在目標實例信息頁面的左側導航欄單擊賬號管理后,在用戶賬號頁簽單擊創建賬號,并在創建賬號面板配置下表所列參數信息,單擊確定。
參數名稱
說明
樣例值
數據庫賬號
訪問RDS數據庫的賬號。創建RDS數據庫時會綁定此信息。
datalake_mcdbuser
賬號類型
賬號包含如下兩種:
普通賬號:后續需要綁定至RDS數據庫。
高權限賬號:無需選擇要授權的數據庫,擁有實例中所有數據庫的權限。
普通賬號
密碼
賬號對應的密碼信息。
無
確認密碼
再次確認賬號對應的密碼信息。
無
更多參數解釋,請參見創建賬號。
創建RDS數據庫。在目標實例信息頁面的左側導航欄單擊數據庫管理>創建數據庫,設置如下參數。
參數
說明
數據庫(DB)名稱
最長63個字符。
由小寫字母、數字、中劃線、下劃線組成。
以字母開頭,以字母或數字結尾。
支持字符集
數據庫的字符集。
Collate
字符串排序規則。
Ctype
字符分類。
授權賬號
設置數據庫的所有者,對數據庫擁有ALL權限。
備注說明
填寫備注信息。
為RDS數據庫創建表并插入少量測試數據,具體操作請參見通過DMS登錄RDS MySQL。如表名為anti_fraud_result,命令示例如下。
CREATE TABLE `anti_fraud_result` ( `transactionid` varchar(32) NOT NULL, `uid` varchar(32) DEFAULT NULL, `card` varchar(32) DEFAULT NULL, `longitude` double(12,8) DEFAULT '12.00000000', `latitude` double(12,8) DEFAULT '12.00000000', PRIMARY KEY (`transactionid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; INSERT INTO `anti_fraud_result` values ("12489571","82005","123123",3.14592040,101.12315432); INSERT INTO `anti_fraud_result` values ("12489572","82005","123123",3.14592040,101.12315432); INSERT INTO `anti_fraud_result` values ("12489573","82005","123123",3.14592040,101.12315432); INSERT INTO `anti_fraud_result` values ("12489574","82005","123123",3.14592040,101.12315432);
步驟四:在DLF中創建元數據庫(可選)
用于步驟五:創建并啟動入湖任務中的單表離線同步方式,如果您使用下述的整庫實時同步方式則無需執行此步驟。
通過創建元數據庫來管理DLF湖中的數據。
登錄數據湖構建控制臺,在左上角選擇地域,例如
華東2(上海)
。創建元數據庫。例如datalake。
在左側導航欄,選擇 ,在數據庫頁簽,單擊新建數據庫。
在新建數據庫對話框,配置相關參數。
參數
描述
示例
所屬數據目錄
數據存儲的數據庫目錄。
default
數據庫名稱
目標數據庫的名稱。
dlf_db
數據庫描述
目標數據庫的描述信息。
湖倉一體
選擇路徑
OSS數據路徑。格式為
oss://<Bucket名稱>/<OSS目錄名稱>
。oss://doc-test-01/datalake/
單擊確定,完成數據庫的創建。
步驟五:創建并啟動入湖任務
由于DLF中數據入湖功能已經停止更新,如果您有數據入湖需求請參考DLF中數據入湖功能停止更新公告。您可以采用以下兩種方式進行Delta Lake和Hudi格式的數據入湖操作。
Delta格式的數據入湖可選擇單表離線同步方案。
Hudi格式的數據入湖建議選擇整庫實時同步方案。對于不帶分區的Hudi格式,您也可使用單表離線同步方案,但無需在DataWorks數據開發模塊創建離線同步任務,直接在DLF控制臺中創建關系數據庫全量入湖類型的任務即可,具體操作可參考OSS數據進行格式轉換入湖。
單表離線同步
在DataWorks數據開發模塊中創建離線同步任務,進行數據入湖操作。
創建離線同步任務。
準備RDS MySQL數據源。
在DataWorks中配置MySQL數據源,具體操作請參見配置MySQL數據源。
準備OSS數據源。
在DataWorks中配置OSS數據源,具體操作請參見配置OSS數據源。
創建并執行數據同步任務。
在DataWorks的數據開發模塊中創建離線同步任務,詳情請參見通過向導模式配置離線同步任務。關鍵配置如下:
網絡與資源配置。
參數
說明
來源
數據來源
MySQL。
數據源名稱
已創建的MySQL數據源。
資源組
我的資源組
已創建的數據集成獨享資源組。
去向
數據去向
OSS。
數據源名稱
已創建的OSS數據源。
配置任務。
在配置任務頁簽填寫表和文件名。
參數
說明
表
RDS數據庫中已創建的表名。
文件名(含路徑)
格式:<OSS中已創建的文件目錄名稱>/<待導出至OSS的數據文件>。
例如
doc-test-01/datalake/anti.csv
。單擊離線同步任務配置頁面左上角的圖標保存配置,然后單擊圖標運行任務。
DataWorks中任務運行成功后,可在OSS數據源配置路徑下查看數據是否導入成功。
OSS數據進行格式轉換入湖。
登錄DLF數據湖構建控制臺,在頁面頂部選擇地域。
在左側導航欄單擊數據入湖 > 入湖任務管理。
在入湖任務管理頁面單擊新建入湖任務 > OSS數據格式轉換,單擊下一步。
說明若您想轉換為Hudi格式,則需要將任務類型選擇為關系數據庫全量入湖。
在新建入湖任務頁面配置相關參數,未提及的參數保持默認,然后單擊確定。
OSS數據格式轉換
參數屬性
參數名稱
說明
示例
配置數據源
OSS存儲路徑
數據源存儲的OSS目錄。格式為
oss://<Bucket名稱>/<OSS目錄名稱>/
。oss:/doc-test-01/datalake/
存儲格式
來源表的數據格式。
CSV
配置目標數據湖信息
目標數據庫
存儲目標表的數據庫。
datalake
目標數據表名稱
作業會以此名稱來建表。
anti_rds
存儲格式
目標表的數據格式。
Delta
數據湖存儲位置
數據存儲的OSS路徑。格式為
oss://<Bucket名稱>/<OSS目錄名稱>/
。oss:/doc-test-01/dlf/
配置任務信息
任務實例名稱
設置入湖任務名稱。
OSS數據入湖格式轉換Delta
最大資源并行度
DLF將啟動Worker節點完成數據入湖,此配置項表示同時運行的最大Worker數量。
20
關系數據庫全量入湖
參數屬性
參數名稱
說明
示例
配置數據源
數據源連接
展示同Region、同賬號下的RDS實例,可在下拉列表中選擇目標數據源。
無
表路徑
需要同步的源表路徑,格式為
<database_name>/<table_name>
。無
配置目標數據湖信息
目標數據庫
存儲目標表的數據庫。
database_1
目標數據表名稱
作業會以此名稱來建表。
anti_rds
存儲格式
目標表的數據格式。
Hudi
數據湖存儲位置
數據存儲的OSS路徑。格式為
oss://<Bucket名稱>/<OSS目錄名稱>/
。oss:/doc-test-01/dlf/
分區信息
可添加分區,寫入數據湖的數據會以此信息作為分區。
無
配置任務信息
任務實例名稱
設置入湖任務名稱。
Hudi格式數據關系數據庫全量入湖
最大資源并行度
DLF將啟動Worker節點完成數據入湖,此配置項表示同時運行的最大Worker數量。
20
在DLF控制臺的入湖任務管理頁面單擊目標任務操作列的運行。
當任務執行進度達到100%時,表示OSS數據格式轉換成功。
單擊元數據管理 > 數據庫頁簽的目標數據庫,在目標數據庫的表列表頁簽查看數據表是否生成。
整庫實時同步
在DataWorks數據集成模塊中創建整庫實時同步任務,進行Hudi格式的數據入湖操作,詳情請參見MySQL整庫實時同步至OSS數據湖。關鍵配置如下:
準備RDS MySQL數據源。
在DataWorks中配置MySQL數據源,具體操作請參見配置MySQL數據源。
準備OSS數據源。
在DataWorks中配置OSS數據源,具體操作請參見配置OSS數據源。
在同步任務頁面設置以下參數。
網絡與資源配置。
參數
說明
來源
數據來源
MySQL。
數據源名稱
已創建的MySQL數據源。
資源組
同步資源組
已創建的數據集成獨享資源組。
去向
數據去向
OSS。
數據源名稱
已創建的OSS數據源。
選擇要同步的庫表。
配置頁面的左側為選擇要同步庫表的限定條件,用于過濾選擇待同步的數據庫、數據表。
配置頁面的右側為源端數據庫表的預覽,是根據上述步驟中配置的數據源預覽出來的待同步的數據庫表和已選擇好要同步的數據庫表的預覽情況。
您可根據待同步的源端數據庫表的數量,參考以下操作建議,快速選擇要同步的庫表。
如果您的數據庫表數量不多,您可以直接在右側預覽模塊手動勾選待同步的數據庫表,然后添加到已選庫表中,此時頁面會根據您的勾選情況自動在左側添加限定條件。
如果您有多個數據源、數據庫、數據表,您可以在左側手動添加限定條件來進行過濾,或者在右側頁面的搜索框中通過關鍵詞搜索出對應的庫表進行添加或刪除的操作。
入湖配置。
OSS存儲路徑選擇:選擇入湖后數據存儲在OSS的哪個路徑下。
選擇元數據庫自動構建位置:選擇DLF。
元數據庫名稱前綴:元數據庫是根據來源庫名自動建立,但是可以手工指定元數據庫的名稱前綴。指定的前綴,將會應用到所有庫中。
數據湖格式:選擇Hudi。
分區信息
支持使用${yyyy}(年)、${MM}(月)、${dd}(日)、${HH}(時)這些變量,最小粒度到小時,不支持分鐘、秒的時間粒度。
支持將變量結合字符串拼接組合。例如將變量與下劃線拼接組合:${yyyy}_${MM}_${dd}_${HH}。
支持設置多個分區使寫入的數據表為多級分區表,分區級別與此處設置的分區順序一致。
設置數據入湖存儲時的分區,后續入湖同步寫入數據時,根據來源端數據的寫入時間落入相應的分區里。分區設置注意事項如下:
單擊完成配置 > 確認。
單擊已創建的同步任務狀態列的啟動,查看任務狀態。
待同步任務執行成功后,在DLF控制臺中單擊元數據 > 元數據管理,并單擊進入新生成的目標數據庫,在表列表頁簽即可查看到已生成的數據表。
步驟六:基于MaxCompute分析數據湖數據
基于已創建的MaxCompute項目、DLF元數據庫、OSS存儲空間,創建External Project,用于關聯DLF和OSS,并映射至已創建的MaxCompute項目。后續可通過映射的MaxCompute項目對External Project進行數據分析操作。僅MaxCompute項目的所有者(Project Owner)或具備Admin、Super_Administrator角色的用戶可以創建External Project。
tenant的Super_Administrator角色可以在MaxCompute控制臺的用戶管理頁簽授權。僅主賬號或已經擁有tenant的Super_Administrator角色的子賬號可以操作授權。詳情請參見將角色賦予用戶。
在DataWorks控制臺創建External Project。
登錄DataWorks控制臺,選擇地域為華東2(上海)。
在DataWorks控制臺頁面左側導航欄,選擇 。
在數據湖集成(湖倉一體)頁面,單擊現在開始創建。
在新建數據湖集成頁面,按照界面指引進行操作。參數示例如下所示。
表 1. 創建數據倉庫 參數
說明
外部項目名稱
ext_dlf_delta
MaxCompute項目
ms_proj1
表 2. 創建外部數據湖連接 參數
說明
異構數據平臺類型
選擇阿里云DLF+OSS數據湖連接
無
阿里云DLF+OSS數據湖連接
External Project描述
無
DLF所在區
cn-shanghai
DLF Endpoint
dlf-share.cn-shanghai.aliyuncs.com
DLF數據庫名稱
datalake
DLF RoleARN
無
單擊創建后單擊預覽。
如果能預覽DLF庫中表的信息,則表示操作成功。
說明以上是DataWorks控制臺創建External Project,如果您需要通過SQL方式創建External Project,請參見使用SQL管理外部項目。
在DataWorks臨時查詢頁面,查看External Project下的表。
命令示例如下。
show tables in ext_dlf_delta;
返回結果如下。
ALIYUN$***@aliyun.com:anti_rds
說明DataWorks臨時查詢操作,詳情請參見DataWorks臨時查詢。
在DataWorks臨時查詢界面,查詢External Project中的表數據。
說明如果查詢結果出現亂碼問題,解決方法請參見如何處理編碼格式設置/亂碼問題導致的臟數據報錯?。
命令示例:
select * from ext_dlf_delta.anti_rds;
返回結果:
基于DLF、Flink、OSS支持Hudi存儲機制
操作流程
為操作MaxCompute項目的賬號授予訪問DLF和OSS的權限。
創建OSS存儲空間作為數據湖的統一存儲路徑。
在Flink控制臺創建臨時表,準備入湖數據。
在DLF中創建元數據庫作為存儲入湖的數據源。
基于DLF創建元數據抽取任務,將OSS目錄下的表數據抽取到數據湖中。
通過DataWorks控制臺的數據湖集成界面創建External Project,對數據湖數據進行分析。
步驟一:授予MaxCompute訪問DLF和OSS的權限
步驟二:在OSS中創建存儲空間及目錄
創建OSS存儲空間作為數據湖的統一存儲路徑。
登錄OSS管理控制臺。
在左側導航欄,單擊Bucket列表,在Bucket列表頁面,單擊創建Bucket。
在創建Bucket面板填寫Bucket名稱,例如
mc-dlf-oss
,并選擇地域,例如華東2(上海)
后,單擊確定。在左側導航欄,單擊文件管理后,在右側區域單擊新建目錄并填寫目錄名,例如
covid-19
,單擊確定。
步驟三:準備入湖數據
基于阿里云Flink全托管使用Hudi連接器建表、準備入湖數據。操作詳情請參見Flink SQL作業快速入門。
訪問Flink實例列表,在上方選擇地域,并單擊目標實例ID,進入阿里云實時計算頁面。
在左側導航欄單擊SQL開發,并新建空白的流作業草稿,單擊下一步。
在新建作業草稿對話框中填寫作業信息,單擊創建。
在SQL編輯區域中輸入如下命令,語法詳情請參見Hudi連接器。
-- 創建一個datagen臨時表,作為數據源。 CREATE TEMPORARY TABLE datagen( id INT NOT NULL PRIMARY KEY NOT ENFORCED, data STRING, ts TIMESTAMP(3) ) WITH ( 'connector' = 'datagen' , 'rows-per-second'='100' ); -- 創建一個flink_hudi_tbl臨時表,作為結果表,數據存儲指向oss,格式為hudi CREATE TEMPORARY TABLE flink_hudi_tbl ( id INT NOT NULL PRIMARY KEY NOT ENFORCED, data STRING, ts TIMESTAMP(3) ) WITH ( 'connector' = 'hudi', 'oss.endpoint' = 'oss-cn-beijing-internal.aliyuncs.com', 'accessKeyId' = '${secret_values.ak_id}', 'accessKeySecret' = '${secret_values.ak_secret}', 'path' = 'oss://<yourOSSBucket>/<自定義存儲位置>', 'table.type' = 'MERGE_ON_READ', 'hive_sync.enable' = 'true', 'hive_sync.mode' = 'hms', 'hive_sync.db' = 'flink_hudi', 'hive_sync.table' = 'flink_hudi_tbl', 'dlf.catalog.region' = 'cn-beijing', 'dlf.catalog.endpoint' = 'dlf-vpc.cn-beijing.aliyuncs.com' ); -- 將源表數據寫入到結果表 INSERT INTO flink_hudi_tbl SELECT * from datagen;
參數說明:
參數名稱
說明
oss.endpoint
Flink實例所在地域的內網Endpoint,各地域Endpoint請參見訪問域名和數據中心。
accessKeyId
阿里云賬號的AccessKey ID。
accessKeySecret
阿里云賬號的AccessKey Secret。
path
OSS Bucket路徑。
dlf.catalog.region
阿里云DLF服務的地域名,詳情請參見已開通的地域和訪問域名。
dlf.catalog.endpoint
DLF服務的Endpoint,詳情請參見已開通的地域和訪問域名。
說明推薦您設置為DLF的VPC Endpoint。例如,如果您選擇的地域為cn-hangzhou地域,則參數值需要配置為dlf-vpc.cn-hangzhou.aliyuncs.com。
進行深度檢查和作業部署,詳情可參考Flink SQL作業快速入門的步驟四和步驟六。
單擊右上角深度檢查,成功后會提示深度檢查通過。
單擊右上角部署,可根據需要填寫或選中相關內容,單擊確定。
啟動作業并查看結果,詳情可參考Flink SQL作業快速入門的步驟七。
在左側導航欄,單擊作業運維。
單擊目標作業名稱操作列中的啟動,選擇無狀態啟動后,單擊啟動。當作業狀態變為運行中時,表示作業運行正常。
在作業運維詳情頁面,查看Flink計算結果。
待任務啟動成功運行一段時間后,登錄OSS控制臺,可查看到目錄下已寫入的數據文件。
步驟四:在DLF中創建元數據庫
通過創建元數據庫來管理DLF湖中的數據。
登錄數據湖構建控制臺,在左上角選擇地域。
創建元數據庫。例如datalake。
在左側導航欄,選擇 ,在數據庫頁簽,單擊新建數據庫。
在新建數據庫對話框,配置相關參數。
參數
描述
示例
所屬數據目錄
數據存儲的數據庫目錄。
default
數據庫名稱
目標數據庫的名稱。
dlf_db
數據庫描述
目標數據庫的描述信息。
湖倉一體
選擇路徑
OSS數據路徑。格式為
oss://<Bucket名稱>/<OSS目錄名稱>
。oss://doc-test-01/datalake/
單擊確定,完成數據庫的創建。
步驟五:在DLF上創建并啟動元數據抽取任務
步驟六:基于MaxCompute分析數據湖數據
具體操作請參見步驟六:基于MaxCompute分析數據湖數據。
相關文檔
MaxCompute+DLF+OSS湖倉一體的湖查詢和湖數據入倉實踐,請參見MaxCompute+DLF+OSS湖倉一體的湖查詢和湖數據入倉實踐。
若您想通過MaxCompute與Hadoop構建湖倉一體,可參見基于Hadoop集群支持Delta Lake或Hudi存儲機制。