前言
目前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_date
ModuleNotFoundError: 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 无法成功,后续持续跟进研究,如果你有好的方案烦请和我交流。