Apache Zeppelin 的 Livy 解释器
概述
Livy 是一个开源的REST接口,用于从任何地方与Spark进行交互。它支持在本地或YARN中运行的Spark上下文中执行代码片段或程序。
- 交互式 Scala、Python 和 R 命令行
- Scala、Java、Python中的批量提交
- 多个用户可以共享同一台服务器(支持模拟)
- 可以用于从任何地方通过REST提交作业
- 不需要对您的程序进行任何代码更改
需求
Livy 解释器的额外要求是:
- Spark 1.3 或更高版本。
- Livy 服务器。
配置
我们为spark添加了一些常见的配置,您可以设置任何您想要的配置。
您可以在这里找到所有Spark配置。
并且,属性不应以spark.开头,而应替换为livy.spark.。
例如:spark.driver.memory 替换为 livy.spark.driver.memory
| 属性 | 默认值 | 描述 |
|---|---|---|
| zeppelin.livy.url | http://localhost:8998 | Livy 服务器运行的 URL |
| zeppelin.livy.spark.sql.maxResult | 1000 | 显示的最大Spark SQL结果数量。 |
| zeppelin.livy.spark.sql.field.truncate | true | 是否截断超过20个字符的字段值 |
| zeppelin.livy.session.create_timeout | 120 | 会话创建的超时时间(秒) |
| zeppelin.livy.displayAppInfo | true | 是否显示应用信息 |
| zeppelin.livy.pull_status.interval.millis | 1000 | 检查段落执行状态的间隔时间 |
| livy.spark.driver.cores | Driver 核心数。例如:1, 2。 | |
| livy.spark.driver.memory | Driver 内存。例如:512m, 32g。 | |
| livy.spark.executor.instances | 执行器实例。例如)1, 4。 | |
| livy.spark.executor.cores | 每个执行器的核心数。例如:1, 4。 | |
| livy.spark.executor.memory | 每个工作实例的执行器内存。例如) 512m, 32g. | |
| livy.spark.dynamicAllocation.enabled | 使用动态资源分配。例如) True, False. | |
| livy.spark.dynamicAllocation.cachedExecutorIdleTimeout | 移除一个缓存了数据块的执行器。 | |
| livy.spark.dynamicAllocation.minExecutors | 执行器数量的下限。 | |
| livy.spark.dynamicAllocation.initialExecutors | 初始运行的执行器数量。 | |
| livy.spark.dynamicAllocation.maxExecutors | 执行器数量的上限。 | |
| livy.spark.jars.packages | 向livy解释器添加额外的库 | |
| zeppelin.livy.ssl.trustStore | 客户端信任库文件。当启用livy ssl时使用 | |
| zeppelin.livy.ssl.trustStorePassword | trustStore文件的密码。在启用livy ssl时使用 | |
| zeppelin.livy.ssl.trustStoreType | JKS | 信任库的类型。可以是 JKS 或 PKCS12。 |
| zeppelin.livy.ssl.keyStore | 客户端密钥库文件。如果Livy需要双向SSL认证,则需要此文件。 | |
| zeppelin.livy.ssl.keyStorePassword | keyStore文件的密码。 | |
| zeppelin.livy.ssl.keyStoreType | JKS | 密钥库的类型。可以是 JKS 或 PKCS12。 |
| zeppelin.livy.ssl.keyPassword | keyStore文件中密钥的密码。默认为zeppelin.livy.ssl.keyStorePassword。 | |
| zeppelin.livy.http.headers | key_1: value_1; key_2: value_2 | 调用livy rest api时的自定义http头。每个http头由`;`分隔,每个头是一个键值对,键值由`:`分隔 |
| zeppelin.livy.tableWithUTFCharacters | false | 如果数据库包含UTF字符,则将此设置为true。 |
我们在zeppelin-0.7中移除了livy.spark.master。因为我们建议用户在zeppelin-0.7中使用livy 0.3。而livy 0.3不允许指定livy.spark.master,它强制使用yarn-cluster模式。
添加外部库
您可以通过将livy.spark.jars.packages属性设置为逗号分隔的maven坐标列表来加载动态库到livy解释器,这些jar包将包含在驱动程序和执行程序的类路径中。坐标的格式应为groupId:artifactId:version。
示例
| 属性 | 示例 | 描述 |
|---|---|---|
| livy.spark.jars.packages | io.spray:spray-json_2.10:1.3.1 | 向livy解释器添加额外的库 |
如何使用
基本上,你可以使用
spark
%livy.spark
sc.version
pyspark
%livy.pyspark
print "1"
sparkR
%livy.sparkr
hello <- function( name ) {
sprintf( "Hello, %s", name );
}
hello("livy")
模拟
当Zeppelin服务器启用身份验证运行时,此解释器利用Livy的用户模拟功能,即发送额外的参数来创建和运行会话("proxyUser": "${loggedInUser}")。这在多个用户共享一个Notebook服务器时特别有用。
应用Zeppelin动态表单
你可以利用Zeppelin动态表单。表单模板仅适用于livy sql解释器。
%livy.sql
select * from products where ${product_id=1}
在livy解释器中以编程方式创建动态表单是不可行的,因为ZeppelinContext在livy解释器中不可用。
共享的SparkContext
从Zeppelin 0.8.0支持的livy 0.5开始,SparkContext在scala、python、r和sql之间共享。
这意味着当表在%livy.spark、%livy.pyspark、$livy.sparkr中注册时,你可以通过%livy.sql查询该表。
常见问题解答
Livy 调试:如果您在错误控制台中看到以下任何内容
连接到 livyhost:8998 [livyhost/127.0.0.1, livyhost/0:0:0:0:0:0:0:1] 失败:连接被拒绝
看起来livy服务器尚未启动或配置错误
异常:未找到会话,Livy服务器可能已重启,或会话丢失。
会话可能已超时,您可能需要重新启动解释器。
会话配置中的黑名单配置值:spark.master
编辑 livy 服务器中的 conf/spark-blacklist.conf 文件并注释掉 #spark.master 行。
如果您选择在https://github.com/cloudera/hue的apps/spark/java目录中处理livy,请将spark-user-configurable-options.template复制到livy服务器中的spark-user-configurable-options.conf文件,并注释掉#spark.master。