工作流调度平台 Dolphinscheduler - Standalone 单机部署 + Flink 部署【kafka消息推送、flink 消费】

目录

ps:这个dolphinscheduler是个人自行研究,要是有不对的地方,欢迎指点不足~

Standalone单机部署

安装

下载

复制代码
命令下载3.3.2版本
wget https://mirrors.huaweicloud.com/repository/apache/dolphinscheduler/3.3.2/apache-dolphinscheduler-3.3.2-bin.tar.gz

校验压缩包

复制代码
.sha512 文件出自 Apache 官方 archive,内容是官方发布的校验哈希,用来自检下载完整性

下载校验文件
wget https://archive.apache.org/dist/dolphinscheduler/3.3.2/apache-dolphinscheduler-3.3.2-bin.tar.gz.sha512

校验:
sha512sum -c apache-dolphinscheduler-3.3.2-bin.tar.gz.sha512

解压

复制代码
tar -xvzf apache-dolphinscheduler-3.3.2-bin.tar.gz

下载插件

复制代码
需要在bin目录 -> /root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin/bin
下执行这个命令,用来执行脚本文件,安装插件依赖

我的版本是3.3.2,所以这里就是3.3.2,如果用其他版本号会出错
bash ./bin/install-plugins.sh 3.3.2

有些依赖没安装成功,先不用理,到时缺什么再补---原因:版本号问题,改成3.3.2就好

配置用户免密及权限

创建部署用户

任意位置执行创建用户的命令即可:

复制代码
# 创建用户需使用 root 登录
useradd dolphinscheduler
添加密码
复制代码
# 添加密码---官网提供的这个命令,ubuntu 版本无法使用
(将用户dolphinscheduler的密码设置为dolphinscheduler)
echo "dolphinscheduler" | passwd --stdin dolphinscheduler

所以改成 :passwd dolphinscheduler
配置 sudo 免密
复制代码
官网是这样的:
# 配置 sudo 免密
sed -i '$adolphinscheduler  ALL=(ALL)  NOPASSWD: NOPASSWD: ALL' /etc/sudoers
sed -i 's/Defaults    requiretty/#Defaults    requiretty/g' /etc/sudoers

我这里这么改

visudo 是"安全编辑 /etc/sudoers 文件的专用命令,

相当于打开 /etc/sudoers 这个文件让你编辑,但带安全保护。

用这里命令,如果编辑的时候语法出现错误是无法保存的,但是如果用vim编辑,语法出现错误还是会保存。

复制代码
输入这个编辑命令:
visudo

在文件末尾添加这行,不要多空格
dolphinscheduler ALL=(ALL) NOPASSWD: ALL

添加完后 ctrl + 0 保存
然后会提示文件名,回车确认即可
然后再 ctrl+x 退出编辑页面

如果改错了 ctrl + x ,然后输入 N 即可不修改退出

------------------------------------------

这个是属于 nano 的编辑方式,
【nano 是 Linux 下的一个"终端文本编辑器",visudo就是用 nano来编辑 /etc/sudoers 这个配置文件】
复制代码
如果发现 /etc/sudoers 文件中有 "Defaults requiretty" 这行,也请注释掉。
这个主要存在于  centos 版本 ,我的ubuntu版本没有,所以不用理
修改目录权限

部署用户就是我刚刚添加的【dolphinscheduler】,让它能够读 / 写 / 执行 DolphinScheduler 的安装目录

chown -R → 递归修改目录属主和属组

chmod -R 755 → 递归修改目录权限,让属主可读写执行,其他人可读执行

它们操作的是整个 apache-dolphinscheduler-3.3.2-bin 目录,不是里面的 bin 子目录

复制代码
我安装的目录是:
/root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin

所以命令需要按自己的路径这么修改:
chown -R dolphinscheduler:dolphinscheduler /root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin
chmod -R 755 /root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin
这两条命令任意位置执行即可。

验证是否成功
ls -ld /root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin

启动 DolphinScheduler Standalone Server

解压并启动 DolphinScheduler

复制代码
# 启动 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh start standalone-server

# 停止 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh stop standalone-server

# 查看 Standalone Server 状态
bash ./bin/dolphinscheduler-daemon.sh status standalone-server

登录 DolphinScheduler

注意:ip是自己虚拟机的ip

http://192.168.209.129:12345/dolphinscheduler/ui/home

复制代码
账号:admin 
密码:dolphinscheduler123


产生问题:

1、jdk版本过高

我的虚拟机有java8和21,java-version是显示21,改成用java8

复制代码
1、确认 Java 8 安装路径
update-alternatives --config java

如图操作即可:

复制代码
切换系统默认 Java
  sudo update-alternatives --config java
  
Java 编译器也要同步:
  sudo update-alternatives --config javac
  
  java -version
  javac -version
重启dolphinscheduler
复制代码
# 启动 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh start standalone-server

# 停止 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh stop standalone-server

# 查看 Standalone Server 状态
bash ./bin/dolphinscheduler-daemon.sh status standalone-server
复制代码
日志中 DolphinScheduler 任务执行失败的核心原因在这一行:
/tmp/dolphinscheduler/exec/process/1/1.sh: line 4: /bin/flink: No such file or directory
也就是说,DolphinScheduler 尝试执行 Flink 任务时找不到 Flink 命令。

结合执行脚本:
${FLINK_HOME}/bin/flink run -m yarn-cluster -ys 1 -yn 2 -yjm 1G -ytm 2G -p 1 -sae -c   ljh.kafka.consumer.FlinkKafkaConsumerExample /tmp/dolphinscheduler/exec/process/1/kafka-consumer-demo-1.0-SNAPSHOT-shaded.jar

${FLINK_HOME} 这个环境变量没有正确配置,或者指向的目录不存在。
因为最终执行的是 /bin/flink,说明 ${FLINK_HOME} 为空,所以执行失败。
问题出现原因理解:

1、我在代码里面引入了flink依赖,进行kafka的消息消费处理,但是这只保证了编译时 和 打包时 jar 中有 Flink 的类,我可以在本地 IDEA 或 Spring Boot 程序里直接调用 Flink API(比如 FlinkKafkaConsumerExample)

2、但是如果用 DolphinScheduler 执行 Flink 类型的任务,它不是直接运行我写的 Java main 方法,而是调用 Flink 集群命令行工具 flink run 来提交作业。

也就是说,它需要在系统中有一个 Flink 环境(bin/flink 命令),不管我的 jar 有多少依赖都必须有 Flink 程序来运行任务。

日志中的命令就是:${FLINK_HOME}/bin/flink run -m yarn-cluster ...

DolphinScheduler 只是帮我调用了 Flink CLI 来提交任务,它 不会自己解析我这个 jar 内的 Flink 类


所以我需要在虚拟机也安装 flink

安装与 jar 版本对应的 Flink。

配置环境变量 FLINK_HOME。

这样 DolphinScheduler 就可以通过 flink run 提交作业

复制代码
下载flink1.11.6版本:
wget https://repo.huaweicloud.com/apache/flink/flink-1.11.6/flink-1.11.6-bin-scala_2.12.tgz

校验压缩包
校验下这个压缩包是否是官方正品【生产环境必须要检验】

下载官方校验文件:
wget https://archive.apache.org/dist/flink/flink-1.11.6/flink-1.11.6-bin-scala_2.12.tgz.sha512

执行校验命令,输出 ok 即可
sha512sum -c flink-1.11.6-bin-scala_2.12.tgz.sha512
复制代码
解压
tar -xzvf flink-1.11.6-bin-scala_2.12.tgz
启动

到这个位置 /root/mypackage/flink/flink-1.11.6 执行

复制代码
./bin/start-cluster.sh
./bin/stop-cluster.sh
浏览器访问

现在虚拟机访问下,如果返回 html或json 即可

复制代码
curl http://localhost:8081

http://192.168.209.129:8081/

简单提交jar包看看

这里有正常刷新

这里可以看到消费的日志

在虚拟机上看日志:

复制代码
cd /root/mypackage/flink/flink-1.11.6/log
tail -f flink-root-taskexecutor-0-ljh-vmware-virtual-platform.log

dolphinscheduler 配置环境变量

已经下载并解压了 Flink 1.11.6,下一步就是 配置环境变量,让 DolphinScheduler 能找到 Flink

1、修改 dolphinscheduler_env.sh

官网的说法:


看下启动脚本文件dolphinscheduler-daemon.sh 里面说的,

脚本会尝试读取 ./bin/env/dolphinscheduler_env.sh,

dolphinscheduler_env.sh 文件中的配置会覆盖各个服务的配置文件(application.yaml)中的配置,

以 dolphinscheduler_env.sh 文件中的配置为准

复制代码
# Java
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# Flink
export FLINK_HOME=/root/mypackage/flink/flink-1.11.6
export PATH=$FLINK_HOME/bin:$PATH
复制代码
让当前终端加载并执行 dolphinscheduler_env.sh 文件里的内容,也就是把里面的环境变量生效到当前的 shell 中
生效要执行这条命令
source /root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin/bin/env/dolphinscheduler_env.sh

查看flink版本
flink -v

停止再重启下dolphinscheduler

复制代码
cd /root/mypackage/dolphinscheduler/apache-dolphinscheduler-3.3.2-bin

# 停止 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh stop standalone-server

# 启动 Standalone Server 服务
bash ./bin/dolphinscheduler-daemon.sh start standalone-server


# 查看 Standalone Server 状态
bash ./bin/dolphinscheduler-daemon.sh status standalone-server

【最终没啥效果,换另一种方法就可以,就是把内容写在任务参数中,在创建工作流中体现】

创建工作流

1、上传jar包

把我写的消费kafka消息的jar包上传

2、创建项目

3、创建工作流

主程序参数就是这个:【这个操作应该是不对的】

复制代码
#!/bin/bash
# Java 环境
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

# Flink 环境
export FLINK_HOME=/root/mypackage/flink/flink-1.11.6
export PATH=$FLINK_HOME/bin:$PATH

4、上线 / 运行

就能成功运行了---但是问题是,日志显示 flink 还是没拿到

其他修改

还有很多问题,没看到消费kafka的消息,主要是dolphinscheduler和flink的设置

1、修改虚拟机的全局环境变量配置文件 /etc/profile

复制代码
vim /etc/profile

最尾部添加:
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export FLINK_HOME=/root/mypackage/flink/flink-1.11.6
export PATH=$JAVA_HOME/bin:$FLINK_HOME/bin:$PATH

让配置文件生效
source /etc/profile

查看版本
java -version
flink -v

which flink 是用来查看:你当前执行的 flink 命令,实际用的是哪一个可执行文件
which flink
输出:/root/mypackage/flink/flink-1.11.6/bin/flink

dolphinscheduler 类似于定时任务,定时去调用 flink 执行消费消息的任务,例如每天凌晨1点执行,消费完消息后就让flink退出。

DolphinScheduler 就是:

定时 / 依赖地触发 Flink 批任务,

让 Flink 在指定时间消费"有限数据",

消费完成后自动退出。


比如我现在先让 flink 退出

复制代码
1、停止 flink 服务进程
$FLINK_HOME/bin/stop-cluster.sh
$FLINK_HOME 在全局变量已经有设置了,是FLINK_HOME=/root/mypackage/flink/flink-1.11.6
或者到 flink 安装目录下执行这个 ./stop-cluster.sh  也一样

etc/profile 全局变量这里是这么设置的,重温一下
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
export FLINK_HOME=/root/mypackage/flink/flink-1.11.6
export PATH=$JAVA_HOME/bin:$FLINK_HOME/bin:$PATH

2、查看进程

复制代码
2、jps 是 JDK 自带的一个命令,用来查看当前机器上正在运行的 JVM 进程
jps 
复制代码
创建一个 shell 类型的工作流,用来启动 flink 这个服务
复制代码
#!/bin/bash
export FLINK_HOME=/root/mypackage/flink/flink-1.11.6
export PATH=$FLINK_HOME/bin:$PATH
$FLINK_HOME/bin/start-cluster.sh

执行shell启动flink的脚本后,网站也能正常访问了,如果没执行这个启动脚本,这个是访问不了的,因为上面已经先关闭了。

4、拷贝jar包

因为flink重启数据会丢失,还没有做持久化下,我这里先将jar保存到我宿主机的某个路径下先。

复制代码
找一下这个jar在哪
find /tmp -name "*.jar" | grep flink

拷贝到我指定的目录下
sudo cp \
/tmp/flink-web-de67d8e4-ca98-46da-94f2-fc7068d3175d/flink-web-upload/94009e26-fcd1-4d8a-a5f8-fbcd95a5f1cc_kafka-consumer-demo-1.0-SNAPSHOT-shaded.jar \
/root/mypackage/my-jars/kafka-consumer-demo-1.0-SNAPSHOT-shaded.jar
复制代码
755 给 目录 的权限,644 给 文件(jar) 的权限,root 拥有完全控制权,其他用户只能读目录和文件,不能改

chmod 755 /root/mypackage/my-jars
chmod 644 /root/mypackage/my-jars/kafka-consumer-demo-1.0-SNAPSHOT-shaded.jar

5、命令执行 running jobs 提交作业操作

复制代码
现在虚拟机尝试能不能提交jar到flink去执行,相当于在web界面上传jar+submit new job 的操作
flink run -d -c ljh.kafka.consumer.FlinkKafkaConsumerExample /root/mypackage/my-jars/kafka-consumer-demo-1.0-SNAPSHOT-shaded.jar

如图,在dolphinscheduler中通过执行shell脚本,在命令行提交一个 Flink 作业(Job)

这个脚本就相当于我们在web界面 ->1、先上传jar包,2、然后执行 submit new job 操作


复制代码
#!/bin/bash

# 设置 Flink 环境变量
export FLINK_HOME=/root/mypackage/flink/flink-1.11.6
export PATH=$FLINK_HOME/bin:$PATH

# 启动 Flink 集群
$FLINK_HOME/bin/start-cluster.sh

# 等待 5-10 秒保证 JobManager 启动
sleep 10

# 提交 jar 执行 Kafka 消费任务
$FLINK_HOME/bin/flink run \
  -c ljh.kafka.consumer.FlinkKafkaConsumerExample \
  /root/mypackage/my-jars/kafka-consumer-demo-1.0-SNAPSHOT-shaded.jar

可以看到能正常消费kafka的消息。



我多次执行脚本,就出现多个 task ,然后当我用生产者发送消息时,只有其中一个task去执行消息消费,没有出现多个task重复执行消息的情况出现。

总结

现在就是能通过 dolphinscheduler 创建一个工作流,执行一个shell脚本,用来启动flink服务进程,然后让 flink能到指定的位置找到jar包(消费kafka消息的代码),然后提交一个 Flink 作业(Job)。

接着我用生产者发送消息,能成功看到其中一个 task 执行jar包中的代码,也就是消费消息。

数据源配置(持久化设置,待研究)
相关推荐
TM1Club6 小时前
AI驱动的预测:新的竞争优势
大数据·人工智能·经验分享·金融·数据分析·自动化
zhang133830890756 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
电商API_180079052478 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
龙山云仓8 小时前
No140:AI世间故事-对话康德——先验哲学与AI理性:范畴、道德律与自主性
大数据·人工智能·深度学习·机器学习·全文检索·lucene
躺柒9 小时前
读数字时代的网络风险管理:策略、计划与执行04风险指引体系
大数据·网络·信息安全·数字化·网络管理·网络风险管理
独自归家的兔11 小时前
从 “局部凑活“ 到 “全局最优“:AI 规划能力的技术突破与产业落地实践
大数据·人工智能
海域云-罗鹏11 小时前
国内公司与英国总部数据中心/ERP系统互连,SD-WAN专线实操指南
大数据·数据库·人工智能
策知道12 小时前
依托政府工作报告准备省考【经验贴】
大数据·数据库·人工智能·搜索引擎·政务
Henry-SAP12 小时前
SAP(ERP) 组织结构业务视角解析
大数据·人工智能·sap·erp·sap pp
TracyCoder12314 小时前
ElasticSearch内存管理与操作系统(一):内存分配底层原理
大数据·elasticsearch·搜索引擎