現代資料分析需要處理大量且多樣化的資料,資料倉儲和資料湖是兩種主流的資料管理架構。資料倉儲適合處理結構化資料,而資料湖則能處理包含半結構化和非結構化資料在內的所有資料型別。ELT 流程是資料倉儲中常用的資料處理流程,它允許快速載入大量原始資料,並利用 MPP 架構進行高效轉換。隨著資料量的增長和資料型別的多樣化,資料湖因其可擴充套件性和靈活性而成為重要的資料管理解決方案。資料湖的儲存層設計,包含 Landing/Raw、Clean/Transform 和 Curated/Enriched 等區域,支援多階段資料處理和轉換,確保資料品質和可用性。湖倉一體架構結合了資料倉儲和資料湖的優勢,提供統一的資料管理和分析平台。
現代資料管理架構:資料倉儲與資料湖
在現代資料分析的世界中,企業面臨著處理和分析龐大且多樣化資料的挑戰。資料倉儲和資料湖是兩種主要的資料管理架構,它們各自具有獨特的優勢和適用場景。
ELT 流程與資料倉儲
ELT(Extract, Load, Transform)是一種常見的資料處理流程,尤其是在現代資料倉儲中。ELT 允許快速將大量原始資料載入到資料倉儲中,然後利用資料倉儲的 MPP(Massively Parallel Processing)架構加速轉換步驟。ELT 流程通常在以下情況下被採用:
- 資料來源和資料倉儲具有相似的資料函式庫技術,使得直接將源資料載入到暫存表中變得容易。
- 需要快速載入大量資料到資料倉儲中。
- 所有必要的轉換步驟都可以使用資料倉儲的原生 SQL 功能執行。
程式碼範例:ELT 流程
-- 載入原始資料到暫存表
LOAD DATA INTO staging_table FROM 'source_data.csv';
-- 轉換資料並載入到目標表
INSERT INTO target_table
SELECT
column1,
column2,
-- 轉換邏輯
CASE
WHEN column3 > 0 THEN 'positive'
ELSE 'negative'
END AS column3_label
FROM
staging_table;
內容解密:
LOAD DATA陳述式用於將原始資料載入到暫存表中,保持原始格式。INSERT INTO陳述式結合SELECT陳述式執行資料轉換,並將結果載入到目標表中。CASE陳述式是一個簡單的轉換邏輯範例,用於根據column3的值建立新的標籤列。
資料湖架構
隨著新型資料型別(如半結構化和非結構化資料)的出現,企業需要新的資料管理架構來處理這些資料。資料湖是一種集中式的、可擴充套件的儲存函式庫,能夠管理各種型別的資料,包括結構化、半結構化和非結構化資料。
資料湖的優勢
- 能夠儲存和管理大量不同型別的資料。
- 支援多種分析工具和服務,包括 SQL、根據程式碼的工具(如 Apache Spark)、專門的機器學習工具和商業智慧視覺化工具。
- 能夠快速載入原始資料,無需事先轉換成標準結構。
資料湖邏輯架構
一個典型的雲原生資料湖可以視為由五個邏輯層組成的獨立元件。這些層包括:
儲存層:提供幾乎無限制的低成本儲存,能夠儲存各種結構和格式的資料集。
此圖示說明瞭儲存層如何劃分為不同的儲存區域,以組織和管理不同階段的資料。
其他層:包括攝取層、處理層、分析和服務層等,這些層共同工作以支援多樣化的分析需求和工具。
邏輯架構的優勢
- 能夠隨著資料管理和分析方法的創新而演進。
- 支援新資料來源和變化需求的靈活性。
資料湖(Data Lake)架構解析
在當今數位化的商業環境中,企業面臨著海量資料的管理與分析挑戰。資料湖(Data Lake)作為一種創新的資料管理架構,能夠有效整合結構化、半結構化及非結構化的資料,為企業提供更全面的資料洞察能力。
資料湖的儲存層設計
資料湖的儲存層(Storage Layer)是其核心組成部分,負責儲存來自不同來源的原始資料。儲存層被劃分為不同的區域(Zone),每個區域具有特定的功能和用途。資料在這些區域之間流動,經過不同的處理和轉換,形成多個版本的資料副本。
區域劃分與資料流動
Landing/Raw 區:資料攝入層(Ingestion Layer)將原始資料直接寫入該區域,無需進行任何轉換或處理。該區域永久儲存來自源系統的原始資料。
Clean/Transform 區:對 Landing/Raw 區的資料進行初步處理,包括驗證、清理和最佳化,並將結果寫入 Clean/Transform 區。該區域的資料通常以最佳化的格式(如 Parquet)儲存,並進行分割以加速查詢執行。此外,該區域的資料可能已經移除或遮蔽了個人識別資訊(PII)。
Curated/Enriched 區:進一步對 Clean/Transform 區的資料進行精煉和豐富,加入特定商業邏輯和轉換,最終寫入 Curated/Enriched 區。該區域的資料達到最適合消費的狀態,符合組織的標準(包括清潔度、檔案格式和結構)。這些資料通常被分割、編目並最佳化,以供消費層使用。
程式碼例項:使用 Plantuml 描述資料湖儲存層的資料流動
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 資料湖倉架構設計與AWS實作
package "AWS 雲端架構" {
package "網路層" {
component [VPC] as vpc
component [Subnet] as subnet
component [Security Group] as sg
component [Route Table] as rt
}
package "運算層" {
component [EC2] as ec2
component [Lambda] as lambda
component [ECS/EKS] as container
}
package "儲存層" {
database [RDS] as rds
database [DynamoDB] as dynamo
storage [S3] as s3
}
package "服務層" {
component [API Gateway] as apigw
component [ALB/NLB] as lb
queue [SQS] as sqs
}
}
apigw --> lambda
apigw --> lb
lb --> ec2
lb --> container
lambda --> dynamo
lambda --> s3
ec2 --> rds
container --> rds
vpc --> subnet
subnet --> sg
sg --> rt
@enduml內容解密:
- 該 Plantuml 圖表展示了資料在資料湖不同區域之間的流動過程。
- 資料首先被攝入 Landing/Raw 區,然後經過清理和轉換進入 Clean/Transform 區。
- 之後,資料被進一步精煉和豐富,最終進入 Curated/Enriched 區,供消費層使用。
資料湖的其他關鍵層
除了儲存層之外,資料湖還包含以下關鍵層:
目錄與搜尋層(Cataloging and Search Layer):負責管理和提供資料湖中各類別資料集的中繼資料(如結構、分割資訊、分類別、所有權等),並提供搜尋功能,方便使用者快速找到所需的資料集。
攝入層(Ingestion Layer):連線多樣化的資料來源,將其資料匯入儲存層。該層包含多個獨立元件,每個元件針對特定的資料來源型別(如結構化、半結構化、非結構化資料)進行最佳化設計。
處理層(Processing Layer):對攝入的原始資料進行多階段的處理,包括清理、標準化和豐富化,最終將處理後的資料儲存到不同的區域,並更新目錄層的中繼資料。
消費層(Consumption Layer):提供專門的工具,用於對處理好的資料進行分析,如互動式查詢處理、商業智慧儀錶板和機器學習等。這些工具可以直接存取儲存層的資料,並透過目錄層取得結構資訊。
資料湖架構的優勢與挑戰
優勢
- 能夠集中管理結構化、半結構化和非結構化的海量資料。
- 提供靈活的資料處理和轉換能力,支援多種分析場景。
挑戰
- 需要有效的治理機制,以確保資料品質和安全性。
- 面臨著技術複雜性,需要專業的技能來設計和維護。
湖倉一體(Lake House)架構的興起
隨著企業對資料分析需求的日益增長,傳統的資料倉儲(Data Warehouse)和資料湖(Data Lake)架構各自存在的侷限性逐漸顯現。湖倉一體架構應運而生,它將資料倉儲和資料湖的優勢結合,提供了一種更為統一和高效的資料管理與分析解決方案。
湖倉一體架構的核心價值
- 統一的資料管理:打破了傳統上資料倉儲和資料湖之間的壁壘,實作了真正的資料整合。
- 更高的分析效率:支援對結構化和非結構化資料的聯合分析,提供更全面的洞察能力。
- 降低成本和複雜度:減少了因維護多個獨立系統而帶來的成本和複雜度。
資料湖倉(Data Lakehouse)架構在AWS上的實作
近年來,雲端原生架構中出現了一種新的資料管理架構,稱為資料湖倉(Data Lakehouse)架構。這種架構能夠讓組織以簡單且整合的方式收集、管理、處理和分析所有結構化和非結構化的資料。資料湖倉結合了資料倉儲和資料湖的優點,提供了一個統一的介面,使得使用者能夠以整合的方式存取所有相關資料。
資料湖倉的實作
過去2到3年中,各大雲端服務提供商、軟體提供商和開源組織開發了許多新產品,以支援資料湖倉架構的實作。不同平台提供商對資料湖倉的實作方法各有不同:
- Databricks推出了名為Databricks Delta Lake的產品。Delta Lake提供了一個儲存層,能夠直接在資料湖中實作ACID交易。這使得使用者能夠在資料湖中的表格上進行插入、更新和刪除操作。
- Apache Hudi是一個相對較新的開源專案,能夠讓使用者在資料湖中的資料上進行插入、更新和刪除操作,而無需自行開發客製化的解決方案。
- Microsoft Azure在其倉儲服務Azure Synapse Analytics中新增了名為Polybase的功能。Polybase允許Azure Synapse Analytics使用者包含儲存在Azure Blob儲存、Azure Data Lake Store和Hadoop中的資料,以協助處理T-SQL查詢。
- Amazon Web Services(AWS)新增了多項功能,包括Redshift Spectrum和Lake Formation,以支援在AWS上建立資料湖倉架構。這包括了從Amazon Redshift讀取S3中的資料湖表格,以及使用Lake Formation governed tables對資料湖表格進行插入、更新和刪除操作。
在AWS上建立資料湖倉
在AWS上建立資料湖倉的關鍵基礎元件是Amazon Redshift Spectrum和AWS Lake Formation。下圖展示了一個包含這兩個元件的資料湖架構:
圖:AWS上的資料湖倉架構
此圖示展示了Amazon Redshift Spectrum和AWS Lake Formation如何共同支援資料湖倉架構。
Redshift Spectrum是Amazon Redshift資料倉儲服務的一個功能,能夠讓Redshift讀取儲存在S3中的資料。Redshift Spectrum本質上是一個查詢處理層,使用Amazon管理的運算節點來原生查詢儲存在資料湖儲存(S3)中的結構化和半結構化資料。Spectrum使得Amazon Redshift資料倉儲能夠呈現一個統一的介面,使用者可以在此執行結合Redshift(資料倉儲)和S3(資料湖)中資料的SQL陳述式。
內容解密:
- Redshift Spectrum提供了統一的SQL介面來查詢資料湖和資料倉儲中的資料。
- Lake Formation提供了中央的資料湖目錄,能夠讓使用者和分析服務搜尋、發現和檢索資料集的中繼資料。
- AWS Glue能夠自動更新Lake Formation目錄中的中繼資料,並支援多種AWS分析服務對資料湖中資料的存取。
實作細節
AWS除了新增Redshift Spectrum和Lake Formation功能外,還增強了多種雲端服務,使其能夠存取資料湖中的所有資料。這些服務包括AWS Glue(提供無伺服器的Apache Spark環境)和Amazon EMR(一個管理的Spark環境),它們都包含了原生Spark外掛程式,能夠存取Redshift表格和S3儲存桶中的物件。Amazon Athena支援查詢聯合,能夠查詢資料湖中的資料,以及儲存在其他引擎(如Amazon Redshift或Amazon RDS資料函式庫)中的資料。
程式碼範例:使用AWS Glue存取Redshift表格和S3儲存桶
from pyspark.sql import SparkSession
# 建立SparkSession
spark = SparkSession.builder.appName("DataLakehouseExample").getOrCreate()
# 讀取Redshift表格
redshift_df = spark.read.format("com.databricks.spark.redshift")
.option("url", "jdbc:redshift://your-cluster-url:5439/your-database")
.option("dbtable", "your-table-name")
.option("user", "your-username")
.option("password", "your-password")
.option("tempdir", "s3://your-bucket/temp-dir")
.load()
# 讀取S3儲存桶中的資料
s3_df = spark.read.parquet("s3://your-bucket/data-path/")
# 將兩個DataFrame聯合起來
combined_df = redshift_df.union(s3_df)
# 將結果寫入S3儲存桶
combined_df.write.parquet("s3://your-bucket/output-path/")
內容解密:
- 建立SparkSession:首先,我們需要建立一個SparkSession,這是使用Spark進行資料處理的第一步。
- 讀取Redshift表格:使用Spark的Redshift聯結器讀取Redshift表格中的資料。需要提供Redshift叢集的URL、資料函式庫名稱、表格名稱、使用者名稱和密碼等資訊。
- 讀取S3儲存桶中的資料:使用Spark的Parquet讀取器讀取儲存在S3儲存桶中的Parquet格式的資料。
- 聯合DataFrame:將從Redshift和S3中讀取的DataFrame聯合起來,形成一個新的DataFrame。
- 寫入S3儲存桶:將聯合後的DataFrame寫入S3儲存桶中,儲存為Parquet格式。
組態AWS CLI和建立S3儲存桶
在本章中,我們將使用AWS CLI組態工具來組態AWS CLI,並建立一個Amazon S3儲存桶。在第一章中,您已經建立了一個AWS帳戶和一個AWS管理員使用者,並確保能夠存取您的帳戶。在建立管理員使用者的過程中,您記錄了Access Key ID和Secret Access Key,這些是驗證程式化存取您的帳戶所需的。
程式碼範例:組態AWS CLI
aws configure
內容解密:
- 執行aws configure命令:執行此命令後,系統會提示您輸入Access Key ID、Secret Access Key、預設區網域名稱和預設輸出格式等資訊。
- 輸入Access Key ID和Secret Access Key:輸入在建立管理員使用者時記錄的Access Key ID和Secret Access Key。
- 選擇預設區網域名稱:選擇您希望使用的預設區網域名稱。
- 選擇預設輸出格式:選擇您希望使用的預設輸出格式,例如json。
AWS CLI 的安裝與設定以及 S3 儲存貯體的建立
在進行 AWS 相關服務的操作之前,我們需要先安裝並設定 AWS Command Line Interface(AWS CLI)工具。本章節將指導如何完成這項工作,並使用 AWS CLI 建立一個新的 S3 儲存貯體。
安裝與設定 AWS CLI
要設定 AWS CLI,您需要一個具有管理許可權的 IAM 使用者的 Access Key ID 和 Secret Access Key。
- 下載並安裝 AWS CLI:首先,從 https://aws.amazon.com/cli/ 下載適合您作業系統(Mac、Windows 或 Linux)的 AWS CLI 安裝程式。
- 執行安裝程式:執行下載的安裝程式,按照指示完成 AWS CLI 的安裝。
- 設定 AWS CLI:開啟命令提示字元(Command Prompt),輸入
aws configure命令,然後提供您的 IAM 管理使用者的 AWS Access Key ID 和 AWS Secret Access Key。同時,您需要指定預設的區域(Region)。在本文的範例中,我們使用us-east-2(俄亥俄州)區域,但您可以根據自己的需求選擇其他支援所需服務的區域。對於預設輸出格式,按 Enter 鍵保留預設值。
$ aws configure
AWS Access Key ID [None]: AKIAX9LFIEPF3KKQUI
AWS Secret Access Key [None]: neKLcXPXlabP9C90a0qeBkWZAbnbM4ihesP9N1u3
Default region name [None]: us-east-2
Default output format [None]:
內容解密:
aws configure:這是用於設定 AWS CLI 的命令。AWS Access Key ID和AWS Secret Access Key:用於驗證您的 IAM 使用者身份。Default region name:指定預設的 AWS 區域。Default output format:指定命令輸出的格式,按 Enter 鍵保留預設值。
建立新的設定檔
如果您已經為不同的 IAM 使用者設定了 AWS CLI,您可以建立多個設定檔,每個設定檔對應不同的 IAM 使用者。要建立新的設定檔,請使用 --profile 引數執行 aws configure 命令,並指定設定檔的名稱。例如:
$ aws configure --profile dataengbook
然後,根據提示輸入相關資訊。當您執行本文中的範例時,請記得指定您剛才建立的設定檔。例如,要列出您帳戶中的 S3 儲存貯體,請執行:
$ aws s3 ls --profile dataengbook
內容解密:
aws configure --profile dataengbook:建立一個名為dataengbook的新設定檔。aws s3 ls --profile dataengbook:使用dataengbook設定檔列出 S3 儲存貯體。
建立新的 Amazon S3 儲存貯體
為了確認 AWS CLI 已正確設定,我們將使用 AWS CLI 建立一個新的 S3 儲存貯體。
Amazon Simple Storage Service(S3)是一種物件儲存服務,提供幾乎無限的容量和高耐久性。要在 S3 中儲存資料,您需要建立一個儲存貯體。建立後,儲存貯體可以儲存任意數量的物件。每個 S3 儲存貯體都需要有全域唯一的名稱,建議名稱符合 DNS 規範。
要使用 AWS CLI 建立 S3 儲存貯體,請在命令提示字元中執行以下命令:
$ aws s3 mb s3://<bucket-name>
請記住,這裡指定的儲存貯體名稱必須是全域唯一的。如果嘗試使用已被其他 AWS 帳戶使用的名稱建立儲存貯體,您將看到類別似以下的錯誤訊息:
make_bucket failed: s3://test-bucket An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
如果您的 aws s3 mb 命令傳回類別似以下的訊息,則表示您的 AWS CLI 已成功設定:
make_bucket: <bucket-name>
內容解密:
aws s3 mb s3://<bucket-name>:建立一個新的 S3 儲存貯體,<bucket-name>是您指定的儲存貯體名稱。- 錯誤訊息表示指定的儲存貯體名稱已被使用,需要選擇不同的名稱。
AWS 資料工程師工具包
自2006年以來,Amazon Web Services(AWS)不斷創新,持續推出新的服務和功能,在廣泛的 IT 服務領域提供廣泛而深入的功能。傳統上,組織在其資料中心建立自己的大資料處理系統,但這些系統往往複雜且難以擴充套件。雲端運算消除了許多這些挑戰,能夠按需啟動完全組態的軟體解決方案,並由雲端供應商自動更新和維護。組織還可以透過新增資源來擴充套件,同時只需為所使用的資源付費,而不是進行大量的前期資本投資。