Apache DolphinScheduler是一个云原生的分布式的工作流调度系统,也是首个由国人主导并贡献到Apache基金会的大数据工作流调度领域的顶级项目,拥有着每日支持千万级任务调度的能力。据不完全统计,目前已有一千多家不同领域企业在生产环境上使用Apache DolphinScheduler。
能够拥有如此多的用户群体,主要由于Apache DolphinScheduler拥有着以下几个关键优势:
- 高可靠性:调度最重要的能力是可靠性。Apache DolphinScheduler在架构上采用了去中心化的多Master和多Worker的设计。所有的Master Server都会同时工作,包括Worker也是无中心的。且在这样的架构下采用了任务队列机制去避免过负载,这样可以有效避免机器卡死。
- 简单易上手:ApacheDolphinScheduler的前身是EasyScheduler,Easy和Simple一直是我们的核心理念。ApacheDolphinScheduler拥有可视化的拖拉拽界面,所有的定义都是通过拖拉拽形成的,同时也有OpenAPI与第三方系统对接。有一些习惯于使用Python的小伙伴,也可以使用PY DolphinScheduler去创建工作流定义。
- 使用场景丰富:ApacheDolphinScheduler能够支持多租户、权限管理以及超过20种的常用任务。这一能力是目前很多开源项目,包括一些商业调度系统所不具备的。ApacheDolphinScheduler设计之初的目标就是超越一些商业公司的调度系统。如果开源项目有足够的价值,足以代替一些商业公司产品。
- 高扩展性:我们希望ApacheDolphinScheduler支持自定义任务类型,目前已实现了SPI化,未来还会使其拥有更好的热加载能力。Apache DolphinScheduler分布式调度的特性将得到强化,例如拥有更多K8S能力,随着集群的能力而实现线性增长。扩展性方面,应当具备弹性伸缩的能力,未来也会实现K8S的Operator,Serverless以加大Master的伸缩容。
当然,作为一款开源项目,ApacheDolphinScheduler的每一步发展与成长都离不开社区的贡献,开源社区的力量是非常强大的。为了能够让大家更好地记住ApacheDolphinScheduler,这里也介绍一个社区所贡献的slogan,那就是“工具选的好,下班回家早。调度用的对,半夜安心睡。"
架构迭代中的经验与教训
"优秀的架构不是设计出来的,而是迭代出来的。“这句话在ApacheDolphinScheduler中体现得淋漓尽致。以下是ApacheDolphinScheduler最新的架构。最上端能够直观可感知的是UI,UI界面下面则承载着APIServer,如果通过OpenAPI去调ApacheDolphinScheduler,也是通过这样一个服务接口来调起的。
在此之下还有数个对等的Master Server,Master Server会根据一些算法,例如随机、轮询或是基于CPU和内存的线性加权等给Worker分任务,WorkerServer则会在接收任务时响应,并在完成任务时回应Response。大数据调度很重要的特点是很多任务是离线的,任务的运行时间较长,大部分任务都会超过30分钟甚至几个小时,所以需要分响应和Response。Master Server和Worker Server都会注册ZK集群,主要负责服务的注册、监听。如果Master或Worker Server挂了,需要恢复,包括一些容错的机制,以及极个别情况下,会用到分布式锁。去分布式锁、减少数据库轮询是架构改造的核心目标之一。Master Server在工作时,先抢一把锁,谁抢到锁谁工作。这时ZK在充当分布式锁的过程中,性能是比较低的,对此我们做了去分布式锁的优化,大幅减少线程的使用。
1.3架构与1.2架构也存在一个明显的区别,1.3架构在1.2架构的基础上删除了TaskQueue。之所以如此设计,是因为越来越多的用户发现,在任务较多的时候,Worker Server能够到达上百台。由于其用TaskQueue做了缓冲,因此会给数据库造成极大的压力,仅是维护一个数据库连接池就有可能都会把数据库的连接池耗尽。
无论是去分布式锁还是去TaskQueue,其实都符合架构发展的趋势。写代码是一件很有趣的事情,有时你会发现我们能够通过写出新的代码创造价值,但后来又发现一些不合理的地方,因此要将此前写出的东西删掉、优化掉,这其实也是一种价值的体现。架构的迭代、演进亦是如此,是一个不断做取舍的过程。
在做去分布式锁时,我们的第一感觉是需要加一个Scheduler,用API去与Scheduler交互,Scheduler接到任务或定时任务后,去分发到每一个Master上。但随后又考虑到,如果后续的任务较多,其一定会受限于当前的Active的节点本身,例如CPU、内存等一些硬件的设施,就像Hadoop的NameNode、Active的NameNode一样,会有这样的压力。最终我们还是放弃了这样的架构,虽然当时已经实现了代码,但依然选择了进行改进。对每一个Master去做编号,并使其按照哈希的方式获取任务,这是当时最终选择的方式,也是去分布式锁当前的实现方式。查询到任务,而后再去构建有向无环图,去生成任务实例,并进行分配任务。
云原生时代调度的发展方向其实还有很多,我们希望调度能够Serverless化、能够更加容器化、更加弹性化。在架构方面,要去ZK,使其更加稳定、更加健壮。包括支持多云的能力,现在已经有越来越多的公司使用不止一朵云,因此Apache DolphinScheduler也需要有跨云、多云的能力,这方面后续会有更多的支持。弹性的伸缩,任务的隔离性等,都是需要考虑的能力。
如何做一个开源项目
做开源项目的第一要素,是要考虑定位。首先需要了解目前是否有竞品或可参考的项目,明确想要做的项目能否解决现有产品没有解决的痛点。其次是产品定位,这将直接决定项目的天花板。最后,一定要有创新,而不是重复造个轮子。很多用户以及贡献者是会去对同类型项目进行比较选择的,没有创新将很难得到支持。
第二点,做项目时也要从用户角度考虑。一定要明确你要解决什么样的用户痛点,以及它与其他开源项目有何不同,将这些问题想清楚再动手是不迟的,不走弯路即是快。此外,也需要考虑这一领域的商业公司,我们能否通过开源的方式超越这些商业公司,对方用户的替换代价有多大,为什么要从其他项目替换到你的项目,这都是需要考虑的。
第三点,一个开源项目有持久的生命力这一点非常重要,简单来说就是能否解决贡献者吃饭的问题。目前已经有越来越多的企业将ApacheDolphinScheduler写在招聘需求中,例如熟悉ApacheDolphinScheduler者优先、贡献者优先等,这些都是能够给贡献者的加分项。贡献者也是要吃饭的,也有各种各样诉求,能够让贡献者通过参与开源获得收益,这非常重要。
当项目初步完成后,则需要去寻找种子用户,让用户作出评价,再去改进,千万不要闭门造车。在ApacheDolphinScheduler发展的早期,我们真的会手把手教用户操作,能去企业拜访就去拜访,不能拜访就远程教学,这样才找到了第一批种子用户,大家才愿意去“吃这只螃蟹”。有了种子用户,才能够形成口碑,口碑传播虽然是一个极慢的过程,但却十分有效。
坚持,也是做开源过程中非常重要的一件事。很多开源项目做不过两年,这与它的项目作者、创始团队有很大的关系,但凡有一些杂念,没有坚持下去,都是非常可惜的。如果你觉得自己的项目很好,一定要坚持下去,在中国做开源很难,要花大量的业余时间与精力在项目上,所需要付出的努力甚至会高于一些商业项目。最后一点,酒香也怕巷子深。大多数开源项目都是开发者做起来的,但很多开发者其实并不是很愿意去宣传自己的项目,也有一些可能由于表达能力弱一些,不擅长分享。对此的建议是一定要抓住一切机会去推广、宣传自己的项目。例如在群中分享,或与别的项目联合举办meetup、去公司试讲。这些宣传与推广能帮助你的项目收获更多的用户与贡献者。
如何参与一个开源项目
参与开源项目首先是一个很好的提升技术能力的方式,越是顶级的、知名的开源项目,参与的高手越多。通过参与开源我们能够快速得到技术能力的提升,通过与高手的交流,也能够收获更多的技术经验。
第二点,参与开源,一旦你的代码被使用,它就会运行在成千上万的服务器之上,被不同的人、不同的企业使用,这是一件非常令人骄傲的事,会很直接地提升你的自信心与获得感。
第三点,大家会认可你的贡献,开源中的一条规则就是"英雄不问出处"。无论你的职位高低、资历深浅,贡献多的人,就会被社区认可,就会有影响力,你的声望就会比较大。
第四点,丰富阅历。中国是世界上唯一能够把参与开源写进简历并且会在招聘中作为一个加分项的国家。中国的很多企业为开源人提供了这样的机会,例如你研究了某一个项目的源码、对其熟悉,或认识一些项目的贡献者,遇到问题能够联系他们寻求帮助,这会非常有用,这些经历能够为你的简历加分。
第五点,结交高手。公司毕竟还是一个小圈子,你能够在公司中认识的人是比较有限的,但是通过开源,你能够认识全世界的高手。无论对技术发展还是职业发展,这都是有帮助的。
第六点,收获创新性。参与一些新型的开源项目,能够了解到目前这一领域可能的创新机会及思路。开源是可以通过创新等力量打破垄断的,这是已经多次得到过验证的道理。
关于如何找到一个适合自己的开源项目,很多情况是工作需要,另外个人兴趣也是很重要的一点。开源项目的评价标准有很多,但是比较直观的参考因素就是社区的活跃度。Apache的理念中有一条是“社区大于代码”,独行者快,众行者远,社区的活跃度代表了这个开源项目到底能走多远。对开源感兴趣的同学,首先可以通过邮件列表订阅user,若是贡献者则可以订阅DEV。做一些非技术性的讨论,参加一些meetup,都是参与开源的机会。通过这些渠道你能够充分了解到这个项目的各个方面信息,也可以确定这个项目是否靠谱。
第二点,先在本地使用开源项目,例如SeaTunnel这样的项目,它是一个Apache基金会孵化的项目,其贡献者群体也是非常活跃的,这就是一个比较优质的项目。我们去参与其中时,应该先把它先运转起来、运行起来,去直观地感受项目的用途以及功能。
第三点,不要憋大招。尤其是在做第一次贡献的时候,good first issue都是比较简单的,大家可以通过这个练手。找一些小的issue去fix,然后再慢慢从提交小PR到提交大PR。对于不了解流程的同学,可以去学习贡献规范,尤其像Apache中的项目,都有非常详细的指导贡献的流程文档。此外,贡献新生项目,更容易成为Committer,这也是很多小伙伴会去考虑的一点。如果你的目标是成为一个项目的Committer,那么参与一个新的开源的项目,实现这个目标的难度会小很多。例如像SeaTunnel这样的云原生做数据迁移、数据备份、数据集成的项目,贡献几种数据源,成为一个Committer也是有可能的。
思考与前瞻
"社区是一群为了共同利益而聚集到一起的人,做着有意义的事情。"这是《用户共创》的作者乔诺给大家分享的。开源最佳状态其实是边用边贡献边吐槽,这是参与开源的最佳状态。大家用的过程中吐吐槽,然后再提一个PR,发现项目中不好的地方,再把它fix一下,这才是开源最佳的状态。
目前有大量的企业都在使用开源,未来很多的基础软件,包括一些中间件,都会以开源的形态存在,因此也希望大家能够更多地参与开源。思考在开源之中自己能够做哪些事情,是否能够做更多的贡献。将开源当成自己职业生涯、自己青春的一部分,去丰富自己的阅历,为中国的开源软件事业做出一些贡献,这是当代青年尤其是程序员应该追求的事情。我们共同的目标应当是立足中国、贡献全球。