現代資料工程中,ETL 流程的效率和可擴充套件性至關重要。本文示範如何結合 AWS 的各種服務,開發一個可擴充套件的 ETL 流程。首先,利用 S3 作為資料儲存,Lambda 函式執行個別的轉換任務,並透過 Step Functions 協調這些任務,實作複雜的 ETL 流程。CloudWatch 則用於監控和觸發 ETL 流程,確保自動化執行。此外,文章也說明瞭如何整合 EC2 和 RDS,提供更強大的運算和資料函式庫能力,以處理大規模資料。最後,我們也介紹了使用 Bonobo 框架簡化 ETL 流程開發,並探討如何透過 CI/CD 流程提升佈署效率和可靠性。
使用 AWS 建構可擴充套件的 ETL 流程:整合 S3、Lambda 與 Step Functions
在現代資料處理中,提取、轉換和載入(ETL)流程扮演著至關重要的角色。隨著資料量的增長,企業需要可擴充套件且高效的 ETL 流程來處理和分析資料。本文將介紹如何使用 AWS 的 S3、Lambda 和 Step Functions 建構一個可擴充套件的 ETL 流程。
將 Lambda 函式新增到 AWS
首先,我們需要在 AWS 中建立 Lambda 函式。為此,我們需要將每個 Lambda 函式檔案轉換為 ZIP 檔案,並使用 AWS CLI 建立新的 Lambda 函式。
步驟 1:壓縮 Lambda 函式檔案
使用 PyCharm 環境中的終端,執行以下命令將 Lambda 函式檔案壓縮為 ZIP 檔案:
zip boto_function.py s3_key_function.py s3_object_function.py
步驟 2:建立 Lambda 函式
使用 AWS CLI 建立新的 Lambda 函式,將 <YOUR IAM ARN ROLE> 替換為您的 IAM 角色 ARN:
aws lambda create-function --function-name UpperCaseFunction \
--zip-file fileb://boto_function.zip --handler lambda_function.lambda_handler \
--runtime python3.8 --role <YOUR IAM ARN ROLE>
aws lambda create-function --function-name ReverseStringFunction \
--zip-file fileb://s3_key_function.zip --handler lambda_function.lambda_handler \
--runtime python3.8 --role <YOUR IAM ARN ROLE>
aws lambda create-function --function-name ReverseStringFunction \
--zip-file fileb://s3_object_function.zip --handler lambda_function.lambda_handler \
--runtime python3.8 --role <YOUR IAM ARN ROLE>
使用 Step Functions 協調 ETL 流程
建立 Lambda 函式後,我們需要使用 Step Functions 協調 ETL 流程。Step Functions 提供了一個視覺化的介面來定義和管理 ETL 流程。
步驟 1:建立 Step Function
在 AWS 管理控制檯中,導航到 Step Functions 控制檯,點選「建立狀態機」按鈕。在「狀態機定義」部分,使用 Amazon States Language(ASL)定義 ETL 流程:
{
"Comment": "一個簡單的 AWS Step Functions 狀態機範例,用於協調 Lambda 函式。",
"StartAt": "EstablishS3Client",
"States": {
"EstablishS3Client": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "DefineFilePaths"
},
"DefineFilePaths": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"Next": "GetObjects"
},
"GetObjects": {
"Type": "Task",
"Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
"End": true
}
}
}
#### 內容解密:
此 JSON 程式碼定義了一個 Step Function,其中包含三個任務:EstablishS3Client、DefineFilePaths 和 GetObjects。每個任務都對應一個 Lambda 函式,並按照定義的順序執行。
使用 CloudWatch 觸發 ETL 流程
建立 Step Function 後,我們需要使用 CloudWatch 觸發 ETL 流程。
步驟 1:建立 CloudWatch 事件規則
在 Amazon CloudWatch 控制檯中,點選「建立規則」按鈕。選擇「事件模式」作為規則型別,並定義觸發 ETL 流程的條件。
#### 內容解密:
此步驟允許您定義何時觸發 ETL 流程,例如每天或每週的特定時間。
建構可擴充套件的 ETL 流程:整合 EC2 和 RDS
為了建構可擴充套件的 ETL 流程,我們可以使用 Amazon EC2 和 RDS。EC2 提供虛擬運算資源,而 RDS 提供完全託管的關聯式資料函式庫服務。
#### 內容解密:
透過整合 EC2 和 RDS,我們可以建立一個可擴充套件的 ETL 流程,能夠根據需要自動增加或減少運算資源,從而實作最佳的資源利用和成本效益。
在AWS上建立可擴充套件的ETL流程
在本文中,我們將介紹如何使用Amazon EC2和RDS以及Bonobo建立可擴充套件的ETL流程。
使用EC2和RDS組態AWS環境
要使用EC2和RDS工具執行指令碼,需要透過AWS管理控制檯建立這兩者的例項。由於我們正在處理資料函式庫,因此將透過GUI進行操作,以最大限度地提高視覺化。
建立RDS例項
請按照以下步驟:
- 從AWS管理控制檯導航到RDS服務,然後點選建立資料函式庫 | PostgreSQL。
- 選擇以下通用組態選項:
- 例項類別:db.t3.medium,具有8個vCPU和64 GB的RAM。
- 儲存型別:SSD,這是一種具有成本效益的儲存,適用於廣泛的資料函式庫工作負載。
- 組態安全組、資料函式庫名稱、主使用者名稱和密碼,使用連線和驗證PostgreSQL資料函式庫所需的憑證。點選建立資料函式庫以建立RDS例項。
建立EC2例項
以下是建立EC2例項的步驟:
- 從AWS管理控制檯導航到EC2服務,然後點選啟動例項。
- 選擇以下通用組態選項:
- 例項類別:t2.micro - 免費層,具有1個vCPU和1 GB的RAM。
- 作業系統(AMI):Ubuntu SERVER 20.06 LTS AMI。
- 儲存型別:Amazon EBS - 基本上是一個可以附加到EC2例項的磁碟驅動器。
- 網路設定:預設VPC - 虛擬私有雲(VPC)是一個隔離的雲環境,僅供您的EC2例項使用。預設情況下,它無法從網際網路(即AWS環境外部)存取。
- 安全:建立一個新的安全組,以允許存取您的RDS例項(以及您選擇新增的任何其他AWS工具)。預設情況下,在您將入站規則新增到安全組之前,不允許任何入站流量。
- 啟動例項。
在繼續下一節之前,請確保下載您的key.pem檔案,這是將EC2連線到本地環境的關鍵。同時,請記下EC2例項的IP地址。您將使用這兩者從本地環境連線到EC2例項。
使用Bonobo在本地建立資料管道
首先,我們需要將之前的管道轉換為使用Bonobo模組連線到PostgreSQL資料函式庫。在GitHub儲存函式庫中,進入chapter10/scalable-etl/目錄並開啟my_pipeline.py檔案。在指令碼頂部,您將看到以下匯入模組部分:
import pandas as pd
import psycopg2
import bonobo
from bonobo.config import use
from bonobo.constants import NOT_MODIFIED
內容解密:
import pandas as pd:匯入pandas函式庫並賦予別名pd,用於資料處理。import psycopg2:匯入psycopg2函式庫,用於連線PostgreSQL資料函式庫。import bonobo:匯入Bonobo函式庫,用於建立ETL流程。from bonobo.config import use:從Bonobo的config模組匯入use裝飾器,用於標記依賴關係。from bonobo.constants import NOT_MODIFIED:從Bonobo的constants模組匯入NOT_MODIFIED常數,用於在函式之間建立連線連結。
將管道新增到AWS
由於EC2環境是一個獨立的雲環境,因此無法參照在本地安裝的任何依賴項。因此,需要透過SSH連線到EC2例項,以使Python模組在EC2例項中可存取。
內容解密:
- 使用下載的key.pem檔案和EC2例項的IP地址透過SSH連線到EC2例項。
(base) usr@project % ssh -i /path/to/your/key.pem ubuntu@your-ec2-instance-ip-address
- 在EC2例項上執行更新,使用sudo命令:
(base) usr@project % sudo apt-get update
- 安裝必要的系統包和依賴項(例如Python、pip、Bonobo和PostgreSQL):
(base) usr@project % sudo install -y python3-pip
(base) usr@project % pip3 install bonobo --user
(base) usr@project % pip3 install psycopg2-binary --user
- 使用scp命令將資料管道Python指令碼傳輸到AWS,將指令碼複製到EC2例項的主目錄(~):
(base) usr@project % scp -i /path/to/your/key.pem chapter10/scalable-etl/my_pipeline.py ubuntu@your-ec2-instance-ip-address:~
在AWS上建立強大的佈署流程
在建立生產級佈署環境時,強大的ETL流程只是其中一個至關重要的組成部分。為了構建這個環境的堅實基礎和結構框架,我們需要實施CI/CD流程。持續整合/持續佈署(CI/CD)流程對於ETL來說,可以提高效率、可靠性和速度,同時確保從開發到生產的無縫過渡。在本章中,我們將介紹CI/CD工具如何使工程師能夠自信地自動化程式碼佈署,並使用AWS CodePipeline、AWS CodeDeploy和AWS CodeCommit建立初步的CI/CD流程。
本章內容包括:
- 什麼是CI/CD,為什麼它很重要?
- 在AWS中為ETL流程建立強大的CI/CD流程。
- 使用各種AWS服務構建ETL流程。
透過本章的學習,您將瞭解如何使用AWS CodePipeline、CodeDeploy、CodeCommit和Terraform為ETL作業建立高效的CI/CD流程。
在 AWS 中建立穩健的佈署流程
CI/CD 是什麼?為什麼它很重要?
CI/CD 自動化測試以驗證程式碼變更並在開發生命週期早期檢測問題。自動化測試(如單元測試、整合測試和端對端測試)為您的資料管道的品質和功能性提供了快速的回饋。這個技能通常由開發和維運團隊(DevOps)負責;然而,如果您是資料工程師,在小型公司或獨立工作,可能需要不時承擔「DevOps 的角色」。
簡而言之,CI/CD 推動了更快的開發週期、更高的軟體品質、更有效的協作和更順暢的佈署流程,最終使組織能夠更快速地交付可靠的軟體產品,並降低風險。CI/CD 流程可以視覺化為一個管道,每個程式碼佈署步驟都構成整體的一部分。它透過四個關鍵方面建立了一個穩健的 ETL 流程:
圖 11.1:CI/CD 測試支援 ETL 流程的關鍵方式圖示
簡而言之,為 ETL 管道實施 CI/CD 使您能夠確保資料品質、簡化操作並更快地交付資料,使其成為建立穩健有效的 ETL 流程的關鍵要素。讓我們探討這些概念的細節。
CI/CD 的六個關鍵要素
讓我們仔細看看這六個關鍵要素:
- 持續整合(CI):CI涉及每天多次將所有程式碼更新合併到一個集中式儲存函式庫中。這種做法保證了每個人都在相同的程式碼基礎上工作,便於早期檢測衝突。
- 持續佈署(CD):在 CD 中,軟體在成功透過所有測試階段後自動佈署到生產環境。這確保了使用者始終能夠存取最新、最無錯誤的軟體版本。
- 組態管理(CM):CM 需要對軟體生態系統的所有可組態元素進行監督,從版本控制和硬體設定到環境變數。
- 基礎設施即程式碼(IaC):使用程式碼來管理基礎設施元素(如伺服器和網路組態)被稱為 IaC。這種做法使得基礎設施設定和修改能夠快速、可靠且可重現。
- 監控和通知:主動監控軟體系統的效能並在出現問題時提醒團隊至關重要。這種主動方法允許快速識別和解決問題,將對使用者的影響降至最低。
- 協作文化:CI/CD 不僅僅是關於方法和工具。它還涉及在開發和維運團隊之間培養一種協作文化,通常被稱為 DevOps。這種共同的文化對於 CI/CD 的成功至關重要。
採用 CI/CD 的基本步驟
如果您是 CI/CD 的新手,以下是一些步驟可以幫助您開始:
- 自我教育:透過線上資源和文獻瞭解 CI/CD 的各個方面。
- 逐步開始:避免一次性採用所有元素。從幾個關鍵方面開始,並隨著您熟悉程度的增加而擴充套件您的實施。
- 獲得團隊支援:CI/CD 需要集體努力。在開始實施過程之前,確保您的團隊支援這些變化。
- 選擇合適的工具:有許多工具可用於促進 CI/CD。選擇最適合您組織特定需求的工具。
- 評估結果:不斷衡量您的 CI/CD 計劃的有效性。這些資料將幫助您改進流程並找出需要改進的領域。
CI/CD 是一個持續的過程
踏上 CI/CD 之旅將引導您的組織走向更靈活、更可靠的開發週期。透過關注前面提到的六個關鍵要素,您正在順利提升軟體釋出的速度、品質和可靠性。
CI/CD 是一套廣泛使用的工具集,可應用於技術領域的多種角色,包括軟體工程師、資料工程師和 DevOps 工程師。雖然我們的討論將主要集中在其在 ETL 管道中的使用,但我們將涵蓋的原則可以輕易地適用於您可能擁有的任何程式設計專案。
圖 11.2:顯示 DevOps 元件的圖表
# 以下是一個簡單的 Python 程式碼範例,用於示範如何使用 Pipenv 管理依賴關係
import pipenv
def main():
# 初始化 Pipenv 環境
pipenv_init()
def pipenv_init():
# 初始化 Pipenv 環境
print("初始化 Pipenv 環境")
if __name__ == "__main__":
main()
內容解密:
此 Python 程式碼範例示範瞭如何使用 Pipenv 管理專案的依賴關係。首先,我們匯入 pipenv 模組。然後,定義了一個 main 函式,它呼叫了 pipenv_init 函式來初始化 Pipenv 環境。在 pipenv_init 函式中,我們簡單地列印了一條訊息來表示 Pipenv 環境正在被初始化。最後,在 if __name__ == "__main__": 區塊中,我們呼叫了 main 函式來啟動整個流程。
這個程式碼片段展示瞭如何使用 Python 和 Pipenv 建立一個簡單的依賴關係管理機制。透過這種方式,您可以更有效地管理專案中的依賴關係,從而提高開發效率和專案的可維護性。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title AWS 可擴充套件 ETL 流程構建實踐
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此圖示展示了使用 Pipenv 管理依賴關係的基本流程。首先,我們開始這個過程,然後初始化 Pipenv 環境,接著管理依賴關係,最後結束這個過程。
此圖示說明:
此圖示清晰地展示了使用 Pipenv 管理專案依賴關係的基本步驟。透過遵循這個流程,您可以有效地管理和維護專案中的依賴關係,從而提高專案的整體品質和可維護性。