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/hueapps/spark/java目录中处理livy,请将spark-user-configurable-options.template复制到livy服务器中的spark-user-configurable-options.conf文件,并注释掉#spark.master