這篇 DolphinScheduler on k8s 雲原生部署實踐,值得所有大數據人看!

在當前快速發展的技術格局中,企業尋求創新解決方案來簡化運營並提高效率成爲一種趨勢。

Apache DolphinScheduler作爲一個強大的工具,允許跨分佈式系統進行復雜的工作流任務調度。本文將深入探討如何將Apache DolphinScheduler適配並整合進現代IT環境,提升其在雲原生部署中的表現。

前言

Apache DolphinScheduler 的高效雲原生部署模式,比原始部署模式節省了95%以上的人力資源和工作時間,提升了部署效率和成本效益。

通過集成 GitOps 技術,我們提升了Apache DolphinScheduler 的 DevOps 管理能力,改善了軟件交付效率和安全審計能力。

通過集成新的雲原生技術,我們爲 Apache DolphinScheduler 增加了水平擴展、健康探測和滾動部署等功能,提升了其靈活性和適應性。

將 Prometheus 等可觀測性技術整合到基礎設施和服務網格中,顯著提升了 DolphinScheduler 的監控功能,爲其性能和健康狀態提供了更深入的洞察。

與 Kubernetes 作業技術深度整合,實現了 DolphinScheduler 的混合調度器,適用於傳統虛擬機和基於容器的運行環境,提升了其多樣性和兼容性。

項目特點

Apache DolphinScheduler 是由 Analysys 開源的分佈式、易於擴展的可視化工作流任務調度平臺,解決了需要企業級問題:

  • 多源數據連接和訪問:技術領域中最常見的數據源都可以訪問,添加新數據源不需要太多改動。

  • 多樣化、專業化和大規模數據任務管理:這涉及到大數據(Hadoop 系列、Flink 等)任務調度的問題,與傳統調度器有着顯著區別。

  • 圖形化任務編排:提供了方便的用戶體驗,與商業產品具有競爭力,尤其是對於大多數無法通過拖放直接生成數據任務的國外開源產品而言。

  • 任務細節:豐富的任務、日誌和運行時間軸顯示,滿足了開發人員對精細化數據任務管理的需求,快速定位慢 SQL 和性能瓶頸。

  • 支持各種分佈式文件系統:豐富了用戶對非結構化數據的選擇。

  • 本地多租戶管理:滿足了大型組織對數據任務管理和隔離的需求。

  • 完全自動化的分佈式調度算法來平衡所有調度任務。

  • 本地集羣監控:可以監控 CPU、內存、連接數和 Zookeeper 狀態,適用於中小企業的一站式運維。

  • 本地任務告警功能:最大程度地減少任務操作的風險。

  • 強大的社區運營:傾聽客戶的真實聲音,不斷添加新功能,持續優化客戶體驗。

分佈式集羣

基於早期的微服務技術,Apache DolphinScheduler採用了服務註冊表的概念,通過使用Zookeeper進行集羣的分佈式管理(許多大數據技術使用Zookeeper作爲分佈式集羣管理)。

Worker主節點可以任意添加,或者可以獨立部署API管理和告警管理。作爲一個企業級技術模塊,它實現了微服務分離、獨立部署和模塊化管理的良好技術特性。然而,在容器化雲原生應用迅速發展的時代,這種基本的技術模式存在一些不足之處:

  • 需要從頭開始部署,無論是安裝在物理機還是虛擬機上,DolphinScheduler都需要數百個shell操作,一個節點集羣可能需要數千個shell操作。

  • 標準化的企業級DolphinScheduler涉及到管理大量基本環境,並且通常需要超過八個節點、主機和IP地址。這些基礎設施信息帶來了一定的管理難度。

  • 添加節點時,還需要進行數十個操作(安裝Java、配置主機、設置DS Linux用戶、設置免密碼登錄、修改安裝節點配置文件),並且整個集羣需要停止和重新啓動。

  • 大型企業通常有多個集羣來支持不同的業務單元,這將在工作負載中帶來大量的重複。

  • 調度器具有一些可觀察性功能,但無法與主流工具集成。

  • 整體而言,調度器仍然需要日常例行檢查工作,例如調查覈心Java進程異常退出。

  • 在不同的需求和場景下,調度器的配置設置缺乏有效的管理機制或工具。

核心技術思路

解決這些技術缺陷的核心思路包括:

  • 如何將Apache DolphinScheduler集成到當今主流的雲原生技術中;

  • 如何在減少人力資源的情況下部署DolphinScheduler,是否能實現完全自動化的集羣安裝和部署模式;

  • 如何實現完全無服務器的DolphinScheduler,並大幅降低配置管理的管理成本;

  • 如何標準化技術組件的實現規範;

  • 是否可以實現無人監管運行,並且系統具備自我修復能力;

  • 如何構建並將其集成到現有的可觀測性平臺中。

利用Kubernetes技術

作爲雲原生系統技術的事實標準,Kubernetes已經給整個IT應用技術系統帶來了革命性的變化。Kubernetes主要基於服務註冊和發現、負載均衡、自動化軟件發佈和回滾、容器化隔離、軟件自愈和分佈式配置管理等核心技術特性。

不僅如此,還可以整合 Cloud Native Computing Foundation(CNCF)的許多優秀項目至 ds on k8s 部署:

  • Apache DolphinScheduler的部署技術得到了改進。我們使用了Helm和Argo CD來大大簡化和實現一鍵部署。

  • 通過Argo CD實現了配置內容的GitOps管理機制,從而實現了現代DevOps的完整審計能力。

  • Kubernetes的水平Pod自動縮放技術大大簡化了應用擴展的操作難度。

  • Kubernetes的標準化健康探針技術使得調度器的所有技術組件都具備了強大的自愈能力。

  • Kubernetes和Argo CD的滾動發佈技術實現了DolphinScheduler工具的優雅簡單升級。

  • 使用Kube-Prometheus技術爲DolphinScheduler帶來了標準化的可觀測性能力。

  • 強大的UI技術簡化了CMDB可視化管理、基於Kubernetes的組件配置管理、應用日誌管理等。

還可以向DolphinScheduler引入了更強大的工具,以獲取更豐富的雲原生特性:

  • 通過Kubernetes服務註冊發現和Ingress技術實現了更輕鬆的服務訪問;

  • 引入了Linkerd,將服務網格的功能引入DolphinScheduler,提高了所有API的管理和監控能力;

  • 將DolphinScheduler與Argo Workflows或標準的Kubernetes作業結合起來;

  • 引入對象存儲技術MinIO,將存儲非結構化數據的技術與DolphinScheduler統一起來。

雲原生平臺初始化遷移

部署步驟

  1. 從 GitHub 存儲庫的 dolphinscheduler-1.3.9.tar.gz 文件中的 ./dolphinscheduler-1.3.9/docker/kubernetes/dolphinscheduler 文件夾中獲取 Helm 包:

    https://github.com/apache/dolphinscheduler/archive/refs/tags/1.3.9.tar.gz

  2. 使用以下命令來部署一個由 Kubernetes 管理的 DolphinScheduler 實例:

    kubectl create ns ds139
    helm install dolphinscheduler . -n ds139
    
    
  3. 有時,Apache DolphinScheduler 用戶需要集成 DataX、SeaTunnel、MySQL JDBC 驅動程序或 Oracle JDBC 驅動程序以進行 ETL 和數據庫連接。

我們可以下載必要的組件,構建新的 Docker 鏡像,然後升級 Kubernetes 管理的 DolphinScheduler 實例:

#Download the additional components
https://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.49/mysql-connector-java-
5.1.49.jar
https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/
https://github.com/alibaba/DataX/blob/master/userGuid.md

#Create a new docker image with new tag by this Dockerfile
FROM apache/dolphinscheduler:1.3.9
COPY *.jar /opt/dolphinscheduler/lib/
RUN mkdir -p /opt/soft/datax
COPY datax /opt/soft/datax

#Edit image tag of helm value.yaml file, and execute helm upgrade.
helm upgrade dolphinscheduler -n ds139

一般建議在生產環境中使用獨立的外部 PostgreSQL 作爲 DolphinScheduler 的管理數據庫。

這樣,切換到外部數據庫後,即使在 Kubernetes 中完全刪除並重新部署 DolphinScheduler,也不需要重新創建 Apache DolphinScheduler 的應用數據(例如用戶定義的數據處理任務)。

這再次證明了高可用性和數據完整性。此外,建議爲Apache DolphinScheduler 組件配置 PersistentVolume,因爲如果 pod 重新啓動或升級,歷史 DolphinScheduler 應用日誌將會丟失。

與傳統模式下執行數百個 shell 命令相比,只需修改一個配置文件,並使用單行安裝命令,就可以自動安裝八個 Apache DolphinScheduler 組件,節省了大量人力成本和操作錯誤。

對於多個 DolphinScheduler 集羣,這將大大降低人力成本,業務部門的等待時間將從幾天減少到不到一個小時,甚至可能十分鐘內完成。

基於Argo CD添加GitOps

Argo CD 是一個基於 Kubernetes 的聲明式 GitOps 持續交付工具,是 CNCF 的孵化項目,也是 GitOps 的最佳實踐工具。

GitOps 對 Apache DolphinScheduler 的實現帶來了以下優勢:

  • 集羣軟件的圖形化和一鍵式安裝

  • Git 記錄了完整的發佈過程,實現一鍵回滾

  • 方便的 DolphinScheduler 工具日誌查看

一旦實施完成,我們可以看到由 Argo CD 自動部署的 Pod、ConfigMap、Secret、Service、Ingress 等資源,它還顯示了清單提交信息和用戶名,完全記錄了所有發佈事件信息。同時,還可以通過一鍵點擊回滾到歷史版本。

file

相關資源信息可以通過kubectl命令查看:

[root@tpk8s-master01 ~]# kubectl get po -n ds139
                           NAME                               READY   STATUS  RESTARTS           AGE
Dolphinscheduler-alert-96c74dc84-72cc9	1/1	Running	0		22m
Dolphinscheduler-api-78db664b7b-gsltq	1/1	Running	0		22m
Dolphinscheduler-master-0			1/1	Running	0		22m
Dolphinscheduler-master-1			1/1	Running	0		22m
Dolphinscheduler-master-2			1/1	Running	0		22m
Dolphinscheduler-worker-0			1/1	Running	0		22m
Dolphinscheduler-worker-1			1/1	Running	0		22m
Dolphinscheduler-worker-2			1/1	Running	0		22m

[root@tpk8s-master01 ~]# kubectl get statefulset -n ds139
              NAME                                READY              AGE
Dolphinscheduler-master		3/3		22m
Dolphinscheduler-worker		3/3		22m

[root@tpk8s-master01 ~]# kubectl get cm -n ds139
          NAME                                     DATA                AGE
Dolphinscheduler-alert		15		23m
Dolphinscheduler-api			1		23m
Dolphinscheduler-common		29		23m
Dolphinscheduler-master		10		23m
Dolphinscheduler-worker		7		23m

[root@tpk8s-master01 ~]# kubectl get service -n ds139
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
Dolphinscheduler-api	ClusterIP	10.43.238.5	<none> 12345/TCP 23m
Dolphinscheduler-master-headless ClusterIP None	<none> 5678/TCP 23m
Dolphinscheduler-worker-headless ClusterIP None 	<none> 1234/TCP,50051/TCP 23m

[root@tpk8s-master01 ~]# kubectl get ingress -n ds139
      NAME                               CLASS                       HOSTS ADDRESS
Dolphinscheduler		<none>		ds139.abc.com

還可以看到 Kubernetes 集羣中所有 Pod 都部署在不同的主機上,例如,worker1 和 worker2 分別部署在不同的節點上。
file

一旦配置了 Ingress,我們就可以使用域名在公司的內部網絡中訪問 Apache DolphinScheduler 的 Web 用戶界面,讓我們以 DNS 子域名 abc.com 爲例:

http://ds139.abc.com/dolphinscheduler/ui/#/home,我們可以在Argo CD 中查看 Apache DolphinScheduler 的每個組件的內部日誌:

file

使用 Argo CD,修改主節點、工作節點、API 或警報等組件的副本數量非常方便。Apache DolphinScheduler 的Helm配置還保留了 CPU 和內存的設置信息。在 value.yaml 文件中修改副本的設置。

修改後,我們可以將其推送到公司的內部源代碼系統:

master:
  podManagementPolicy: "Parallel"
  replicas: "5"
worker:
  podManagementPolicy: "Parallel"
  replicas: "5"
alert:
  replicas: "3"
api:
  replicas: "3"

只需在 Argo CD 上點擊同步即可進行同步,所需的相應 pod 將被添加。

[root@tpk8s-master01 ~]# kubectl get po -n ds139
                   NAME                                      READY   STATUS              RESTARTS            AGE
Dolphinscheduler-alert-96c74dc84-72cc9	1/1	Running		0		43m
Dolphinscheduler-alert-96c74dc84-j6zdh	1/1	Running		0		2m27s
Dolphinscheduler-alert-96c74dc84-rn9wb	1/1	Running		0		2m27s
Dolphinscheduler-api-78db664b7b-6j8rj	1/1	Running		0		2m27s
Dolphinscheduler-api-78db664b7b-bsdgv	1/1	Running		0		2m27s
Dolphinscheduler-api-78db664b7b-gsltq	1/1	Running		0		43m
Dolphinscheduler-master-0			1/1	Running		0		43m
Dolphinscheduler-master-1			1/1	Running		0		43m
Dolphinscheduler-master-2			1/1	Running		0		43m
Dolphinscheduler-master-3			1/1	Running		0		2m27s
Dolphinscheduler-master-4			1/1	Running		0		2m27s
Dolphinscheduler-worker-0			1/1	Running		0		43m
Dolphinscheduler-worker-1			1/1	Running		0		43m
Dolphinscheduler-worker-2			1/1	Running		0		43m
Dolphinscheduler-worker-3			1/1	Running		0		2m27s
Dolphinscheduler-worker-4			1/1	Running		0		2m27s

不僅如此,基於 Argo CD 的 GitOps 技術爲整個 DolphinScheduler 工具提供了圖形化、自動化、可追溯、可審計和強大的 DevOps、回滾和監控功能,而無需對 DolphinScheduler 進行任何代碼修改。

Apache DolphinScheduler 在 k8s 上的服務自愈

衆所周知,當代的IT環境總是處於不穩定狀態。換句話說,我們的技術系統將服務器、操作系統和網絡的各種故障視爲集羣中的常規事件。當最終用戶無法通過瀏覽器正常訪問 Apache DolphinScheduler 的任務管理頁面,或者 DolphinScheduler 無法運行常規的大數據任務時,已經爲時已晚。

技術現狀

然而,在 Apache DolphinScheduler 轉向雲原生之前,它只能依靠日常監控來檢查主節點/工作節點/API等組件是否正常運行,通過 DolphinScheduler 管理UI,或者通過 jps 檢查Java進程是否存在。

當企業擁有數百個調度環境時,這不僅會花費大量時間,而且更重要的是,系統的可用性將面臨巨大風險。

值得注意的是,Kubernetes 技術本身可以自動重啓和恢復標準化應用程序的有狀態和部署類型,甚至 CRD 本身也可以自動重啓和恢復。

當應用程序失敗時,會記錄異常事件,並重新拉取應用程序以重新啓動應用程序,Kubernetes 將記錄 pod 重新啓動的次數,以便技術人員可以快速定位故障

除了標準化的自愈機制外,還有主動的健康監控方法。通過構建一個服務接口來主動探測正在運行 DolphinScheduler 的 pod,使用 livenessProbe 機制,當檢測次數超過失敗重試次數時,該機制可以自動重啓 pod。

此外,通過使用 readinessProbe,Kubernetes 集羣可以在探測器捕獲異常時自動切斷對異常 pod 的流量,並在異常事件消失後自動恢復對 pod 的流量請求。

livenessProbe:
  enabled: true
  initialDelaySeconds: "30"
  periodSeconds: "30"
  timeoutSeconds: "5"
  failureThreshold: "3"
  successThreshold: "1"
readinessProbe:
  enabled: true
  initialDelaySeconds: "30"
  periodSeconds: "30"
  timeoutSeconds: "5"
  failureThreshold: "3"
  successThreshold: "1"

可觀測性

我們知道,Prometheus 已經成爲雲原生系統中監控工具的事實標準,將 Apache DolphinScheduler 的標準監控整合到 Prometheus 系統中對我們來說是最合理的選擇。

  • Kube-Prometheus 技術可以監控 Kubernetes 集羣中的所有資源。
  • StatefulSet、命名空間和 Pod 是 DolphinScheduler 的三個主要資源特性。
  • 通過 Kube-Prometheus 技術,可以自動進行 CPU、內存、網絡、IO、副本等方面的常規監控,無需額外的開發或配置。

我們在 Kubernetes 中使用 Kube-Prometheus operator 技術,在部署後自動監控 Apache DolphinScheduler 的每個組件的資源。

但請注意Kube-Prometheus 的版本需要與 Kubernetes 的主版本對應。

集成服務網格

作爲數據服務提供商,Apache DolphinScheduler 通過服務網格技術實現了服務鏈接的可觀察性管理,並將其納入內部服務治理系統中。
不僅需要通用資源監控,還需要服務調用鏈的監控技術。通過服務網格技術,可以實現 Apache DolphinScheduler 的內部服務調用以及 DolphinScheduler API 的外部調用的可觀察性分析,優化 DolphinScheduler 產品的服務。

此外,作爲數據工具的服務組件,Apache DolphinScheduler 可以通過服務網格工具無縫集成到企業的內部服務模式中。

使得具有 TLS 服務通信能力、客戶端服務通信重試機制和跨集羣服務註冊發現等功能成爲可能,而無需修改 DolphinScheduler 的代碼。通過服務網格技術,可以實現對 Apache DolphinScheduler 的 API 外部服務調用和內部調用的可觀察性分析,從而優化 Apache DolphinScheduler 產品服務。

我們使用了 Linkerd 作爲服務網格產品進行集成,這也是 CNCF 出色的畢業項目之一。通過修改 Apache DolphinScheduler Helm 中 value.yaml 文件中的註釋,並重新部署,可以快速將網格代理 sidecar 注入到 DolphinScheduler 的 master、worker、API、alert 等組件中。

annotations:
  linkerd.io/inject: enabled

還可以觀察組件之間通信的服務質量,包括每秒請求的數量:

file

雲原生工作流調度

要成爲真正的雲原生調度工具,Apache DolphinScheduler需要能夠調度雲原生作業流程。

調度的任務都是在固定的Pod中執行。在這種模式下,任務開發技術的隔離要求相對較高。

特別是在Python語言環境下,團隊中會存在不同版本的Python基礎和依賴包,甚至版本之間的差異可能會出現數百種組合。

依賴包的輕微差異就會導致Python程序運行錯誤。這也是阻止DolphinScheduler運行大量Python應用程序的障礙。

建議採取以下方法,以便DolphinScheduler能夠快速與Kubernetes作業系統集成,並具有強大的任務隔離和併發能力:

  • 使用標準的Kubernetes API系統進行作業提交。可以通過kubectl命令行或REST API直接提交任務。

  • 將kubectl命令文件上傳到DolphinScheduler,並通過DolphinScheduler的shell任務提交。

  • 使用Argo Workflows項目的Argo CLI命令或REST API命令進行提交。

無論是Kubernetes還是Argo Workflows,都需要添加watch功能,因爲Kubernetes是一種異步技術,需要等待任務完成。

在這裏,我們以Argo Workflows爲例,我們可以在DolphinScheduler中創建一個新的shell任務或步驟,並將以下命令粘貼到其中。

結果,我們可以將常規的數據作業(例如數據庫SQL作業、Spark作業或Flink作業)和雲原生作業結合起來,執行更全面的作業流程。例如,這個作業是一個Hive SQL任務,用於導出Web應用的用戶點擊數據:

beeline -u "jdbc:hive2://192.168.1.1:10006" --outputformat=csv2 -e "select * from database.user-click" > user-click.csv 

這個示例作業是一個Python Tensorflow任務,用於通過訓練數據構建機器學習模型。

該作業通過HTTP方式運行。首先,我們運行該作業:
通過HTTP方式運行Python Tensorflow作業

curl --request POST -H "Authorization: ${ARGO_TOKEN}" -k \
       --url https://argo.abc.com/api/v1/workflows/argo \
       --header 'content-type: application/json' \
       --data '{
                "namespace": "argo",
                "serverDryRun": false,
                "workflow": {
                "metadata": {
                    "name": "python-tensorflow-job",
                    "namespace": "argo"
                },
                "spec": {
                    "templates": [
                    {
                        "name": "python-tensorflow",
                        "container": {
                        "image": "tensorflow/tensorflow:2.9.1",
                        "command": [
                            "python"
                        ],
                        "args": [
                            "training.py"
                        ],
                        "resources": {}
                        }
                    }
                    ],
                    "entrypoint": "python-tensorflow",
                    "serviceAccountName": "argo",
                    "arguments": {}
                   }
                }
               }'

然後我們可以檢查工作信息和狀態:

#Http way to check the Python Tensorflow job information and status
curl --request GET -H "Authorization: ${ARGO_TOKEN}" -k \
       --url https:/argo.abc.com/api/v1/workflows/argo/python-tensorflow-job

從HDFS升級到S3文件技術

分佈式算法是雲原生技術領域之一,比如谷歌的Kubeflow技術,它完美地結合了TensorFlow和Kubernetes。分佈式算法通常使用文件,而S3是存儲大型數據文件的事實標準,這些文件可以很容易地訪問。

當然,Apache DolphinScheduler還集成了MinIO技術,通過簡單的配置可以實現S3文件管理。

首先,通過修改Helm value.yaml文件中的configmap部分,將其指向一個MinIO服務器。

configmap:
  DOLPHINSCHEDULER_OPTS: ""
  DATA_BASEDIR_PATH: "/tmp/dolphinscheduler"
  RESOURCE_STORAGE_TYPE: "S3"
  RESOURCE_UPLOAD_PATH: "/dolphinscheduler"
  FS_DEFAULT_FS: "s3a://dfs"
  FS_S3A_ENDPOINT: "http://192.168.1.100:9000"
  FS_S3A_ACCESS_KEY: "admin"
  FS_S3A_SECRET_KEY: "password"

在MinIO中存儲文件的桶的名稱稱爲“dolphinscheduler”。用戶通過DolphinScheduler UI上傳的共享文件存儲在這個文件夾中。

總結

作爲一款新一代的雲原生大數據工具,Apache DolphinScheduler 有望在將來與 Kubernetes 生態系統中更多優秀的工具和功能集成,以滿足多樣化的用戶羣體和場景需求。

將來的規劃路線包括下邊:

  • 使用 sidecar 定期刪除 worker 作業日誌,實現輕鬆的運維管理

  • 與 Argo Workflows 更深入地集成,用戶可以通過 API、CLI 等在 Apache DolphinScheduler 中調用 Argo Workflows 進行單一作業、DAG 作業和定期作業

  • 使用 HPA(Horizontal Pod Autoscaling)自動調整 DolphinScheduler 的任何組件的規模,實現更具彈性的運行環境,並處理不確定的工作負載

  • 集成 Spark 操作器和 Flink 操作器,進行全面的雲原生分佈式計算

  • 實現多雲和多集羣的分佈式作業調度,並加強無服務器和 FAAS 類架構屬性。

通過引入雲原生技術和GitOps流程,Apache DolphinScheduler不僅提升了其部署和運維的效率,也增強了其在多樣化和高變性任務處理上的能力。

未來,隨着與Kubernetes生態系統中更多優秀工具和功能的集成,Apache DolphinScheduler預計將爲廣泛的用戶羣體和場景需求提供支持。

本文由 白鯨開源科技 提供發佈支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章