[译] Netflix 是怎么做以 Notebook 驱动的架构

Jupyter Notebook 是数据科学家库中最强大的工具之一。通常,诸如 Jupyter 或 Zeppelin 等 Notebook 技术用于各种任务,例如数据挖掘,模型测试或数据准备。

如果你在一个小型的数据科学家团队,那么使用 Notebook 场景似乎非常有限,但是大型组织运行几十个并行的数据科学工作又如何呢?

最近,Netflix 工程团队发布了一系列博客文章,详细的介绍了他们使用 Jupyter Notebook 应用的内部架构。

# Netflix 中的 Notebooks

最初,Netflix 采用 Jupyter Notebook 作为数据挖掘和分析的工具。

然而,工程团队很快意识到 Jupyter 在运行时的抽象、可扩展性、代码的可解释性和调试方面提供了明显的优势,如果使用得当,这些优势可能会对数据科学工作效率产生重大影响。

为了扩大 Jupyter 作为数据科学分析的使用,Netflix 工程团队需要解决几个主要挑战:

notebooks-at-scale

  • 代码-输出不匹配:Notebooks 经常被修改,很多时候,你在环境中看到的输出与当前代码不对应。

  • 服务器要求:Notebooks 通常需要运行 Notebook 服务器运行时 (Jupyter),这在大规模采用时是一个架构挑战。

  • 调度:大多数数据科学模型需要定期执行,但是用于调度 Notebook 的工具仍然相当有限。

  • 参数化:Notebooks 是相当静态的代码环境,但输入参数的使用场景又非常繁多。

  • 集成测试:每个 Notebook 是独立的代码环境,很明显这很难与其他 Notebooks 集成。因此,使用 Notebooks 时,像集成测试这样的任务就是个噩梦。

为了应对上述一些挑战,Netflix工程团队开始努力为 Jupyter 封装一系列基础架构,以图简化 Notebook 在整个团队中应用的困难。

# Runtime 运行时

要解决的第一个挑战是创建一个与服务器无关的运行时,支持 Notebook 的参数化执行。

Netflix 决定采用 Papermill 来实现这一目标。Papermill 基于流行的 nteract 库,是一个用于参数化、执行和分析 Jupyter Notebook 的工具。

从技术上讲,Papermill 接收 Notebook 路径和一些参数输入,然后使用输入执行和渲染请求的 Notebook。当每个单元被执行时,它将产生的结果保存到一个独立输出的 Notebook 中。

Papermill 的另一个好处是能够将 Notebook 的输出存储在不同的存储格式中。

以 Netflix 为例在,团队决定将任何 Notebook 执行的结果输出到由 Commuter 管理的 S3 bucket 中;

Commuter 是另一个基于 nteract 的平台,包括用于查找 Notebook 的资源浏览器,并提供了兼容 Jupyter 版本的内容 API。

从高层次来看,Netflix 笔记本架构开始看起来如下图所示:

img

# 调度

Netflix 工程团队需要解决的另一个关键挑战是创建基础架构,以便能够定期执行 Notebook。

在引入 Papermill 之后,这一挑战变得相对容易解决,因为这个架构本质上将参数化执行与调度分离,这意味着它可以与不同的调度器模型配合使用。

Netflix 团队决定将他们的 Notebooks 与他们自己的调度框架 Meson 集成。从技术上讲,Meson 是一个通用的工作流程编排和调度框架,用于跨异步系统执行 ML 管道。

这一过程的架构相对简单,如下图所示:

notebook-and-docker

# 集成测试

为了在 Noteboo k架构中自动化集成测试,Netflix 采用了 Papermill 的多输出功能。本质上,集成测试是另一个Notebook,输出成为目标 Notebook 的输入。

notebook-to-testing

Netflix 的架构是我见过的大规模使用 Jupyter Notebook 最先进的基础设施之一。在这种架构中实现的大多数模式都基于开源工具,并且可以被刚开始进行数据科学之旅的团队轻松使用。