用户案例 | 珍岛集团基于 Apache DolphinScheduler 打造智能营销云平台

news2024/9/29 7:28:08

珍岛集团致力于打造全球领先的智能营销云平台,在国内率先推出的Marketingforce(营销力)平台,专注于人工智能、大数据、云计算在数字营销及企业数字化智能化领域的创新与实践,面向全球企业提供营销力软件及服务,以一站式智能营销生态助力企业进行数字化转型。

file

之前,珍岛集团使用完全开源的Apache DolphinScheduler任务调度框架,随着业务的发展,以及数据集成平台和GMA,算法计算平台越来越多的业务需求,开源版本的Apache DolphinScheduler已经不能完全满足需求,迫切地需要对Apache DolphinScheduler做一些定制化的开发。以下是珍岛集团团队最近一年在开源版本的基础上进行的优化和改进。

业务需求

技术方面

1.期待简单易用,低代码的方式;

2.Plug-in足够多,能够符合各业务模块需求;

3.活跃的开源社区,优秀的人才;

4.技术栈能够和珍岛现有各业务模块高度吻合;

5.后期新建业务模块时,不需要过多的二次开发。

业务方面

  • 对调度系统的稳定性要求高;

  • 高并发情况下,任务能够正常执行。

拿一个简单的业务来举例,当用户通过配置设置好受众的特征,需要能够在指定的时间内,通过离线数据和算法,将具体的目标受众计算出来,并且将优惠卷或者消息通过各种渠道推送给目标受众,如果产生延迟,或者错误,就会使用户产生损失。另外,还要满足能够抗住夜间4000个流程实例同时启动,并且正常运行的需求。

架构设计

在珍岛集团,业务层以数据集为例,数据集将业务数据转换成二次开发后暴露的公共接口需要的参数,业务执行过程通过MQ将实例信息发送给业务方,当流程定义满足于配置的告警策略,将发送自定义邮件和企微信息,如果是DataX类型任务,则调用K8S的API,并通过异步的方式获取日志信息。

file

二次开发实践

MQ解耦

背景:

在珍岛内部,很多模块都需要调度中心调度,例如数据的ETL,标签模块、算法模型模块都需要系统调度,各模块需要Apache DolphinScheduler的状态,历史记录等数据,并在自己的模块实现自己的业务,然而各模块和Apache DolphinScheduler使用的不是同一个数据库。于是我们就需要将Apache DolphinScheduler中的一些信息推送给各个模块,使得各模块能够更灵活的使用这些信息。

当有新的业务模块需要使用Apache DolphinScheduler,只要按照给定的结构去保存,并接收处理Apache DolphinScheduler返回的MQ消息即可。

解决方案:

通过MQ将状态,流程实例,任务实例等状态传递给各模块。

我们新增了四个自定义注解,用于流程实例和任务实例的新增与状态变更。

file

以创建流程实例为例:

file

file

对于Apache DolphinScheduler而言,某个任务实例失败了,那么该任务实例的下游就不执行,也不生成记录了,但是对于有些业务来说,可能会想知道整个任务执行时涉及到了哪些节点(用户未运行整个画布),所以我们又稍微做了一些改造,将本次流程实例涉及到的节点也全部返回了。

用户自定义邮件

背景:

Apache DolphinScheduler 默认的邮件消息格式过于死板,对于客户来说不够友好。

解决方案:

对于用户来说,用户是看不懂源生Apache DolphinScheduler的邮件的,我们将Apache DolphinScheduler 以及业务中的一些参数交给用户,使得用户能够自定义邮件内容,业务数据相关的占位符由业务解析,解析完成之后将数据再移交给Apache DolphinScheduler,Apache DolphinScheduler再接着处理和自身相关的占位符变量。

DataX on K8S与在本地运行的融合

背景:

  1. 夜间定时任务多,并发量大,在该时间段内需要的资源多,但是日间需要资源相对少很多,如果使用K8S可以释放出来给其他模块使用;

  2. DataX节点运行在worker 机器上,并发大的时候,资源使用率陡增,参数设置不正确,可能会导致OOM 的情况,交给K8S运行可保证其稳定性;

  3. worker应该只做提交任务的工作,而不是负责具体任务的运行;

  4. 减少给予worker的配置资源。消耗资源小的可以运行在本地,消耗资源大的运行在k8s上。

解决方案:

改造DataX组件,再生成job 的JSON 之后交给K8S处理,k8s调用自定义的DataX镜像,并异步获取K8S 的job日志。当job完成之后就释放掉该job的资源。

DataX改造

对于数据集成平台来说,用户一定会有许多非JDBC类型的数据源需要抽取。所以我们做了以下改造:

  1. 解耦DataX的reader和writer 的生成方式

  2. 支持动态更新自定义模版,原先的DataX类型任务,开启自定义模版,保存后存储的信息就固定了。如果数据源的账号密码或者其他信息改变。再次执行还是历史保存的信息。

背景:

1. 目前客户的一些数据源信息,不一定是JDBC类型的数据源,例如抖音粉丝数据属于API接口调用,HDFS。又或者说HBase的结构和普通的RDBMS的结构不一样。所以目前的DataX节点不足以满足我们全部的需求。

2.对于业务模块来说,更倾向于使用JSON形式,因为JSON更灵活,能够完全使用DataX的功能,但是使用自定义模版会出现以下情况:用户新建数据源a,数据源a 的密码是123,并用数据源a生成流程定义A,运行A,没有问题能够正常执行,此时将数据源a的密码修改为456,再次执行A,报错。如果a关联了很多很多流程定义,手动改就会很累,而且找到a关联的流程定义也需要额外的接口去做,这不符合用户习惯。

解决方案:

将数据源Id 也放入JSON中,运行时重新拼接JSON,自定义抽象类,将DataX的reader 和writer 生成分离,JDBC走公共的一套,其他非JDBC或特殊类型走自己派生的逻辑。

加密指定类型的日志信息

在Apache DolphinScheduler中各类型节点使用同一套正则表达式隐藏日志,不够灵活。共用一套也可能产生互相影响。于是我们根据节点的类型来配置各自需要隐藏的内容。

Apache DolphinScheduler 优化实践

另外,在使用Apache DolphinScheduler的过程中,我们还发现了一些或大或小的使用问题,为了更好地使用,我们对其中一些问题进行了优化修改,并提交了PR。比如:

  1. 今年Apache DolphinScheduler刚上线时,我们发现某些项目的SUB_PROCESS节点,明明已经运行完毕,但是还是运行中的状态。通过排查发现父流程实例的失败策略为结束,并且选择并行策略。当subprocess类型节点很多的时候,一部分子流程实例已经运行成功,但是subprocess 在父流程中的任务实例还未更新成完成状态,此时一个subprocess 类型节点失败了,父流程会杀死所有存活的任务实例,所有存活的subprocess关联的子流程实例会被强制更新为ready stop 状态,导致父流程中的任务实例无法更新,所以一直显示提交成功,或者运行中状态。对此,添加subprocess 任务状态的判断条件,即可解决此问题。#14169

  2. 当任务有有问题,会造成死循环,疯狂打日志,最后磁盘打满,Apache DolphinScheduler不再执行任务的问题,同时编辑画布导致任务死循环报错的问题。对此,建议当业务出现问题时跳出死循环,以此减少日志疯狂打印,避免磁盘刷满的问题。 #13045 #13053

  3. Switch类型的任务,当switch的分支的扭转,再次交合时,执行的流程不符合预期。对此,当Switch 节点执行后续节点的分析出现了问题,可以将不该跳过执行的节点放入了skipTaskNodes中,修改switch的编排逻辑,以此解决该问题。#14537

  4. 针对当任务执行后,只会在执行完成后更新pid的问题,我们新增一个事件类型,在进程阻塞等待任务执行完毕之前,通过netty 将pid 传递给master 并及时更新到数据库。#13201

  5. 此外,在参数调优上,我们还调整了quartz 框架的org.quartz.jobStore.misfireThreshold参数,可以在夜间承载更多的并发。

  6. 还修改了check4timeOut的超时时间,以便能够减少日志大小,减少磁盘消耗。

用户收益

Apache DolphinScheduler稳定的赋能业务增长的客户全域数据平台,整合客户全渠道数据,统一用户档案与标签体系,赋能用户洞察与业务增长。同时,它还支持多种数据源集成,如实时数据、离线数据,并实现了跨类型、跨源数据的全链路打通。利用Apache DolphinScheduler给类型节点,通过低代码的形式使得业务部门可参与编码,显著节省了 ETL 人力,降低了维护成本。

通过近一年我们对 Apache DolphinScheduler 进行优化,近半年公司没有出现高级别的BUG。

用户简介

珍岛信息技术(上海)股份有限公司,简称珍岛集团,成立于2009年,致力于打造全球领先的智能营销云平台,也是国内率先推出的Marketingforce(营销力)平台,专注于人工智能、大数据、云计算在数字营销及企业数字化智能化领域的创新与实践,面向全球企业提供营销力软件及服务,现已形成IaaS(云计算)、PaaS(开放中台)、All-in-one AI SaaS智能营销云平台。以营销云、销售云两大业务体系为支撑,珍岛以一站式智能营销生态助力企业开启数字化转型之旅。

致谢

感谢韩玉林,顾琦琦,以及珍岛运维部和数据平台部的协助与优化意见

感谢Radeity,ruanwenjun,以及DolphinScheduler 社区的帮助与建议

作者简介

伏长海

珍岛集团开发工程师

Apache Dolphinscheduler Contributor

本文由 白鲸开源科技 提供发布支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1130012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python轻量规则引擎rule-engine入门与应用实践

rule-engine是一种轻量级、可选类型的表达式语言,具有用于匹配任意 Python 对象的自定义语法,使用python语言开发。 规则引擎表达式用自己的语言编写,在 Python 中定义为字符串。其语法与 Python 最相似,但也受到 Ruby 的一些启发…

Centos8 降低gcc版本至gcc-7.3

1 首先卸载系统中的gcc sudo yum remove gcc 2 重新安装gcc-7.3 sudo dnf group install “Development Tools” 然后再次卸载gcc sudo yum remove gcc 然后发现centos-release-scl-rh已经安装了 sudo yum install centos-release-scl-rh yum -y install devtoolset-7-gcc dev…

SCAU 编译原理 实验1 词法分析实验

实验内容&#xff1a;参考附录C.1 设计一个简单语言的词法分析程序&#xff0c;要求能够正确处理关键字、运算符&#xff08;单个符号的和复合的运算符如>、>&#xff09;、分界符、标识符、常数等单词&#xff0c;以及不是单词的换行回车、注释。 #include<stdio.h&…

【自然语言处理】理解词向量、CBOW与Skip-Gram模型

文章目录 一、词向量基础知识1.1 One-hot表示1.2 Distributed表示 二、word2vec基础知识2.1 CBOW和Skip-gram 三、基于Hierarchical Softmax的 CBOW 模型和 Skip-gram 模型3.1 CBOW 模型3.2 Skip-gram 模型 参考资料 由于计算机不能直接对各种字符进行运算&#xff0c;为此需要…

Java8实战-总结44

Java8实战-总结44 CompletableFuture&#xff1a;组合式异步编程Future 接口Future 接口的局限性使用 CompletableFuture 构建异步应用 CompletableFuture&#xff1a;组合式异步编程 最近这些年&#xff0c;两种趋势不断地推动我们反思我们设计软件的方式。第一种趋势和应用运…

让 CHAT 充分发挥优势

今天&#xff0c;小编带大家看下CHAT是如何写作的&#xff1f; 作为家长的你&#xff0c;是不是有为孩子的作业而烦恼&#xff1f;是不是也担心孩子的压力太大&#xff1f;产生逆反心理&#xff0c;今天我们将看下如何利用CHAT来帮助孩子提高学习的质量&#xff0c;帮家长减轻心…

基于hugging face的autogptq量化实践

1.量化并保存到本地的 #导入库&#xff1a; from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig model_id "facebook/opt-125m"quantization_config GPTQConfig(bits4,group_size128,dataset"c4",desc_actFalse, )tokenizer A…

Git的远程仓库

Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作…

让数据“动”起来:Python动态图表制作详解

在读技术博客的过程中&#xff0c;我们会发现那些能够把知识、成果讲透的博主很多都会做动态图表。他们的图是怎么做的&#xff1f;难度大吗&#xff1f;这篇文章就介绍了 Python 中一种简单的动态图表制作方法。 数据暴增的年代&#xff0c;数据科学家、分析师在被要求对数据有…

DAY33 1005. K次取反后最大化的数组和 + 134. 加油站 + 135. 分发糖果

1005. K次取反后最大化的数组和 题目要求&#xff1a;给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; …

风力发电功率预测(CEEMDAN-LSTM-CNN-CBAM模型,Python代码)

1.前言 1.1.运行效果&#xff1a;风力发电功率预测&#xff08;CEEMDAN-LSTM-CNN-CBAM模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 1.2.环境库&#xff1a; 如果库版本不一样&#xff0c; 一般也可以运行&#xff0c;这里展示我运行时候的库版本&#xff0c;是…

hadoop伪分布式安装部署

首先jdk安装完毕 jdk安装文档参考&#xff1a; Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并配置环境变量_Xi-Yuan的博客-CSDN博客 准备好hadoop的安装包 我的下载地址如下&#xff1a; We Transfer Gratuit. Envoi scuris de gros fichiers. 将hadoop包上传到随…

Leetcode—2678.老人的数目【简单】

2023每日刷题&#xff08;八&#xff09; Leetcode—2678.老人的数目 int countSeniors(char ** details, int detailsSize){ int ans 0; int i; int tens 0; int ones 0; for(i 0; i < detailsSize; i) { tens ((details i) 11) - ‘0’; ones ((details i) 12)…

二十三、设计模式之组合模式![

目录 二十三、设计模式之组合模式能帮我们干什么&#xff1f;主要解决什么问题&#xff1f;优缺点优点缺点&#xff1a; 使用的场景理解实现角色组合模式 总结 魔战已经完结。成功登顶。占领敌军最高峰。 二十三、设计模式之组合模式 “组合模式”也被称为“部分整体模式”该…

报错:SSL routines:ssl3_get_record:wrong version number

一、问题描述 前后端联调的时候&#xff0c;连接后端本地服务器&#xff0c;接口一直pending调不通&#xff0c;控制台还报以下错误&#xff1a; 立马随手搜索了一下解决方案&#xff0c;但是emmm&#xff0c;不符合前端的实际情况&#xff1a; 二、解决方法&#xff1a; 实际…

WIN11+OPENCV4.8 编译及下载失败处理方法

1. 基础准备 1. 下载Opencv和Contrib库 Opencv&#xff1a;Releases opencv/opencv GitHub Contrib&#xff1a;Tags opencv/opencv_contrib GitHub 2. 安装Visual Studio 或 MinGW64 MinGW&#xff1a;Tags opencv/opencv_contrib GitHub 这里安装1.12.0 MinGW 。 以…

uniapp 自定义导航栏

自定义导航栏 修改 pages.json 在 pages.json 中将 navigateionStyle 设为 custom 新建 systemInfo.js systemInfo.js 用来获取当前设备的机型系统信息&#xff0c;放在 common 目录下 /*** 此 js 文件管理关于当前设备的机型系统信息*/ const systemInfo function() {/***…

Python深度学习实战-基于Sequential方法搭建BP神经网络实现分类任务(附源码和实现效果)

实现功能 第一步&#xff1a;导入模块&#xff1a;import tensorflow as tf 第二步&#xff1a;制定输入网络的训练集和测试集 第三步&#xff1a;搭建网络结构&#xff1a;tf.keras.models.Sequential() 第四步&#xff1a;配置训练方法&#xff1a;model.compile()&#x…

Lec09 Interrupts | 中断

中断与系统调用区别 asynchronous。当硬件生成中断时&#xff0c;Interrupt handler与当前运行的进程在CPU上没有任何关联。但如果是系统调用的话&#xff0c;系统调用发生在运行进程的context下。concurrency。我们这节课会稍微介绍并发&#xff0c;在下一节课&#xff0c;我…

水电站与数据可视化:洞察未来能源趋势的窗口

在信息时代的浪潮中&#xff0c;数据可视化正成为推动能源领域发展的重要工具。今天&#xff0c;我们将带您一起探索水电站与数据可视化的结合&#xff0c;如何成为洞察未来能源趋势的窗口。水电站作为传统能源领域的重要组成部分&#xff0c;它的运行与管理涉及大量的数据。然…