Apache Zeppelin 中的解释器

概述

在本节中,我们将解释解释器、解释器组和解释器设置在Zeppelin中的作用。 Zeppelin解释器的概念允许任何语言或数据处理后端插入到Zeppelin中。 目前,Zeppelin支持许多解释器,例如Scala(与Apache Spark一起使用)、Python(与Apache Spark一起使用)、Spark SQL、Hive、JDBC、Markdown、Shell等。

什么是 Zeppelin 解释器?

Zeppelin 解释器是一个插件,它使 Zeppelin 用户能够使用特定的语言/数据处理后端。例如,要在 Zeppelin 中使用 Scala 代码,您将使用 %spark 解释器。

当你在解释器页面点击+Create按钮时,解释器下拉列表框将显示你服务器上所有可用的解释器。

您可以为同一引擎创建多个具有不同解释器设置的解释器。例如,您可以创建spark2用于Spark 2.x,并创建spark1用于Spark 1.x。

对于你在Zeppelin中编写的每个段落,你需要首先通过%interpreter_group.interpreter_name指定其解释器。例如%spark.pyspark, %spark.r

如果你指定了interpreter,你也可以传递本地属性给它(如果需要的话)。这是通过在解释器名称后面的圆括号内提供一组键/值对,用逗号分隔来实现的。如果键或值包含像=,这样的字符,那么你可以用\字符来转义它们,或者将整个值用双引号括起来。例如:

%cassandra(outputFormat=cql, dateFormat="E, d MMM yy", timeFormat=E\, d MMM yy)

什么是解释器设置?

解释器设置是Zeppelin服务器上给定解释器的配置。例如,需要为Apache Hive JDBC解释器设置某些属性以连接到Hive服务器。

如果属性名称由大写字母、数字或下划线([A-Z_0-9])组成,则属性将作为环境变量导出到系统中。否则,属性将设置为常见的解释器属性。 例如,您可以在Spark的解释器设置中定义SPARK_HOMEHADOOP_CONF_DIR,它们将作为环境变量传递给Spark解释器进程,供Spark使用。

您可以通过在解释器属性值中添加#{contextParameterName}来使用解释器上下文中的参数。参数可以是以下类型:字符串、数字、布尔值。

上下文参数

名称 类型
用户 字符串
noteId string
replName string
className string

如果上下文参数为空,则将其替换为空字符串。以下截图是一个示例,我们将用户名作为default.user的属性值。

什么是解释器组?

每个解释器都属于一个解释器组。解释器组是在一个JVM进程中运行的解释器单元,可以一起启动/停止。 默认情况下,每个解释器属于一个单独的组,但该组可能包含更多的解释器。例如,Spark解释器组包括Scala Spark、PySpark、IPySpark、SparkR和Spark SQL。

从技术上讲,来自同一组的Zeppelin解释器在同一个JVM中运行。有关此内容的更多信息,请参阅编写解释器的文档

每个解释器属于一个单独的组,并一起注册。所有相关属性都列在解释器设置中,如下例所示。

解释器绑定模式

在解释器设置中,可以选择sharedscopedisolated解释器绑定模式之一。 在shared模式下,使用此解释器的每个笔记/用户将共享一个解释器实例。 scopedisolated模式可以在两个维度下使用:per userper note。 例如,在scoped per note模式下,每个笔记将在同一解释器进程中创建一个新的解释器实例。在isolated per note模式下,每个笔记将创建一个新的解释器进程。

欲了解更多信息,请查阅Interpreter Binding Mode

解释器生命周期管理

在0.8.0之前,Zeppelin没有解释器的生命周期管理。用户必须通过UI显式关闭解释器。从0.8.0开始,Zeppelin提供了一个新的接口LifecycleManager来控制解释器的生命周期。目前,有两个实现:NullLifecycleManagerTimeoutLifecycleManager

NullLifecycleManager 将不执行任何操作,即用户需要像以前一样自己控制解释器的生命周期。TimeoutLifecycleManager 将在解释器空闲一段时间后关闭解释器。默认情况下,空闲阈值为1小时。 用户可以通过zeppelin.interpreter.lifecyclemanager.timeout.threshold设置更改此阈值。NullLifecycleManager 是默认的生命周期管理器,用户可以通过zeppelin.interpreter.lifecyclemanager.class更改它。

内联通用配置

Zeppelin的解释器设置由所有用户和笔记共享,如果您想要不同的设置,您必须创建一个新的解释器,例如,您可以创建spark_jar1来运行带有依赖项jar1的Spark,并创建spark_jar2来运行带有依赖项jar2的Spark。 这种方法有效,但不方便。内联通用配置可以提供更细粒度的解释器设置控制和更多的灵活性。

ConfInterpreter 是一个通用的解释器,可以被任何解释器使用。你可以像定义 Java 属性文件一样使用它。 它可以用于为任何解释器进行自定义设置。然而,ConfInterpreter 需要在该解释器进程启动之前运行。解释器进程何时启动由解释器绑定模式设置决定。 因此,用户需要了解 Zeppelin 的 解释器绑定模式设置,并知道解释器进程何时启动。例如,如果我们将 Spark 解释器设置为每个笔记隔离,那么在此设置下,每个笔记将启动一个解释器进程。 在这种情况下,用户需要将 ConfInterpreter 放在第一个段落中,如下例所示。否则,自定义设置将无法应用(实际上会报告 ERROR)。

预编码

代码片段(解释器语言)在解释器初始化后执行,取决于绑定模式。要配置,请添加一个带有解释器类的参数(zeppelin..precode),除了JDBCInterpreter(JDBC precode)。

凭证注入

可以从凭证管理器中注入凭证到Notebooks中。凭证注入的工作原理是将Notebooks中的以下模式替换为凭证管理器中的匹配凭证:{CREDENTIAL_ENTITY.user}{CREDENTIAL_ENTITY.password}。然而,必须通过在每个解释器的配置中添加一个布尔值 injectCredentials 设置来启用凭证注入。为了防止意外泄露密码,注入的密码会从Notebook输出中移除。

凭证注入设置

凭证输入示例

凭证注入示例

val password = "{SOME_CREDENTIAL_ENTITY.password}"

val username = "{SOME_CREDENTIAL_ENTITY.user}"

解释器进程恢复(实验性)

在0.8.0之前,关闭Zeppelin也意味着关闭所有正在运行的解释器进程。通常,管理员会关闭Zeppelin服务器进行维护或升级,但不想关闭正在运行的解释器进程。 在这种情况下,解释器进程恢复是必要的。从0.8.0开始,用户可以通过设置zeppelin.recovery.storage.classorg.apache.zeppelin.interpreter.recovery.FileSystemRecoveryStorage或未来可用的其他实现来启用解释器进程恢复。默认情况下,它是org.apache.zeppelin.interpreter.recovery.NullRecoveryStorage,这意味着恢复未启用。zeppelin.recovery.dir用于指定存储恢复元数据的位置。 启用恢复意味着关闭Zeppelin不会终止解释器进程,当Zeppelin重新启动时,它会尝试重新连接到现有的正在运行的解释器进程。如果您希望在启用恢复的情况下终止Zeppelin后杀死所有解释器进程,可以运行bin/stop-interpreter.sh

在0.8.x版本中,Zeppelin服务器只会在你再次运行段落时重新连接到正在运行的解释器进程,但它不会恢复正在运行的段落。例如,如果你在某个段落仍在运行时重启Zeppelin服务器,那么当你重启Zeppelin时,尽管解释器进程仍在运行,你在前端不会看到该段落正在运行。在0.9.x版本中,我们通过恢复正在运行的段落来修复这个问题。这里有一张截图展示了Flink解释器的一个正在运行的段落是如何工作的。

选择解释器

默认情况下,Zeppelin 会注册并显示文件夹 $ZEPPELIN_HOME/interpreters 下的所有解释器。 但你可以配置属性 zeppelin.interpreter.include 来指定你想要包含的解释器,或者配置 zeppelin.interpreter.exclude 来指定你想要排除的解释器。 只能指定其中一个,不能同时指定它们。