Pinterest 开源工作流管理 —— Pinball

g4mm 10年前

当我们在一个快速动态变化的环境中编译时,我们需要一个灵活、能满足我们数据处理需要的工作流管理器;在尝试了一些选择后,我们决定自己做一个:PinballPinball能适应从简单脚本到复杂的分布式计算的广泛数据处理需要,今天我们开放pinball的源码。Pinball加入了我们其他的开源项目像SecorBender,这些都存放在我们的Github上;

建立高度定制化的工作流管理器

新的产品特性的开发通常受限于获得的数据的有效性。通常来自于日志的尚未加工的数据,在到达下游应用处理前往往已经在多个维度被分割、合并或者筛选过。因此,数据转换处理常常用工作流来建立模型,通过工作流把数据抽象成直观的、由表示处理步骤的节点和描述运行依赖的边界组成的图。

工作流可以是任意复杂的。在现实环境中遇到一个由数百个节点组成的工作流也是不罕见的。建设,运行和维护那样复杂的工作流需要用专门的工具。一个bash脚本做不了。

尝试了几个开源的工作流管理软件后,我们发现没有一个软件有足够的灵活性来适应我们在数据处理解决方案上不断变化的需求。特别是,当前可用的解决方案不是只支持一个特定类型的工作(例如Apache Oozie来优化Hadoop计算)或太过抽象难以扩展(例如单一的Azkaban)。考虑到上述的情况,我们开始构建一个高度可定制的工作流管理器,这种管理器可以用来从执行基本的shell命令到在Hadoop, Hive 和Spark之上实现ETL-风格的计算在内的广泛的数据处理用户需求。

我们所有的工程团队都在用Pinball。它基本上每天都要在我们的Hadoop集群中处理百来个工作流,上千个作业,大概3 PB的数据。最大的工作流包含超过500个作业。这些工作流可以生成分析报告,构建用于搜索的索引,训练机器学习模型,以及完成大量其他类型的任务。

平台 VS 最终产品

Pinball提供完备的、开箱即用的端到端解决方案。同时,它基于智能组件的设计使得其易于修改维护。Pinball的工作流管理层构建在实现了原子性状态更新的抽象概念之上。

概念上,Pinball的架构采用的是master-worker(或master-client以避免跟我们下面介绍的一种特殊的客户类型相混 淆)架构,带状态的中央master给无状态的client提供当前系统状态的信息。Clients可以是各种各样的,从负责任务执行的 workers, 到控制什么时候一个工作流应该运行的scheduler,以及允许用户和系统交互的UI,到命令行工具。所有的clients都使用由 master设定的同样的语言(协议)通讯,并且他们不能直接通讯。 所以,clients是独立的,可以很容易的用其他的方案来替代。因为 Pinball设计的灵活性,它被用来构建定制的工作流管理方案的平台。

Pinterest 开源工作流管理 —— Pinball

虽然定制是可能的,值得一提的是Pinball默认设置是允许用户来定义clients,运行和监控工作流。

工作流的生命周期

工作流被定义为一个配置文件或者是一个UI工作流生成器,或者甚至是从其他的工作流中导入。Pinball提供了一个插件化的解析器概念让用户将他们的工作流表达的格式化。解析器将一组不透明的工作流定义成token(令牌)合集,并呈现出一种Pinball能理解的工作流格式。(请阅读更多关于Pinball的特性

工作流通过命令行工具或者UI组件来部署。部署从工作流中调用解析器,提取调度token并将其储存在主配置中。调度令牌中包含了像工作流配置的位置的元数据、工作流的运行时间、复发的处理和溢出的策略。策略描述了如果以前的工作流还没有结束而且一个新的工作流又开始的情况下系统表现如何。示例策略允许废弃当前正在运行的工作流并同时开始另一个工作流示例,这是为了运行一个工作流或者在先前的工作流运行结束前延迟工作流。

Pinterest 开源工作流管理 —— Pinball

当运行时间到时,调度器使用存储在调度令牌中的信息来定位工作流配置,解析它并生成 job 令牌来标定工作流程。工作令牌以一个特定的工作流实例 ID 提交到 master。工作流实例彼此能够独立地控制。使得用户能够灵活地并行运行多个相同的工作流实例。

Pinterest 开源工作流管理 —— Pinball

Job 令牌被空闲 worker 请求和执行。Job 是在命令行中描述的在子进程中运行。子进程的输出被捕捉并显示到 UI 中。Pinball 解释特殊格式的日志传递到 UI 或转移给下游的任务。这允许我们直接在 Pinball UI 的 Hadoop 作业跟踪器页面中嵌入一个链接或从上游任务工作到下游任务中传递参数。

Pinterest 开源工作流管理 —— Pinball

当工作失败需要进行后处理时 (例如:有人需要删除部分的输出), Pinball 提供了针对工作设置的强制清理命令的功能。 即使此工作已经被定义为在执行中已经中止,清理命令依然能够保证被执行。

Pinterest 开源工作流管理 —— Pinball

失败的工作能够自动或手动的进行重启。用户能够在工作流图中选择相关的子工作进行重新启动。扩展的操作能够在大型的工作层次中明显的提升可用性。

当工作实例结束时(不管成功或失败),能够选择是否发送emal通知工作流的发起人。

工作流配置与工作模版

致终端用户、工作流管理器通常是一个灵活安排和执行他们的工作的黑盒,但需 要以这样或那样的方式定义工作流本身。在设计 Pinball 时,我们做了一个慎重的选择,不使配置一部分语法系统的核心为了给开发人员提供了很大的灵活性在最有意义在一个给定的设置来定义工作流配置的方式。同时, 我们想要提供一个完整的包和较低的准入门槛。所以,我们决定简化包括解析器和工作模板的版本,我们使用我们的开源版本。

开箱即用的,我们支 持基于 python 工作流配置语法。我们还提供许多工作模板配置简单的 shell 脚本以及在 Hadoop 平台上更复杂的计算。我们提供本机支持 EMR 和 Qubole 平台的动力特性,比如嵌入工作链接失败后的 PinballUI 和清理资源工作。我们也提出一个条件的概念,允许用户模型数据之间的依赖关系工作(想想工作被推迟到它需要的数据可用时)。

试试我们的项目,让我们知道你的想法!如果你有兴趣从事这样的项目从里面,加入我们的团队