引言 在數據驅動的世界中,企業正在尋求可靠且高性能的解決方案來管理其不斷增長的數據需求。本系列博客從一個重視數據安全和合規性的 B2C 金融科技客戶的角度來討論雲上雲下混合部署的情況下如何利用亞馬遜雲科技雲原生服務、開源社區產品以及第三方工具構建無伺服器數據倉庫的解耦方法。 Apache Dolph ...
引言
在數據驅動的世界中,企業正在尋求可靠且高性能的解決方案來管理其不斷增長的數據需求。本系列博客從一個重視數據安全和合規性的 B2C 金融科技客戶的角度來討論雲上雲下混合部署的情況下如何利用亞馬遜雲科技雲原生服務、開源社區產品以及第三方工具構建無伺服器數據倉庫的解耦方法。
Apache DolphinScheduler 是一種與 EMR Serverless 解耦部署的多功能工作流調度程式,可確保高效可靠的數據編排和處理。對於金融科技客戶,EMR Serverless 提供業務線(LOB)級別的精細資源消費分析,從而實現精確監控和成本優化。這一功能在金融領域尤其有價值。因為在該領域,運營敏捷性和成本效益至關重要。
本篇博客著重探討 Apache DolphinScheduler 與 EMR Serverless 的集成以及 LOB 粒度的資源消費分析方案。
架構設計圖
Apache DolphinScheduler 通常採用和 Hadoop 集群混合部署的方式部署。根據不同的調度工作負載的情況可以選擇在 Hadoop 集群中 HDFS 的多台 Data Node 上進行部署。本博客探討的數倉計算引擎 EMR Serverless 和 DolphinScheduler 是解耦部署的。在 3 個 EC2 實例上以集群模式部署 Apache DolphinScheduler 對 EMR Serverless 的 Job 進行編排。
DolphinScheduler 集群與其編排的 EMR 作業解耦部署,實現了整個系統的高可靠性:一個(EMR 作業或調度器)發生故障不會影響另一個(調度器或 EMR 作業)。
DS集成和作業編排
Apache DolphinScheduler 是現代數據編排平臺。以低代碼敏捷創建高性能工作流程。它還提供了強大的用戶界面,致力於解決數據管道中複雜的任務依賴關係,並提供開箱即用的各種類型的作業。Apache DolphinScheduler 由 WhaleOps 開發和維護,並以 WhaleStudio 的產品名稱上架亞馬遜雲科技 Market place。
Apache DolphinScheduler 原生集成 Hadoop。從下麵兩點可以具體看出:第一,DolphinScheduler 集群模式預設建議部署在 Hadoop 集群上(通常在數據節點上);第二,上傳到 DolphinScheduler 資源管理器的 HQL 腳本預設存儲在 HDFS 上,並且可以通過本機 hive shell 命令直接編排,如下所示:
Hive -f example.sql
此外,對於這個具體案例,編排 DAG 相當複雜,每個 DAG 包含 300 多個作業。幾乎所有作業都是存儲在資源管理器中的 HQL 腳本。
因此,只有成功完成下麵列出的任務,才能實現 DolphinScheduler 和 EMR Serverless 之間的無縫集成。
步驟 1:將 DolphinScheduler 資源中心的存儲層從 HDFS 切換到 S3
分別編輯文件夾 /home/dolphinscheduler/dolphinscheduler/api-server/conf
和文件夾 /home/dolphinscheduler/dolphinscheduler/worker-server/conf
下的 common.propertie
s 文件。文件中需要修改的部分如下所示:
#resource storage type: HDFS, S3, OSS, NONE
#resource.storage.type=NONE
resource.storage.type=S3
# resource store on HDFS/S3 path, resource file will store to this base path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
resource.storage.upload.base.path=/dolphinscheduler
# The AWS access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.access.key.id=AKIA************
# The AWS secret access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.secret.access.key=lAm8R2TQzt*************
# The AWS Region to use. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.region=us-east-1
# The name of the bucket. You need to create them by yourself. Otherwise, the system cannot start. All buckets in Amazon S3 share a single namespace; ensure the bucket is given a unique name.
resource.aws.s3.bucket.name=<target bucket name>
# You need to set this parameter when private cloud s3. If S3 uses public cloud, you only need to set resource.aws.region or set to the endpoint of a public cloud such as S3.cn-north-1.amazonaws.com.cn
resource.aws.s3.endpoint=s3.us-east-1.amazonaws.com
編輯並保存這兩個文件後,通過在文件夾路徑 /home/dolphinscheduler/dolphinscheduler/bin/
下執行以下命令重新啟動 api-server
和 worker-server
。
bash ./binstart-all.sh
bash ./bin/stop-all.sh
bash ./bin/status-all.sh
存儲層切換到 S3 是否成功可以通過 DolphinScheduler 資源中心控制臺上傳腳本來檢查,然後檢查是否可以在相關的 S3 桶文件夾中找到該文件。
步驟 2:確保通過 S3 直接上傳的作業腳本可以通過 DolphinScheduler 資源中心控制台找到並操作
完成第一步,可以實現從 DolphinScheduler 資源中心控制臺上傳腳本,並且這些腳本存儲在 S3 中。然而,在實戰中,客戶需要將所有腳本直接遷移到 S3。存儲在 S3 中的腳本應通過 DolphinScheduler 資源中心控制台查找和操作。為了實現這一點,需要通過插入所有腳本的元數據來進一步修改資源中心名為“t_ds_resources”的元數據表。插入命令如下:
insert into t_ds_resources values(4, '<target_script_name>', 'wordcount.java','',1,0,2100,'2023-11-13 10:46:44', '2023-10-31 10:46:44', 2, '<target_script_name>',0);
步驟 3:讓 DolphinScheduler DAG 編排器瞭解作業的狀態(FAILED/SUCCESS/SCHEDULED/PENDING),以便 DAG 能夠根據作業的具體狀態前進或採取相關操作
如上所述,DolphinScheduler 已與 Hadoop 生態系統原生集成,HQL 腳本可以由 DolphinScheduler DAG 編排器通過 Hive -f xxx.sql 命令編排。因此,當腳本改為 shell 腳本或 python 腳本時(EMR 無伺服器作業需要通過 shell 腳本或 python 腳本編排,而不是簡單的 Hive 命令),DAG 編排器可以啟動作業,但無法獲取實時數據作業的狀態,因此無法進一步執行工作流程。由於本例中的 DAG 非常複雜,因此修改 DAG 是不可行的,而是遵循直接遷移策略。
因此,編寫以下腳本來實現作業狀態捕獲和處理。
- Application ID 列表持久化
var=$(cat applicationlist.txt|grep appid1)
applicationId=${var#* }
echo $applicationId
通過 linux shell 啟用 ds 步驟狀態自動檢查
app_state
{
response2=$(aws emr-serverless get-application --application-id $applicationId)
application=$(echo $response1 | jq -r '.application')
state=$(echo $application | jq -r '.state')
echo $state
}
job_state
{
response4=$(aws emr-serverless get-job-run --application-id $applicationId --job-run-id $JOB_RUN_ID)
jobRun=$(echo $response4 | jq -r '.jobRun')
JOB_RUN_ID=$(echo $jobRun | jq -r '.jobRunId')
JOB_STATE=$(echo $jobRun | jq -r '.state')
echo $JOB_STATE
}
state=$(job_state)
while [ $state != "SUCCESS" ]; do
case $state in
RUNNING)
state=$(job_state)
;;
SCHEDULED)
state=$(job_state)
;;
PENDING)
state=$(job_state)
;;
FAILED)
break
;;
esac
done
if [ $state == "FAILED" ]
then
false
else
true
fi
DolphinScheduler 版本推薦
實戰發現不是最高版本的DolphinScheduler是最好的,截止作者寫這篇文章,最高的版本是3.2.1,使用後面幾個版本會比較安全。
本案例分別測試了3.1.4、3.1.5 、3.1.8,其中3.1.4最穩定,僅供參考。
DolphinScheduler 安裝指南
針對 DolphinScheduler 的部署安裝已經有 blog 做了不錯的總結,這裡不再贅述。
LOB 粒度資源消費分析
如前所述,企業客戶,尤其是金融科技客戶,有建立內部清算結算機制的需求。 亞馬遜雲科技成本分配標記機制完美滿足了這一要求。所有實例,無論是配置的還是無伺服器的,都可以作為標簽附加。可以通過 Web 控制台或亞馬遜雲科技的 CLI 將標簽附加到實例。
標記後,您可以在亞馬遜雲科技賬單/成本分配標簽控制臺中激活標簽,如下圖所示。
激活標簽後,標簽的狀態立即更改為“Active”。需要註意的是,通過賬單和成本管理/成本瀏覽器控制台可視化標簽的財務數據幾乎需要一天的時間。
如圖 3 所示,在右側的 Tag 下拉框中選擇 CostCenter 之後,中間的柱狀圖顯示了打了 CostCenter 這個 Tag 的不同 Value 值的服務消費情況。這裡,Value 的值設計成需要瞭解資源消費的 LOB 的名稱即可實現在 LOB 粒度對資源消費情況進行統計以及可視化展現。
總結
Apache DolphinScheduler 作為大數據作業調度工具在華人開發者中非常流行。然而,其原生部署環境在 hadoop 上的現狀和亞馬遜雲科技持續創新的新一代 Serverless 架構的產品服務之間存在一些 gap。本文結合實戰總結了填補這些 gap 的方法,並探討了通過打 Tag 的方式實現 LOB 粒度資源消費數據統計及可視化的方法。
本文由 白鯨開源 提供發佈支持!