摘要:从我们用户的角度来看,Jupyter Notebooks提供了一个方便的界面,用于迭代运行代码、探索输出和可视化数据——所有这些都来自一个基于云的开发环境。2017年第三季度,我们开始认真开展这项工作,将Jupyter Notebooks从一个利基工具提升为Netflix数据平台的一流公民。

前言

Netflix 已经把Jupyter Notebook的作用发挥到了极致。

Notebooks已经在数据科学家中迅速流行起来,成为快速原型制作和探索性分析的实际标准。在Netflix,我们正在进一步推进边界,重新想象Notebook可以是什么,谁可以使用它,他们可以用它做什么。我们正在进行大量投资,以帮助实现这一愿景。

在这篇文章中,我们将分享我们的动机和为什么我们发现jupyter notebooks【https://jupyter.org/】

如此引人注目。我们还将介绍jupyter notebooks基础设施的组件,并探索我们在Netflix使用jupyter notebooks的一些新方式。

如果您缺少时间,我们建议您跳到用例部分。动机

在Netflix,data 是所有。它渗透到我们的思想中,告知我们的决定,并挑战我们的假设。它以前所未有的规模推动了实验和创新。数据帮助我们发现精彩的内容,并为全球1.3亿用户提供个性化的体验。

实现这一目标并非易事;它需要广泛的工程和基础设施支持。每天有超过1万亿的事件被写入一个流摄取管道,这个管道被处理并写入一个100PB的云本地数据仓库。每天,我们的用户根据这些数据运行超过15万个任务,涉及从报告和分析到机器学习和推荐算法的方方面面。为了在如此大的范围内支持这些用例,我们构建了一个业界领先的数据平台,它灵活、强大且复杂(这是必需的)。我们还构建了一个由互补工具和服务组成的丰富生态系统,比如联合作业执行服务Genie和联合亚转移服务Metacat。这些工具简化了复杂性,使支持公司范围更广的用户成为可能。

用户多样性是令人兴奋的,但它是有代价的:Netflix数据平台——以及它的工具和服务生态系统——必须扩展以支持额外的用例、语言、访问模式等等。为了更好地理解这个问题,考虑3个常见的角色:分析工程师、数据工程师和数据科学家。

通常,每个角色都依赖于一组不同的工具和语言。例如,数据工程师可以使用IntelliJ中的Scala创建包含数万亿流事件的数据集的新聚合。分析工程师可能会在一份关于全球流媒体质量的新报告中使用这种聚合——使用SQL和Tableau。这份报告可能会促使数据科学家使用R和RStudio构建一个新的流压缩模型。从表面上看,这些工作流程似乎是完全不同的,尽管是互补的。但是如果我们深入研究,我们会发现每个工作流都有多个重叠的任务:

数据探索——在项目的早期进行;可能包括查看示例数据、运行统计分析和探索性分析的查询以及可视化数据

数据准备——迭代任务;可能包括清理、标准化、转换、反规范化和聚合数据;通常是项目中最耗时的任务

数据验证——循环任务;可能包括查看样本数据、运行统计分析和聚合分析查询以及可视化数据;通常发生在数据探索、数据准备、开发、部署前和部署后阶段

产品化——在项目后期发生;可能包括将代码部署到生产、回填数据集、培训模型、验证数据和调度工作流

为了帮助我们的用户扩展,我们希望使这些任务尽可能轻松。为了帮助我们的平台扩展,我们希望最小化需要支持的工具数量。但如何?没有一种工具可以完成所有这些任务;此外,一个任务通常需要多个工具。然而,当我们添加另一层抽象时,一个跨工具和语言的通用模式出现了:运行代码、研究数据、显示结果。

碰巧的是,一个开源项目的设计正是为了做到这一点:project Jupyter。Jupyter Notebooks

Jupyter Notebooks计划始于2014年,目标是为科学研究、可重现的工作流、计算叙述和数据分析创建一套一致的开源工具。这些工具在业界得到了很好的应用,如今Jupyter Notebooks已经成为数据科学家工具包的重要组成部分。为了让您了解它的影响,Jupyter获得了2017年ACM软件系统奖,这是一个与Java、Unix和Web共享的荣誉

要了解Jupyter Notebooks为何如此吸引我们,请考虑它提供的核心功能:

1. 用于内省和执行代码的消息传递协议,与语言无关

2. 用于描述和捕获代码、代码输出和标记笔记的可编辑文件格式

3. 一个基于web的UI,用于交互式地编写和运行代码以及可视化输出

Jupyter协议提供了一个标准的消息API来与充当计算引擎的内核通信。该协议支持一个可组合的体系结构,该体系结构将编写内容的地方(UI)和执行代码的地方(内核)分开。通过将运行时与接口隔离,笔记本可以跨越多种语言,同时保持执行环境配置的灵活性。如果存在一个内核,用于知道如何使用Jupyter协议进行通信的语言,那么Jupyter Notebooks可以通过使用该内核来回发送消息来运行代码。

支持这一切的是一种同时存储代码和结果的文件格式。这意味着稍后可以访问结果,而不需要重新运行代码。此外,Jupyter Notebooks存储丰富的散文(prose),以提供背景,在笔记本内发生的事情。这使得它成为一种理想的格式,用于通信业务上下文、记录灵感、注释代码、描述结论等等。用例

在我们的许多用例中,我们今天使用Jupyter Notebooks最常见的方式是:数据访问、Notebooks templates和scheduling notebooks。数据访问

Notebooks最初是在Netflix推出用以支持数据科学工作流程。随着数据科学家越来越多地采用它们,我们看到了扩展工具工作的机会。我们意识到我们可以利用Jupyter Notebooks的通用性和架构,并将其扩展到一般数据访问。2017年第三季度,我们开始认真开展这项工作,将Jupyter Notebooks从一个利基工具提升为Netflix数据平台的一流公民。

从我们用户的角度来看,Jupyter Notebooks提供了一个方便的界面,用于迭代运行代码、探索输出和可视化数据——所有这些都来自一个基于云的开发环境。我们还维护了一个Python库,它整合了对平台api的访问。这意味着用户可以通过编程从Jupyter Notebooks中访问几乎整个平台。由于这种多功能性、强大性和易用性的结合,我们已经看到整个平台上所有用户类型的快速有机采用。

如今,Jupyter Notebooks是Netflix最流行的数据处理工具。Notebook Templates

随着我们扩展了对Jupyter Notebooks的平台支持,我们开始引入新的功能来满足新的用例。从这项工作中出现了参数化Jupyter Notebooks。参数化的Jupyter Notebooks就像它听起来的那样:允许您在代码中指定参数并在运行时接受输入值的Jupyter Notebooks。这为用户将Jupyter Notebooks定义为可重用模板提供了一种很好的机制。

我们的用户发现了这些模板的惊人数量的用途。最常见的有:

1. 数据科学家:进行不同系数的实验,并总结结果

2. 数据工程师:作为部署过程的一部分,执行一组数据质量审计

3. 数据分析师:共享准备好的查询和可视化,使涉众能够比Tableau更深入地探索

4. 软件工程师:每次出现故障时,将故障排除脚本的结果发送电子邮件调度的Jupyter Notebooks

我们利用Jupyter Notebooks的一个更新颖的方法是作为一个统一的层来调度工作流。

由于每个Jupyter Notebooks都可以在任意内核上运行,所以我们可以支持用户定义的任何执行环境。因为Jupyter Notebooks描述了一个线性的执行流程,由单元格分割,我们可以将失败映射到特定的单元格。这允许用户描述执行和可视化的简短描述,我们可以在稍后运行时准确地报告这些描述。

这个范例意味着我们可以使用Jupyter Notebooks进行交互工作,并顺利地将工作调度为递归运行。对于用户来说,这是非常方便的。许多用户在一个Jupyter Notebooks中构建一个完整的工作流,当他们准备部署它时,只需要将它复制/粘贴到单独的文件中来调度。通过将Jupyter Notebooks作为一个逻辑工作流来处理,我们可以轻松地将其安排为与任何其他工作流相同的工作流程。

我们也可以通过Jupyter Notebooks安排其他类型的工作。当Spark或Presto作业从调度程序执行时,将源代码注入新创建的Jupyter Notebooks并执行。然后,该Jupyter Notebooks将成为一个不可变的历史记录,包含所有相关构件——包括源代码、参数、运行时配置、执行日志、错误消息等等。当排除故障时,这为调查提供了一个快速的入口点,因为所有相关信息都是集中的,并且可以启动Jupyter Notebooks进行交互式调试。Jupyter Notebooks的基础设施

在Netflix规模上支持这些用例需要广泛的支持基础设施。让我们简要介绍一下我们将要讨论的一些项目。

nteract是下一代基于反应的Jupyter Notebooks用户界面。它提供了一个简单、直观的界面,并且比传统的Jupyter Notebooks用户界面提供了一些改进,比如内联单元格工具栏、拖放单元格和内置的数据资源管理器。

Papermill是一个用于参数化、执行和分析Jupyter Notebooks的库。使用它,您可以生成具有不同参数集的多个 Notebooks,并同时执行它们。造纸厂还可以帮助收集和总结指标从收集的Notebooks。

通勤者是一个轻量级的,垂直可伸缩的服务,查看和共享Notebooks。它提供了content API的一个与Jupyter兼容的版本,使得读取本地或Amazon S3上存储的Notebooks变得非常简单。它还提供了一个目录资源管理器,用于查找和共享Notebooks。Titus是一个容器管理平台,提供可伸缩和可靠的容器执行以及与Amazon AWS的云本地集成。Titus是Netflix内部构建的,用于Netflix流媒体、推荐和内容系统的生产。

我们在后续的博客文章中探讨了这种架构,在Netflix上安排Notebooks。出于本文的目的,我们只介绍它的三个基本组件:存储、计算和接口。

存储

Netflix的数据平台依赖于Amazon S3和EFS来进行云存储,Notebooks将云存储视为虚拟文件系统。这意味着每个用户在EFS上都有一个主目录,其中包含用于Notebooks的个人工作区。这个工作区存储用户创建或上传的任何Notebooks。当用户交互式地启动一个Notebooks时,所有的读写活动都发生在这里。我们依赖于[workspace + filename]的组合来形成Notebooks的名称空间,例如/efs/users/kylek/notebook / mysparkjo .ipynb。我们使用这个名称空间来查看、共享和调度Notebooks。这种约定可以防止冲突,并且可以方便地标识EFS卷中笔记本的用户和位置。

我们可以依靠工作区路径从用户那里抽象出基于云的存储的复杂性。例如,只有Notebooks的文件名显示在目录清单中,例如MySparkJob.ipynb。这个文件可以在~/notebook /MySparkJob上访问。a航站楼的ipynb。

当用户调度一个Notebooks时,调度程序将用户的Notebooks从EFS复制到S3上的一个公共目录。S3上的Notebooks成为调度器或源Notebooks的真实来源。每次调度程序运行一个Notebooks时,它都会从源Notebooks实例化一个新的Notebooks。这个新的Notebooks是实际执行的,并成为该执行的不可变记录,包含来自每个单元格的代码、输出和日志。我们将其称为输出Notebooks。

合作是我们在Netflix工作的基础。当用户开始共享Notebooks的url时,这并不奇怪。随着这种实践的发展,我们经常遇到由于多人同时访问同一个Notebooks而导致意外覆盖的问题。我们的用户希望以只读状态共享他们的活动Notebooks。这导致了通勤者的产生。在后台,通勤者显示用于/files和/api/contents的Jupyter api,以列出目录、查看文件内容和访问文件元数据。这意味着用户可以安全地查看Notebooks,而不会影响生产作业或实时运行的Notebooks。计算

管理计算资源是处理数据最具挑战性的部分之一。Netflix尤其如此,我们在AWS上采用了高度可伸缩的容器架构。数据平台上的所有作业都运行在容器上——包括查询、管道和Notebooks。当然,我们希望尽可能地抽象出这种复杂性。

当用户启动Notebooks服务器时,将提供容器。我们为容器资源提供了合理的缺省值,适用于约87.3%的执行模式。当这还不够时,用户可以使用一个简单的接口请求更多的资源。

我们还提供了一个统一的执行环境和一个准备好的容器映像。该映像具有公共库和预安装的默认内核数组。并不是图像中的所有内容都是静态的——我们的内核为我们的平台获取最新版本的Spark和最新集群配置。这减少了新Notebooks的摩擦和设置时间,并通常使我们保持在一个单一的执行环境。

在幕后,我们使用Docker容器管理服务Titus管理业务流程和环境。我们通过管理用户的特定服务器配置和映像来进一步包装该服务。该映像还包括用户安全组和角色,以及用于在包含的库中标识的公共环境变量。这意味着我们的用户可以在基础设施上花费更少的时间,而在数据上花费更多的时间。接口

早些时候,我们描述了我们的愿景,Jupyter Notebooks将成为处理数据的首选工具。但这带来了一个有趣的挑战:一个界面如何支持所有用户?我们还不完全知道答案,但我们有一些想法。

我们知道我们想要变得简单。这意味着一个具有极简主义美学的直观UI,并且它还需要一个深思熟虑的用户体验,使得完成困难的事情变得容易。这一理念与nteract的目标非常一致,nteract是一种基于反应的Jupyter Notebooks前端。它强调简单性和可组合性作为核心设计原则,这使得它成为我们想要做的工作的理想构建块。

我们从用户那里听到的最常见的抱怨之一是缺乏跨语言边界的本地数据可视化,尤其是对于非python语言。nteract的Data Explorer是一个很好的例子,说明我们可以通过提供一种与语言无关的方法来快速探索数据,从而简化一些困难的事情。

在MyBinder上的这个示例Jupyter Notebooks中,您可以看到Data Explorer正在运行。(请注意:可能需要一分钟加载)

我们还引入了对参数化的本机支持,这使得调度Jupyter Notebooks和创建可重用模板变得更加容易。

虽然Jupyter Notebooks已经为Netflix提供了很多价值,但我们才刚刚开始。我们知道我们需要在前端和后端进行投资,以改善整体Jupyter Notebooks的体验。我们在未来12个月的工作重点是提高可靠性、可视性和协作。上下文对用户来说是至关重要的,这就是为什么我们要增加对集群状态、内核状态、作业历史记录等的可见性。我们还致力于自动版本控制、原生应用程序内调度、更好地支持可视化Spark数据流,以及Scala内核的更大稳定性。开源项目

Netflix长期以来一直是开源的支持者。我们重视从开源合作中产生的能量、开放标准和思想交流。我们为Netflix数据平台开发的许多应用程序已经通过Netflix OSS开源。我们也有意不去创造一次性的解决方案,或屈从于"非我发明"的心态。只要有可能,我们就利用现有的开放源码项目,如Spark、Jupyter和panda,并为它们做出贡献。

我们所描述的基础设施在很大程度上依赖于Jupyter Notebooks生态系统项目,但也有一些地方我们存在分歧。最值得注意的是,我们选择nteract作为Netflix的Jupyter Notebooks用户界面。我们做出这个决定有很多原因,包括与我们的技术堆栈和设计哲学保持一致。当我们挑战Jupyter Notebooks的极限时,我们很可能会创建新的工具、库和服务。这些项目也将作为nteract生态系统的一部分进行开源。

我们认识到,对Netflix有意义的东西不一定对所有人都有意义。我们在设计这些项目时考虑到了模块化。这使得只挑选对您的环境有意义的组件成为可能,例如造纸厂,而不需要对整个生态系统作出承诺。接下来是什么

作为一个平台团队,我们的责任是让Netflixers能够用数据做令人惊叹的事情。Jupyter Notebooks已经在Netflix产生了巨大的影响。随着我们在这个领域的重大投资,我们很高兴看到这种影响的增长。

ref:https://medium.com/netflix-techblog/notebook-innovation-591ee3221233

相关文章