You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by gi...@apache.org on 2022/04/16 07:18:23 UTC

[dolphinscheduler-website] branch asf-site updated: Automated deployment: 5e5de55e8ec831919a9c760927400e943314f619

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler-website.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 1301867db Automated deployment: 5e5de55e8ec831919a9c760927400e943314f619
1301867db is described below

commit 1301867dbeeb174ba456c13b6f8518226f725ed5
Author: github-actions[bot] <gi...@users.noreply.github.com>
AuthorDate: Sat Apr 16 07:18:18 2022 +0000

    Automated deployment: 5e5de55e8ec831919a9c760927400e943314f619
---
 ..._Platform_Adapt_to_Apache_DolphinScheduler.html | 164 +++++++++++++++++++++
 ..._Platform_Adapt_to_Apache_DolphinScheduler.json |   6 +
 2 files changed, 170 insertions(+)

diff --git a/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.html b/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.html
new file mode 100644
index 000000000..c094b6e96
--- /dev/null
+++ b/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.html
@@ -0,0 +1,164 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
+  <meta name="keywords" content="How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler">
+  <meta name="description" content="How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler">
+  <title>How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler</title>
+  <link rel="shortcut icon" href="/img/favicon.ico">
+  <link rel="stylesheet" href="/build/vendor.eeae4ed.css">
+  <link rel="stylesheet" href="/build/blog.md.055b3f1.css">
+</head>
+<body>
+  <div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-dark"><div class="banner-tips"><div>🤔 有关于 Apache DolphinScheduler 的疑问,加入 Slack 频道来讨论他们 <a class="link-tips" href="https://join.slack.com/t/asf-dolphinscheduler/shared_invite/zt-omtdhuio-_JISsxYhiVsltmC5h38yfw">join #dolphinscheduler channel</a>! 🌟</div></div><div class="header-body"><span class="mobile-menu-btn mobile-menu-btn-dark"></span><a href="/zh-cn/index.html"><img cla [...]
+<div align=center>
+<img src="/img/2022-4-11/1.png"/>
+</div>
+<p>在 Apache DolphinScheduler Meetup 上,<strong>YY 直播 软件工程师 袁丙泽</strong>为我们分享了《YY直播基于Apache DolphinScheduler的适配与探索》。</p>
+<p>本次演讲主要包括四个部分:</p>
+<ul>
+<li>YY直播引入Apache DolphinScheduler的背景</li>
+<li>Apache DolphinScheduler的引入过程</li>
+<li>Apache DolphinScheduler应用的适配</li>
+<li>YY直播未来的规划</li>
+</ul>
+<div align=center>
+<img src="/img/2022-4-11/2.png"/>
+</div>
+<p><strong>袁丙泽</strong>YY直播 软件工程师,10 余年工作经验,主要从事风控大数据平台开发工作,对常用大数据组件深感兴趣,研发经验丰富。</p>
+<h2><strong>背景</strong></h2>
+<p>YY直播是中国领先的语音社交视频直播企业,目前我们团队的主要职责是保障公司的业务安全。</p>
+<h3><strong>01</strong>技术现状</h3>
+<p>目前我们采用分层的技术架构,最底层是数据源层,其次从下往上依次是采集层、存储层和管理层和计算层与应用层。</p>
+<p></p>
+<p>在<strong>数据源层</strong>,我们目前会去拉取各个业务方的一个关系型数据库数据,以及通过API向我们传输的数据,还有一些数据是通过Kafka这种流的方式来传输给我们。</p>
+<p></p>
+<p><strong>采集层</strong>采用了我们自己研发的一套数据采集系统。</p>
+<p></p>
+<p><strong>存储层</strong>中,我们目前将数据主要放在了关系型数据库中,如Clickhouse,还有一小部分会放在一些非关系型数据库中,如Redis和图库。当然大部分数据都存储在大数据系统中。</p>
+<p></p>
+<p><strong>管理层</strong>我们主要有大数据管理系统,结合自己研发的一个计算调度以及任务管理系统和服务治理平台。</p>
+<h3><strong>02</strong>调度Apache DolphinScheduler之前的问题</h3>
+<p>1、调度平台复杂:团队除了有基于Xxl-job的任务调度外,部分老项目中有使用Crontab、Springboot、Scheduler、Quartz等管理任务的启动。</p>
+<p>2、任务依赖需求强烈:目前我们所使用的的调度,仅能设置单个任务的执行,无法通过任务依赖形成工作流,任务依赖设置严重依赖于个人经验设定定时时间。实际上很多任务都需要有依赖关系。</p>
+<p>3、任务复杂多样:目前任务有基于大数据系统的Spark、Flink任务,服务治理平台中各种Java服务任务、Shell、Java application、Python等。</p>
+<h2><strong>引入过程</strong></h2>
+<p>在需求调研中,我们实际上需要一款调度平台,需要满足如下条件:</p>
+<p><strong>1、统一管理任务及依赖关系</strong></p>
+<p>随着业务计算的需求越来越多,特别是各种各样的画像计算和任务,这些任务分散在各个系统当中,管理起来非常困难,部分任务之间有一定的依赖关系,但配置其时间依靠的是个人经验。急需一款能够统一配置管理依赖的产品。</p>
+<p><strong>2、兼容公司内部各平台系统</strong></p>
+<p>我们需要调度任务平台管理我们的任务,同时为了快速投入使用,调度平台需要兼容我们公司其他的平台系统,如内部的Datax和Crontab服务。</p>
+<p><strong>3、高可用、高性能、高并发,容易使用</strong></p>
+<p>最后为了保证业务的稳定性,我们也需要这种调度平台能够高可用、高性能、高并发,并且容易使用。</p>
+<p></p>
+<p>通过调研我们发现,Apache DolphinScheduler几乎就是为我们设计的,适配过程中无需太多修改,就能满足我们需求。</p>
+<h2><strong>应用适配</strong></h2>
+<p>Apache DolphinScheduler 是一个分布式去中心化,易扩展的可视化DAG工作流任务调度系统,致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用,这非常符合我们的需求。</p>
+<p>首先了解下Apache DolphinScheduler的架构,便于理解接下来的适配案例。</p>
+<div align=center>
+<img src="/img/2022-4-11/3.png"/>
+</div>
+<p>Apache DolphinScheduler主要有API、master、 worker、 log以及 alert这5个模块。</p>
+<p>API接口层,主要负责处理前端UI层的请求。该服务统一提供RESTful api向外部提供请求服务。接口包括工作流的创建、定义、查询、修改、发布、下线、手工启动、停止、暂停、恢复、从该节点开始执行等等。</p>
+<p></p>
+<p>MasterServer采用分布式无中心设计理念,MasterServer主要负责 DAG 任务切分、任务提交监控,并同时监听其它MasterServer和WorkerServer的健康状态。MasterServer服务启动时向Zookeeper注册临时节点,通过监听Zookeeper临时节点变化来进行容错处理。</p>
+<p>WorkerServer也采用分布式无中心设计理念,WorkerServer主要负责任务的执行和提供日志服务。WorkerServer服务启动时向Zookeeper注册临时节点,并维持心跳。workServer还提供有logger服务。</p>
+<p></p>
+<p>Alert提供告警相关接口,接口主要包括两种类型的告警数据的存储、查询和通知功能。其中通知功能又有邮件通知和**SNMP(暂未实现)**两种。</p>
+<p></p>
+<p>目前我们部署的是2.0版本,主要使用了4台物理机,在这4台物理机上部署了2个master实例,2个API实例和3个worker与logger实例,一个alert实例。</p>
+<p></p>
+<p>接下来分享3个具体的适配案例。</p>
+<p></p>
+<p>首先是与我们服务治理平台的适配,该适配主要目的是用于任务监控;尽管Apache DolphinScheduler本身提供有任务监控模块,我们同事早已经习惯利用服务治理平台统一管理监控。所以我们需要把Apache DolphinScheduler任务运行状态及时上报至服务治理平台。</p>
+<h3><strong>01</strong>服务治理适配—MasterServer服务说明</h3>
+<p>在适配之前,再次详细了解下MasterServer服务,MasterServer提供有:</p>
+<ol>
+<li>Distributed Quartz分布式调度组件,主要负责定时任务的启停操作,当quartz挑起任务后,Master内部会有线程池具体负责处理任务的后续操作;</li>
+<li>MasterSchedulerThread是一个扫描线程,定时扫描数据库中的command表,根据不同的命令类型进行不同的业务操作;</li>
+<li>MasterExecThread(WorkflowExecutThread.java)主要负责DAG任务切分、任务提交监控、各种不同命令类型的逻辑处理;</li>
+<li>MasterTaskExecThread主要负责任务的持久化。</li>
+</ol>
+<h3><strong>02</strong>服务治理适配-code</h3>
+<p>我们的需求是监控任务,通过代码分析,我们发现任务提交与监听主要在WorkflowExecuteThread类中的方法中实现,该类会启动多个实例线程。分别负责任务执行与监听。其流程图如下:</p>
+<div align=center>
+<img src="/img/2022-4-11/4.png"/>
+</div>
+<p>任务提交及监控流程图</p>
+<p>我们的需求是监控任务,通过分析代码后发现,WorkflowExecuteThread主要有startprocess和handle events两个方法分别实现了任务执行与监听。其实我们主要在handleEvents方法中注入我们的服务治理平台数据收集代码,这样就能把任务监听情况及时上报到我们服务治理平台了。</p>
+<p></p>
+<p>其修改部分如下:</p>
+<div align=center>
+<img src="/img/2022-4-11/5.png"/>
+</div>
+<p>在服务治理平台中具体的效果图如下:</p>
+<div align=center>
+<img src="/img/2022-4-11/6.png"/>
+</div>
+<p>除了监控我们的具体任务状况外,我们还会分 project去做一些监控,最后都通过服务治理平台来做监控操作,比如像一些任务如果比较重要,我们就会配置一些电话报警,即一旦这个任务失败或者未按时执行完毕,便会进行电话通知。</p>
+<h3><strong>03</strong>Datax服务适配过程</h3>
+<p>第2个案例是关于Datax服务的适配过程。我们在研究Apache DolphinScheduler的时候,发现其已经集成了Datax类型的任务,这个对我们非常友好。因为我们也有数量相当多的任务是通过Datax来实现的,并且我们也开发了一部分Datax的插件,来去适配内部各个系统与存储的数据读写。</p>
+<p>Datax适配的时候主要分为两部分,一部分是通过这种自定义模板来去实现,这部分其实就是我们将之前的一些Datax的服务拷贝过来,稍加修改,就能够实现了,主要涉及到的是一些非关型数据库之间的一些数据交互。</p>
+<p></p>
+<p>而纯粹的关型数据库之间的交互,我们还是需要通过配置方式实现。</p>
+<p></p>
+<p>首先我们在配置Clickhouse读写任务时,就遇见了一个小bug。</p>
+<h3><strong>04</strong>Datax服务适配—Clickhouse兼容#8092</h3>
+<p>我们在使用Datax来读取Clickhouse数据源的数据时,发现在sql当中,只要引用参数,无论时间参数还是其他参数,在提交的时都会失败,我们就怀疑其中可能有一些bug,阅读错误日志的时候,也发现在Apache DolphinScheduler提交 SQL时,是参数并未被替换就直接提交给了Clickhouse去执行,由于clickhouse并不能识别我们的Apache DolphinScheduler参数,所以就直接抛出异常了。我们梳理了一下Apache DolphinScheduler在执行datax任务时读取clickhouse的流程。其中在将我们在Apache DolphinScheduler配置转为datax配置流程如下:</p>
+<div align=center>
+<img src="/img/2022-4-11/7.png"/>
+</div> 
+<p>系统首先要做的就是先去解析sql的所有语法,然后通过语法拿到一些列的信息,这时它要去调用sql解析器。在这个过程当中,如果Apache DolphinScheduler没有对我们的这个参数去做替换,在执行这个 circle的时候就会发生错误,最后导致整个任务失败。</p>
+<p></p>
+<p>因此在解决的过程中,既然可能获取不到Clickhouse的解析器,最好的方法就是直接加入一个解析器。首先构建一个Json文件,然后格式化解析出来的所有的链,最后对语法去做一次解析,层层调用,最后能够调用到目标解析器。</p>
+<h3><strong>05</strong>Time参数适配Apache DolphinScheduler现状</h3>
+<p>最后的案例是关于时间参数适配。</p>
+<p></p>
+<p>Apache DolphinScheduler虽然提供有时间参数,但是我们自己的数据大部分都需要精确到毫秒级别的unixtime时间。通过阅读Apache DolphinScheduler的文档,我们遗憾地发现其并未提供该类型时间参数的实现。翻阅源码过程中,我们发现Apache DolphinScheduler提供有timestamp函数,实际上能够提供unixtime时间值。</p>
+<p></p>
+<p>在使用timestamp的时候,我们发现有两个小问题,首先timestamp直接表达unixtime有一些歧义,其次timestamp仅支持到秒级别,而我们大部分数据需要毫秒级别。为了方便使用,我们对此部分做了一些修改进行适配。</p>
+<div align=center>
+<img src="/img/2022-4-11/8.png"/>
+</div>
+<p><strong>适配过程</strong></p>
+<p>首先我们做的第一件事情就是消除歧义,在Apache DolphinScheduler中,Timestamp是表达时间的方式,从Wiki百科获得的关于Timestamp和Unix time时间表达的解释能看出,Timestamp通常是通过日期加时间来表示的,但是Unix time时间采用的是格林威治时间,从1970年1月1日零时零分零秒至今,并且不考虑微秒的时间表达,采用的是整数。</p>
+<p>明确了需求,接下来就需要了解如何实现了。我们通过分析代码发现,时间参数函数的实现是通过api方式层层调用,最终主要函数均通过在TimePlaceHolderUtils类中calculateTime的方法实现。该方法实现过程中,也会调用TaskConstants类中的表达时间函数名称的常量。于是我们对其中 TaskConstants类的一些常量进行了修改。又因为我们需要毫秒级别的函数,加入了一个 milli_unixtime函数,最后为了满足设备用户的需求,我们加入了一些更精度更高的函数,如微秒和纳秒的函数。</p>
+<div align=center>
+<img src="/img/2022-4-11/9.png"/>
+</div>
+<div align=center>
+<img src="/img/2022-4-11/10.png"/>
+</div>
+<p>在补数功能上,在使用Apache DolphinScheduler之后,我们只需要在手动执行任务的时候选中补数的功能,再填充上我们要调度的日期,就可以直接进行补充了,同时我们还可以填写并行度。这个功能对我们这来说非常实用的,在Apache DolphinScheduler 2.0版本以后,时间的配置和执行的时间有日绩差的问题也被解决,在使用上带来了很大的便利。</p>
+<h2><strong>未来规划</strong></h2>
+<p>在使用的过程中,我们发现通过Apache DolphinScheduler配置的任务在使用数据源方面,目前还不支持高可用的方案,这个需求在我们这里是比较强烈的,因此目前我们也正在做高可用的适配。</p>
+<p>其次,我们目前使用的是Apache DolphinScheduler的2.0版本,因为社区比较活跃,版本升级也比较快,即使是一个小版本的升级,也会带来一些很大的功能和设计上的一些变化。比如在新版本当中,告警功能已经插件化,也解决了一些补数日期换算的问题。这也驱动着我们团队升级到新的版本去体验一些新的功能。虽然目前Apache DolphinScheduler只是在我们自己的小团队内部使用,但我们也正在思考让整个公司普遍使用的可行性方案。</p>
+<p></p>
+<p>尽管Apache DolphinScheduler非常完美地解决我们的大部分问题,并且大幅度提高我们的工作效率。但在各种复杂的情况下,我们还是会遇见一些小的Bug,我们未来也会在修复后提交给官方,当然我们自己在使用过程中也尝试了一些小Future,未来也会提交给官方共同讨论。</p>
+</section><footer class="footer-container"><div class="footer-body"><div><h3>联系我们</h3><h4>有问题需要反馈?请通过以下方式联系我们。</h4></div><div class="contact-container"><ul><li><a href="/zh-cn/community/development/subscribe.html"><img class="img-base" src="/img/emailgray.png"/><img class="img-change" src="/img/emailblue.png"/><p>邮件列表</p></a></li><li><a href="https://twitter.com/dolphinschedule"><img class="img-base" src="/img/twittergray.png"/><img class="img-change" src="/img/twitterblue.png"/><p>Twitt [...]
+  <script src="//cdn.jsdelivr.net/npm/react@15.6.2/dist/react-with-addons.min.js"></script>
+  <script src="//cdn.jsdelivr.net/npm/react-dom@15.6.2/dist/react-dom.min.js"></script>
+  <script>window.rootPath = '';</script>
+  <script src="/build/vendor.84aac82.js"></script>
+  <script src="/build/blog.md.f25cabd.js"></script>
+  <script>
+    var _hmt = _hmt || [];
+    (function() {
+      var hm = document.createElement("script");
+      hm.src = "https://hm.baidu.com/hm.js?4e7b4b400dd31fa015018a435c64d06f";
+      var s = document.getElementsByTagName("script")[0];
+      s.parentNode.insertBefore(hm, s);
+    })();
+  </script>
+  <!-- Global site tag (gtag.js) - Google Analytics -->
+  <script async src="https://www.googletagmanager.com/gtag/js?id=G-899J8PYKJZ"></script>
+  <script>
+    window.dataLayer = window.dataLayer || [];
+    function gtag(){dataLayer.push(arguments);}
+    gtag('js', new Date());
+
+    gtag('config', 'G-899J8PYKJZ');
+  </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.json b/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.json
new file mode 100644
index 000000000..8bd724ef4
--- /dev/null
+++ b/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.json
@@ -0,0 +1,6 @@
+{
+  "filename": "How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.md",
+  "__html": "<h1>论语音社交视频直播平台与 Apache DolphinScheduler 的适配度有多高</h1>\n<div align=center>\n<img src=\"/img/2022-4-11/1.png\"/>\n</div>\n<p>在 Apache DolphinScheduler Meetup 上,<strong>YY 直播 软件工程师 袁丙泽</strong>为我们分享了《YY直播基于Apache DolphinScheduler的适配与探索》。</p>\n<p>本次演讲主要包括四个部分:</p>\n<ul>\n<li>YY直播引入Apache DolphinScheduler的背景</li>\n<li>Apache DolphinScheduler的引入过程</li>\n<li>Apache DolphinScheduler应用的适配</li>\n<li>YY直播未来的规划</li>\n</ul>\n<div align=center>\n<img src=\"/img/2022-4-11/2.png\"/>\n</div> [...]
+  "link": "/dist/zh-cn/blog/How_Does_Live-broadcasting_Platform_Adapt_to_Apache_DolphinScheduler.html",
+  "meta": {}
+}
\ No newline at end of file