前言
目前DolphinScheduler最新的穩定版本是 3.1.9 ,基于此做些探索,逐漸深化學習路徑,以便于加深理解。
3.2.1 是最新的版本。目前的穩定版本是 3.1.9
基礎環境:Hadoop3.3, Java 8, Python3, MacOS14.2.1
一、本地偽分布式安裝
為什么要搞偽分布式?因為可以更方便的了解各個組件的作用和生效的細節,初學建議用這種。
偽分布式集群的安裝參考:
https://dolphinscheduler.apache.org/zh-cn/docs/3.1.9/guide/installation/pseudo-cluster
重點說下幾個步驟:
1、MySQL 做為數據源需要新建庫,然后初始化表信息
主要是修改bin/env/dolphinscheduler_env.sh這里:
# for mysql
export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:mysql://127.0.0.1:3306/dolphin319?useUnicode=true&characterEncoding=UTF-8&useSSL=false"
export SPRING_DATASOURCE_USERNAME=root
export SPRING_DATASOURCE_PASSWORD=root
2、將 MySQL 驅動放到 master/worker/api/alert 這些服務的 libs目錄下
# 創建庫
mysql> CREATE DATABASE dolphin319 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
Query OK, 1 row affected, 2 warnings (0.02 sec)#初始化數據庫:
? bin sh upgrade-schema.sh
3、本地先啟動 zookeeper
-> zkServer.sh start
4、啟動偽分布式集群使用 start-all.sh 可能會遇到啟動不了的情況,一種情況有可能類似我這種:
/Users/mac/server/dolphin/master-server/bin/start.sh: line 30: /opt/java/openjdk/bin/java: No such file or directory
這種情況說明我的 Java Home環境未配置,或者未生效使用了默認的設置。
在dolphinscheduler_env.sh 中發現的確如此,曾以為本地已經有了 JAVA_HOME就不需要配置了,但事實上還是需要在配置下。
# JAVA_HOME, will use it to start DolphinScheduler server
export JAVA_HOME=${JAVA_HOME:-/opt/java/openjdk} # 改為本地絕對路徑
5、最后看到
? bin ./start-all.sh
localhost Begin status master-server......
master-server [ RUNNING ]
End status master-server.
localhost Begin status worker-server......
worker-server [ RUNNING ]
End status worker-server.
localhost Begin status alert-server......
alert-server [ RUNNING ]
End status alert-server.
localhost Begin status api-server......
api-server [ RUNNING ]
End status api-server.# 查看 zk注冊的節點信息 (多節點的情況下就靠它進行 HA 了)
[zk: localhost:2181(CONNECTED) 0] ls /
[dolphinscheduler, zookeeper]
[zk: localhost:2181(CONNECTED) 1] ls /dolphinscheduler
[lock, nodes]
[zk: localhost:2181(CONNECTED) 2] ls /dolphinscheduler/nodes
[master, worker]
[zk: localhost:2181(CONNECTED) 3] ls /dolphinscheduler/nodes/worker
[192.168.31.219:1234]
[zk: localhost:2181(CONNECTED) 4] ls /dolphinscheduler/nodes/master
[192.168.31.219:5678]
訪問地址:http://localhost:12345/dolphinscheduler/ui/home
賬密:admin/dolphinscheduler123
二、開啟資源中心
參考:
https://dolphinscheduler.apache.org/zh-cn/docs/3.1.9/%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D_menu/%E8%B5%84%E6%BA%90%E4%B8%AD%E5%BF%83_menu
2.1 開啟 HDFS 存儲
參照官網介紹,偽分布式下若想使用本地文件系統只需要修改三點,如下:
# resource storage type: HDFS, S3, NONE
resource.storage.type=HDFS
data.basedir.path=/Users/mac/server/dolphin/resource
resource.storage.upload.base.path=/dolphinscheduler
resource.hdfs.fs.defaultFS=file:///
但不幸的是,它還是會按照 HDFS 的路徑去尋找,未能生效,如下:
[ERROR] 2024-07-06 09:29:37.846 +0000 org.apache.dolphinscheduler.api.exceptions.ApiExceptionHandler:[41] - ServiceException:
org.apache.dolphinscheduler.api.exceptions.ServiceException: 服務端異常: copy /Users/mac/server/dolphin/resource/mac/resources/d6f3a291-6b78-452d-a2bf-821c690453a4 to hdfs /dolphinscheduler/mac/resources/hi.sh fail
采用 HDFS 存儲路徑如下:
data.basedir.path=/Users/mac/server/dolphin/resource
resource.hdfs.root.user=hdfs
resource.storage.upload.base.path=/dolphinscheduler
resource.hdfs.fs.defaultFS=hdfs://localhost:9000
重新啟動集群:
創建一個 shell 測試腳本: hi.sh
未啟動之前,我們點擊上傳之后便會報錯連接被拒絕,這符合預期,畢竟回家沒有啟動 hadoop, 啟動之后在次點擊保存之后就正常了,如上面所示。也可以看下文件系統:
2.2 測試資源中心文件使用Shell節點任務
資源中心中直接創建所需文件:
創建 shell節點類型任務:
上線-》運行 -》查看任務實例
查看日志:
結果符合預期。
2.3 測試資源中心文件使用Python節點任務
-
在資源文件中定義 python文件
-
使用 python 節點引入對于的模塊
# 導入資源中心的 Python 文件
from date_utils import get_curr_date# 調用方法并打印結果
print(get_curr_date())
在這里我們知道本地執行的 Python 文件和資源定義的文件不在一起,因此無法直接引入,那這里就會出現導入模塊的報錯,如下:
[INFO] 2024-07-06 10:38:02.102 +0000 - -> Traceback (most recent call last):File "/Users/mac/server/dolphin/resource/exec/process/mac/14182270597920/14186479827104_1/4/4/py_4_4.py", line 5, in <module>from date_utils import get_curr_dateModuleNotFoundError: No module named 'date_utils'
搜索相關資料說可以通過如下方式解決:
import sys
import os# 獲取當前腳本所在目錄
current_dir = os.path.dirname(os.path.abspath(__file__))# 將資源中心的路徑添加到 Python 模塊搜索路徑
resource_center_dir = os.path.join(current_dir, '../resources')
sys.path.append(resource_center_dir)# 調用模塊,執行邏輯...
我在嘗試過后發現并未成功,不過既然知道了文件存儲在了 HDFS 上面那么每次執行的時候先下載到本地然后在使用這種方式執行也未嘗不可,只不過這種方式貌似失去了資源中心的作用。
是否有人知道如何解決這個問題呢?歡迎和我討論~
總結
本文主要講本地基礎環境偽分布式簡單搭建以及遇到的問題,并且以開啟資源中心為例列舉了 shell 腳本和 Python 腳本的示例,其中 shell 腳本沒有問題,主要問題點在 Python,目前來看使用 python任務引入資源中心的 Python 無法成功,后續持續跟進研究,如果你有好的方案煩請和我交流。