近日,Netflix宣布开源Polynote,Polynote是Netflix自己使用的多语言笔记本环境,Polynote为数据科学家和机器学习研究人员提供笔记本环境,允许他们使用JVM-基于ML的平台(此类平台大多是用Scala构建的)与Python生态系统中流行的机器学习和可视化库无缝集成。已经在Netflix内部广泛使用,Netflix正在研究如何将Polynote与其他平台整合。让我们仔细看看Polynote的特性和特性:功能概述可再现性Polynote的两个指导原则是可再现性和可见性。为了实现这两个强大的功能,我们最早的设计决策之一是从头开始构建Polynote的代码解释,而不是像传统笔记本那样依赖REPL。在我们看来,虽然REPL通常不错,但它们根本不适合笔记本电脑。要了解REPL和笔记本的问题,让我们看一下典型笔记本环境的设计。笔记本是有序的单元格集合,每个单元格都可以包含代码或文本。每个单元格的内容都可以独立修改和执行。可以重新排列、插入和删除单元格。这也可能取决于笔记本电脑中其他单元的输出。将其与REPL环境进行对比就会发现。在REPL会话中,用户一次将一个表达式输入到提示符中。一旦求值,表达式及其求值结果是不可变的,求值结果附加到下一个表达式可用的全局状态。不幸的是,这两个模型之间的脱节意味着使用REPL会话评估单元代码的典型笔记本环境会导致隐藏状态在用户与笔记本交互时累积。单元可以按任何顺序执行,改变这个全局隐藏状态,从而影响其他单元的执行。通常,notebook无法从顶部可靠地重新运行,这使得它们难以复制和与他人共享。这种隐藏状态也让用户很难推断出笔记本电脑上正在运行什么。在其他笔记本中,隐藏状态意味着变量在其单元格被删除后仍然可用。在Polynote笔记本中,没有隐藏状态,删除的单元格变量不再可用。从头开始编写Polynote的代码解释使我们能够消除这种全局的、可变的状态。通过跟踪每个单元格中定义的变量,Polynote从其操作的单元格构建给定单元格的输入状态。使单元格的位置在其执行语义中很重要也可以强制执行最小惊奇原则,允许用户从上到下阅读笔记本。它通过保持笔记本运行来确保可重复性。编辑改进Polynote提供类似IDE的功能,例如交互式自动完成和参数提示、错误突出显示以及对LaTeX富文本编辑器的支持。VisibilityPolynoteUI通过显示内核的状态,高亮显示当前运行的单元代码和当前正在执行的任务,让用户直观地了解内核的状态。多语言笔记本中的每个单元格都可以用不同的语言编写,并且可以在它们之间共享变量。目前支持Scala、Python和SQL语言类型。依赖和配置管理Polynote将配置和依赖信息直接存储到笔记本中,而不依赖于外部文件或集群/服务器级别的配置。数据可视化本机数据探索和可视化可帮助用户更多地了解他们的数据,而不会弄乱他们的笔记本。与matplotlib和Vega的集成允许高级用户与漂亮的可视化进行交互。接下来,我们将对Polynote的功能有更深入的了解:安装过程是按照它的指导文档进行的,我也安装了matplotlibpip3installmatplotlib如果你打算尝试它的多语言功能,还需要再添加一个环境变量:exportPYSPARK_ALLOW_INSECURE_GATEWAY=1如果不,您将收到以下提示:编辑体验使用笔记本级别的“配置和依赖项”设置轻松从Maven存储库中提取依赖项,包括使用HTTPGET从Netflix博客获取文本的请求:自动完成适用于提取的库来自Maven存储库:但是,lambda函数的自动完成似乎不起作用:Spark示例在这个字数统计示例中,我们从HTTP获取文本,对其进行标记化,并保留所有大于4个字符的值标记。Spark还可以轻松配置“配置和依赖项”设置:切换到Python现在,我们切换到Python并使用pandas和matplotlib绘制条形图,仅选择前10个单词。运行还算顺利,但有时会弹出如下警告:出现这种情况时,界面停止工作,唯一的解决办法是杀掉Polynote进程并重启。Polynote是迄今为止我尝试过的最好的Spark和Scala笔记本。虽然有一些小问题,但相信很快就会修复。目前,Polynote在GitHub上已经star了2.6K,177个Forks(GitHub地址:https://github.com/polynote/polynote)如果你对这个项目感兴趣,可以直接访问GitHub的源码进行试用.
