【发布时间】:2019-05-02 19:56:23
【问题描述】:
背景
我有一些从第 3 方 api 中提取数据的 dag。
我们需要提取的帐户会随着时间而改变。要确定要提取哪些帐户,取决于我们可能需要查询数据库或发出 HTTP 请求的过程。
在气流之前,我们将在 python 脚本的开头获取帐户列表。然后我们将遍历帐户列表并将每个帐户拉到文件或我们需要做的任何事情。
但是现在,使用气流,在帐户级别定义任务并让气流处理重试功能和日期范围以及并行执行等是有意义的。
因此,我的 dag 可能看起来像这样:
问题
由于每个帐户都是一个任务,因此每次 dag 解析都需要访问帐户列表。但是由于 dag 文件被频繁解析,因此您不必整天都想查询数据库或等待 REST 调用来处理来自每台机器的每个 dag 解析。这可能是资源密集型的,并且可能会花钱。
问题
有没有一种好方法可以将此类配置信息缓存在本地文件中,最好具有指定的生存时间?
想法
我想过几种不同的方法:
- 写入 csv 或 pickle 文件并使用 mtime 过期。
- 对此的担忧是,如果两个进程同时尝试使文件过期,我可能会发生冲突。我不知道这种可能性有多大,也不知道后果是什么,但可能没什么可怕的。
- 为所有此类进程创建一个通用的 sqlite 数据库。应该在第一次访问变量时自动创建。每个配置变量在表中都有一行。使用 last_modified_datetime 列来告知何时过期。
- 需要更精细的代码和依赖项。
- 使用气流变量
- 这样做的好处是它使用现有的数据库,因此每次查询没有 $ 和合理的网络延迟,但它仍然需要网络往返。
- 具有在多节点设置中的所有节点相同的优势。
- 确定何时到期可能会有问题,因此可能会创建配置管理器 dag 以定期更新配置变量。
- 但这会增加部署和开发过程的复杂性——需要填充变量才能正确定义 DAG——所有开发人员也需要在本地进行管理,而不是更多地创建读取缓存方法。
- 子标签?
- 从未使用过它们,但我怀疑它们可以在这里使用。但无论如何,社区似乎都不鼓励使用它们......
你处理过这个问题吗?你找到一个好的解决方案了吗?这些似乎都不是很好。
【问题讨论】: