- 数据分析
- 数据可视化
- 大数据
- 后端
【免费下载链接】zeppelin
Web-based notebook that enables>项目地址:https://gitcode.com/gh_mirrors/zeppelin1/zeppelin
导读
本文以 Apache Zeppelin 的文档 docs/usage/interpreter/overview.md 为核心,系统讲解 Zeppelin 解释器的核心概念与工作机制:解释器(Interpreter)、解释器分组(Interpreter Group)、解释器设置(Interpreter Settings)以及段落(Paragraph)如何通过%group.name语法选择执行引擎。读完本文,你将掌握解释器的本地属性传参、上下文参数注入、共享/作用域/隔离三种绑定模式、空闲回收与进程恢复机制,并能用ConfInterpreter、Precode、凭据注入等能力对解释器进行精细化的个性化配置。文中所有配置项与行为均以当前仓库源码为准,并给出对应的源码文件路径供深入查阅。
什么是 Zeppelin Interpreter
Zeppelin 的核心理念是"插件化":解释器是一个可插拔插件(plug-in),让用户能够在 Zeppelin 中使用某种特定语言或数据处理后端。例如要在 Zeppelin 中运行 Scala 代码,就使用%spark解释器;而当前仓库中已内置了spark、python、flink、hive、jdbc、md、shell等大量解释器模块(对应仓库根目录下的spark/、python/、flink/、jdbc/、markdown/、shell/等子项目)。
在解释器管理页面点击+Create按钮时,下拉列表会展示服务器上所有可用的解释器。同一个引擎可以创建多个解释器实例,并分别配置不同的设置——例如同时创建spark2(对应 Spark 2.x)与spark1(对应 Spark 1.x),这是隔离不同版本依赖、不同参数组合的常用手段。
段落中指定解释器:%group.name
每个段落执行前都必须先声明使用哪个解释器,语法为:
%interpreter_group.interpreter_name例如%spark.pyspark表示使用 Spark 分组中的 PySpark 解释器,%spark.r表示使用 SparkR。
向解释器传递本地属性(Local Properties)
指定解释器后,还可以在圆括号内传入一组以逗号分隔的 key/value 键值对,作为该段落的本地属性:
%cassandra(outputFormat=cql, dateFormat="E, d MMM yy", timeFormat=E\, d MMM yy)当 key 或 value 中包含=、,等特殊字符时,有两种处理方式:
- 用反斜杠
\转义,例如timeFormat=E\, d MMM yy; - 或者将整个值用双引号包裹,例如
dateFormat="E, d MMM yy"。
这些本地属性会随段落进入解释器的InterpreterContext,解释器可以通过context.getStringLocalProperty(...)读取(凭据注入一节中即用到了这一机制)。
什么是 Interpreter Settings
解释器设置(Interpreter Settings)是给定解释器在 Zeppelin 服务器上的配置集合。例如,Apache Hive 的 JDBC 解释器需要配置连接 URL、用户名、密码等属性,才能连上 Hive Server;这些属性都维护在对应解释器设置中。
属性如何传递给解释器进程
设置中的属性有两种传递路径,规则由属性名决定:
- 属性名只包含大写字母、数字和下划线(匹配
[A-Z_0-9])时,属性会被导出为系统环境变量; - 否则,属性作为普通解释器属性传入解释器进程。
例如在 Spark 解释器设置中定义SPARK_HOME、HADOOP_CONF_DIR,它们会作为环境变量传给 Spark 解释器进程,供 Spark 运行时读取。
上下文参数(Context Parameters)
属性值中可以使用#{contextParameterName}语法引用当前解释器上下文中的参数,支持的参数类型为 string、number、boolean。可用参数如下:
| 参数名 | 类型 |
|---|---|
| user | string |
| noteId | string |
| replName | string |
| className | string |
若上下文参数为空(null),则会被替换为空字符串。典型用法是:在属性值中写default.user=#{user},使每个解释器进程自动感知当前登录用户,从而实现按用户区分的个性化配置。从源码实现看,这类属性最终通过 zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java 一类的设置管理类组装并下发给解释器进程。
什么是 Interpreter Groups
每个解释器都属于一个解释器分组(Interpreter Group)。分组是可在一个 JVM 进程中运行、可一起启动/停止的解释器集合。默认情况下每个解释器独立成组,但一个组可以包含多个解释器。例如 Spark 分组包含 Scala Spark、PySpark、IPySpark、SparkR、Spark SQL 等多个解释器。
分组的意义在于 JVM 资源复用:同一组内的解释器共享同一个 JVM 进程,状态(如 SparkContext)可以跨解释器共享。这与"同组共享 JVM、不同组各自独立 JVM"的进程模型直接相关——若要深入了解编写自定义解释器的机制,可参阅 docs/development/writing_zeppelin_interpreter.md;关于分组与绑定模式对进程数量的影响,详见 docs/usage/interpreter/interpreter_binding_mode.md。
每个解释器只归属于一个组,并在该组下统一注册;组内所有相关属性都会在解释器设置页面上集中展示。
Interpreter Binding Mode(绑定模式)
解释器设置中可以选择三种绑定模式之一:
- shared(共享):所有 note / 用户共享同一个解释器实例;
- scoped(作用域):按
per user或per note两个维度隔离; - isolated(隔离):同样按
per user或per note两个维度隔离。
区别在于隔离粒度:
scoped per note:每个 note 在同一个解释器进程内创建新的解释器实例(会话隔离,进程共享);isolated per note:每个 note 创建独立的解释器进程(进程级隔离)。
选择哪种模式取决于你对隔离性、资源占用与启动开销的权衡:shared最省资源但状态共享;isolated per note隔离最彻底但进程数量随 note 数增长。详细说明请参考 Interpreter Binding Mode 文档。绑定模式还直接决定了解释器进程何时被启动,这一点在ConfInterpreter一节尤为关键。
Interpreter 生命周期管理(Lifecycle Management)
在 0.8.0 之前,Zeppelin 没有解释器生命周期管理,用户必须通过 UI 手动关闭解释器。从 0.8.0 起,Zeppelin 提供了LifecycleManager接口来控制解释器生命周期,当前仓库中有两个实现:
NullLifecycleManager:什么都不做,解释器生命周期仍由用户自行控制;TimeoutLifecycleManager:解释器空闲超过阈值后自动关闭。
相关配置项(定义于 zeppelin-interpreter/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java 的ConfVars):
| 配置项 | 默认值 | 说明 |
|---|---|---|
zeppelin.interpreter.lifecyclemanager.class | org.apache.zeppelin.interpreter.lifecycle.NullLifecycleManager | 生命周期管理器实现类 |
zeppelin.interpreter.lifecyclemanager.timeout.threshold | 3600000(1 小时,毫秒) | 空闲超时阈值 |
zeppelin.interpreter.lifecyclemanager.timeout.checkinterval | 60000(1 分钟,毫秒) | 空闲检查周期 |
从 TimeoutLifecycleManager 的实现可以看出:它通过ScheduledExecutorService按checkinterval周期性地比较当前时间 - lastBusyTimeInMillis与timeoutThreshold,一旦超过阈值就调用remoteInterpreterServer.shutdown()关闭解释器进程;而onInterpreterProcessStarted与onInterpreterUse两个回调会不断刷新lastBusyTimeInMillis,即"只要进程被使用,空闲计时就重置"。这也解释了为什么该管理器只管理解释器分组(进程)级别的生命周期,而不涉及会话级生命周期。
Inline Generic Configuration(ConfInterpreter 内联配置)
默认情况下,解释器设置对所有用户和所有 note 共享;若某个 note 需要不同设置,传统做法是新建解释器(例如spark_jar1、spark_jar2分别加载不同的依赖 jar),这种方式可行但不够灵活。
ConfInterpreter是 Zeppelin 提供的一个通用解释器,任何解释器都可以使用它,用法就像定义一个 Java properties 文件——它按 JavaProperties格式解析段落内容,并将解析出的键值合并进解释器分组的属性。其核心逻辑在 zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ConfInterpreter.java:
- 读取段落文本(
new StringReader(st)),用Properties.load解析; - 将解析出的 key/value 覆写到分组属性(
interpreterSetting.setInterpreterGroupProperties(interpreterGroupId, finalProperties)); - 解析失败时返回
ERROR。
关键前提:ConfInterpreter必须在解释器进程启动之前执行,而解释器进程何时启动取决于绑定模式设置。因此使用前必须理解绑定模式,明确进程启动时机。例如 Spark 解释器设置为isolated per note时,每个 note 会各自启动一个解释器进程,此时需要把ConfInterpreter段落放在该 note 的第一个段落,否则自定义设置无法生效(实际会报ERROR)。
典型用法示例(段落内容):
spark.executor.memory=4g spark.serializer=org.apache.spark.serializer.KryoSerializer该机制特别适合为某个 note 单独定制 Spark 提交参数、而不影响其他 note 的场景,是"细粒度控制解释器设置"的首选手段。
Precode:解释器初始化后自动执行的代码
Precode 是一段以解释器语言编写、在解释器初始化完成后自动执行的代码片段。其执行时机取决于绑定模式(见上文):shared模式下进程共享,Precode 在进程启动时执行一次;scoped/isolated模式下每个实例/进程启动时各自执行。
配置方式是在解释器设置中增加形如zeppelin.<ClassName>.precode的参数,其中<ClassName>是解释器类名。唯一例外是 JDBCInterpreter,它使用独立的 precode 配置项,详见 docs/interpreter/jdbc.md#usage-precode。
典型用途:在 Spark 解释器中通过zeppelin.SparkInterpreter.precode预先设置公共变量、导入常用包或注册 UDF,避免每个段落重复书写样板代码。
Credential Injection(凭据注入)
凭据管理器(Credential Manager)中保存的凭据可以注入到 Notebook 中。注入机制是文本替换:Notebook 中的{CREDENTIAL_ENTITY.user}与{CREDENTIAL_ENTITY.password}模式会被替换为凭据管理器中匹配实体的用户名与密码。
要启用注入,必须在每个解释器上单独开启:在解释器配置中添加布尔属性injectCredentials(常量定义见 zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Constants.java)。注入后的密码会从 Notebook 输出中移除,防止意外泄露。
实际执行逻辑位于 zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java:段落运行前读取injectCredentials属性(支持解释器级属性与段落本地属性context.getStringLocalProperty两级覆盖),为true时才执行凭据替换,再交给解释器执行。相应的单元测试见 zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/ParagraphTest.java,其中验证了"未开启注入时不替换、开启后替换、本地属性可覆盖全局设置"三种行为。
使用示例(段落代码):
val password = "{SOME_CREDENTIAL_ENTITY.password}" val username = "{SOME_CREDENTIAL_ENTITY.user}"运行前先在凭据管理器中为实体SOME_CREDENTIAL_ENTITY保存用户名与密码,并确保所用解释器已开启injectCredentials。
Interpreter 进程恢复(Interpreter Process Recovery,实验性)
0.8.0 之前,关闭 Zeppelin 意味着同时关闭所有运行中的解释器进程。但对管理员而言,为维护或升级关闭 Zeppelin Server 时,往往并不希望终止正在运行的解释器进程,因此 Zeppelin 引入了解释器进程恢复能力。
启用方式是在 zeppelin-site.xml 配置 中设置zeppelin.recovery.storage.class:
| 配置项 | 默认值 | 说明 |
|---|---|---|
zeppelin.recovery.storage.class | org.apache.zeppelin.interpreter.recovery.NullRecoveryStorage | 恢复存储实现类;改为org.apache.zeppelin.interpreter.recovery.FileSystemRecoveryStorage即启用恢复 |
zeppelin.recovery.dir | recovery | 恢复元数据的存储目录 |
默认的NullRecoveryStorage表示不启用恢复(见 NullRecoveryStorage);启用后使用 FileSystemRecoveryStorage 在zeppelin.recovery.dir中持久化恢复元数据。
启用恢复后的行为:
- 关闭 Zeppelin 时不会终止解释器进程;
- Zeppelin 重启后尝试重连仍在运行的解释器进程;
- 即使启用了恢复,若希望 Zeppelin 退出时强制杀掉所有解释器进程,可运行
bin/stop-interpreter.sh。
版本行为差异:在 0.8.x 中,重启后只有再次运行段落时服务器才会重连解释器进程,且不会恢复运行中的段落——例如重启时某段落仍在运行,重启后前端看不到该段落处于运行状态;0.9.x 起修复了这一点,可以恢复运行中的段落。
选择要注册的解释器:include / exclude
默认情况下,Zeppelin 会注册并展示$ZEPPELIN_HOME/interpreters目录下的全部解释器。若只想启用其中一部分,可通过以下两个配置项过滤(二者只能指定其一,不能同时使用):
| 配置项 | 默认值 | 说明 |
|---|---|---|
zeppelin.interpreter.include | 空 | 只注册列表中包含的解释器 |
zeppelin.interpreter.exclude | 空 | 注册除列表中以外的全部解释器 |
例如在conf/zeppelin-site.xml中设置zeppelin.interpreter.exclude排除不需要的解释器,可以缩短服务器启动时的注册与加载时间,并减少解释器管理页面的噪音。这些属性在 ZeppelinConfiguration.ConfVars 中以zeppelin.interpreter.include/zeppelin.interpreter.exclude定义(默认均为空字符串)。
附:解释器安装与可用清单
对于下载了netinst精简二进制包或需要安装第三方解释器的用户,Zeppelin 提供了安装脚本bin/install-interpreter.sh,完整说明见 docs/usage/interpreter/installation.md:
# 安装全部社区维护的解释器 ./bin/install-interpreter.sh --all # 安装指定解释器 ./bin/install-interpreter.sh --name md,shell,jdbc,python # 列出可安装的社区解释器 ./bin/install-interpreter.sh --list # 从 Maven 仓库安装第三方解释器(artifact 为 groupId:artifactId:version) ./bin/install-interpreter.sh --name interpreter1 --artifact groupId1:artifact1:version1社区维护的解释器清单同时维护在 conf/interpreter-list 中,与安装脚本--list输出一致,当前仓库(0.12.0-SNAPSHOT 版本)包含:alluxio、angular、bigquery、cassandra、elasticsearch、file、flink、groovy、hbase、java、jdbc、livy、md、neo4j、python、shell、sparql。安装完成后需重启 Zeppelin,再按本文前述步骤创建解释器设置并与 Notebook 绑定。
小结
Zeppelin 的解释器体系围绕三层结构展开:解释器(引擎能力)→ 解释器设置(配置)→ 解释器分组(JVM 进程模型),再叠加绑定模式、生命周期管理、恢复机制与ConfInterpreter/ Precode / 凭据注入等增强能力,构成了一个灵活且可深度定制的多语言执行平台。理解这些概念与对应配置项,是从"能跑通段落"进阶到"按业务场景精细化管控解释器资源与配置"的关键。
- 数据分析
- 数据可视化
- 大数据
- 后端
【免费下载链接】zeppelin
Web-based notebook that enables>项目地址:https://gitcode.com/gh_mirrors/zeppelin1/zeppelin
相关推荐
Objection.js 输入验证完全指南:JSON Schema 校验、ValidationError 与自定义 Validator 实战
Objection.js 输入验证完全指南:JSON Schema 校验、ValidationError 与自定义 Validator 实战 本篇指南聚焦 ob
后端前端大数据数据分析Apache Zeppelin 解释器体系详解:Interpreter、Interpreter Group 与 Interpreter Settings 完全指南
Apache Zeppelin 解释器体系详解:Interpreter、Interpreter Group 与 Interpreter Settings 完全指
数据分析数据可视化大数据后端前端任务调度Apache Zeppelin Interpreter REST API 完全指南:解释器注册、设置与依赖仓库的远程管理
Apache Zeppelin Interpreter REST API 完全指南:解释器注册、设置与依赖仓库的远程管理 Apache Zeppelin 提供了
数据分析数据可视化大数据后端前端任务调度