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