Livy 系列 - 基于 Spark 的 REST 服务 Livy 简介#
内容整理自:
Livy 简介#
Apache Livy 是一个基于 Spark 的开源 REST 服务,它能够以 REST 的方式将代码片段或是序列化的二进制代码提交到 Spark 集群中去执行,它提供了以下这些基本功能:
- 提交 Scala, Python 或是 R 代码片段到远端的 Spark 集群上执行。
- 提交 Java, Scala, Python 所编写的 Spark 作业到远端的 Spark 集群上执行。
- 提交批处理应用到集群中运行
关于 Livy REST API 的使用,参考官方文档
Livy 基本架构#
Livy 是一个典型的 REST 服务架构,它一方面接受并解析用户的 REST 请求,转换成相应的操作;另一方面它管理着用户所启动的所有的 Spark 集群
用户可以以 REST 请求的方式通过 Livy 启动一个新的 Spark 集群,Livy 将每一个启动的 Spark 集群称之为一个会话 (session),一个会话是由一个完整的 Spark 集群所构成的,并且通过 RPC 协议在 Spark 集群和 Livy 服务端之间进行通信。根据处理交互方式的不同,Livy 将会话分成了两种类型:
交互式会话(interactive session)
。这与 Spark 中的交互式处理相同,交互式会话在其启动后可以接收用户所提交的代码片段,在远端的 Spark 集群上编译并执行。批处理会话(batch session)
。用户可以通过 Livy 以批处理的方式启动 Spark 应用,这样的一个方式在 Livy 中称之为批处理会话,这与 Spark 中的批处理是相同的
Livy 的企业级特性#
多用户支持#
假定用户 tom 向 Livy 服务端发起 REST 请求启动一个新的会话,而 Livy 服务端则是由用户 livy 启动的,这个时候所创建出来 Spark 集群的用户是谁呢,会是用户 tom 还是 livy?在默认情况下这个 Spark 集群的用户是 livy。这会带来访问权限的问题:用户 tom 无法访问其拥有权限的资源,而相对的是他却可以访问用户 livy 所拥有的资源。
为了解决这个问题 Livy 引入了Hadoop 中的代理用户 (proxy user) 模式,代理用户模式广泛使用于多用户的环境,如 HiveServer2。在此模式中超级用户可以代理成普通用户去访问资源,并拥有普通用户相应的权限。开启了代理用户模式后,以用户 tom 所创建的会话所启动的 Spark 集群用户就会是 tom
端到端安全#
- 基于 Kerberos 的 Spnego 认证实现客户端认证安全
- 使用标准的 SSL 来加密 Http 协议,保证客户端与 Livy 服务端之间 Http 传输的安全性
- 基于 SASL 认证的 RPC 通信机制保证 Livy 服务端和 Spark 集群之间网络通信安全
失败恢复机制#
Livy 提供了失败恢复的机制,当用户启动会话的同时 Livy 会在可靠的存储上记录会话相关的元信息,一旦 Livy 从失败中恢复过来时它会试图读取相关的元信息并与 Spark 集群重新连接。
为了使用该特性我们需要进行以下 Livy 配置:
// 开启失败恢复功能
livy.server.recovery.mode: recovery
// 配置将元信息存储在何种可靠存储上,当前支持filesystem和zookeeper
livy.server.recovery.state-store
// 配置具体的存储路径,如果是filesystem则改配置为文件路径;而zookeeper则为zookeeper集群的URL
livy.server.recovery.state-store.url
Livy 与 spark-jobserver 对比#
Livy 的优势:
- Livy 不需要对代码进行任何更改,而 SJS 作业必须扩展特定的类。
- Livy 允许提交代码片段 (包括 Python) 以及预编译的 jar,而 SJS 只接受 jar。
- 除了 REST 之外,Livy 还有 Java 和 Scala API。Python API 正在开发中,SJS 有一个 “python 绑定”
SJS 优势:
- SJS 可以管理 jars,它允许您上传和存储 Jars,部署作业的时候只需要通过单独的 REST 去调用。而 Livy 每次重新部署作业,都需要重新上传这些 jar。
- 可以使用 HOCON 格式配置 SJS 作业,该格式可以作为 REST 调用提交
官方链接
Livy: https://livy.incubator.apache.org/
spark-jobserver: https://github.com/spark-jobserver/spark-jobserver