1. Apache Livy简介
1.1 Livy与Zeppelin对比
在实际应用中,Spark SQL可以快速的完成对大数据量的统计分析,但Spark SQL对交互式查询支持的并不友好,因此也就衍生出多种第三方组件,如Apache Zeppelin、Apache Livy等。
Zeppelin提供了一个非常友好的 WebUI 界面以及操作指令,可用于做数据分析和可视化。其后面可以接入不同的数据处理引擎,包括 Flink,Spark,Hive 等,利用Scala语言、SQL语言等,可以方便的进行数据查询,将结果可视化,并可以实现多数据源(HDFS、HBase、MySQL)的联合分析。但Zeppelin的劣势在于只提供了WebUI的接口,并为提供REST/Java接口,因此无法将Zeppelin集成在我们的系统中,只能作为一个第三方服务存在,定制化较差。并且,Zeppelin的一个实例对应Spark中的一个Spark Application,Zeppelin运行过程中,需要始终保持该Application,即使在Zeppelin闲置时,所占用的Spark资源依然无法释放,这就造成了Spark资源的严重浪费。
与之相比,Apache Livy要轻量的多,并且Livy提供了REST接口和Java接口,可以很方便的集成于我们的系统中,为Spark提供一个更上一级的接口,隐藏Spark任务提交的细节。
1.2 Apache Livy特点与架构
Apache Livy中一个Session对应Spark中的一个Application,Session中的Statement对应Spark Application中的Job。当Session闲置超过一定时间时,Livy会自动将其关闭,Spark中对应的Application也就关闭。
Apache Livy提供了以下基本功能:
- 提交Scala、Python或是R代码片段到远端的Spark集群上执行。
- 提交Java、Scala、Python所编写的Spark作业到远端的Spark集群上执行;
- 提交批处理应用在集群中运行。
Livy是一个典型的REST服务架构,它一方面接受并解析用户的REST请求,转换成相应的操作;另一方面它管理着用户所启动的所有Spark集群。2. Apache Livy搭建
- 从Apache Livy官网下载压缩包并解压,进入Livy安装目录的conf目录下。
在conf目录下修改livy.conf文件,并添加如下设置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#设置livy server的address
livy.server.host = 172.24.2.XXX
#设置livy server的port
livy.server.port = 8998
#设置livy sessions使用的spark master
livy.spark.master = yarn
#设置livy sessions使用的spark deploy mode
livy.spark.deploy-mode = cluster
#设置livy rsc jars的地址,若不设置则默认每次启动一个session,都需要将livy本地目录中的rsc jars上传至spark集群,设置为hdfs目录路径,则省钱上次过程,session启动更加迅速
livy.rsc.jars = hdfs:///spark/lib/livy-api-0.4.0-incubating.jar,hdfs:///spark/lib/livy-rsc-0.4.0-incubating.jar,hdfs:///spark/lib/netty-all-4.0.29.Final.jar
#设置livy repl jars的地址,若不设置则默认每次启动一个session,都需要将livy本地目录中的repl jars上传至spark集群,设置为hdfs目录路径,则省钱上次过程,session启动更加迅速。有livy-repl_2.10 and livy-repl_2.11 jars两种版本,这里我们spark使用scala2.10,因此我们使用2.10版本
livy.repl.jars = hdfs:///spark/lib/commons-codec-1.9.jar,hdfs:///spark/lib/livy-core_2.10-0.4.0-incubating.jar,hdfs:///spark/lib/livy-repl_2.10-0.4.0-incubating.jar在conf目录下的livy-env.sh中设置JAVA_HOME、HADOOP_CONF_DIR、SPARK_HOME、SPARK_CONF_DIR等配置,与java、hadoop和spark的设置相对应。
- 在bin目录下启动livy-server。
livy-server启动后,我们可以在浏览器中输入网址:172.24.2.XXX:8998/ui 查看livy中启动的sessions以及运行结果等。3. Apache Livy REST API
Apache Livy REST API 官方文档详细介绍了Livy REST API的用法。本节我们主要针对常用接口简要介绍。
我们可以通过流量器插件Postman调用Livy的REST API来使用Livy,完成Session创建、查看Session状态信息、在Session创建Statement、查看Statement状态信息和运行结果以及删除Session等操作。3.1 Post Sessions
Livy创建Sessions通过Post Sessions命令完成,一个Session对应Spark中的一个Application,因为我们可以指定kind即类型spark/pyspark等、指定yarn的queue以及通过jars指定spark作业外部依赖的jar包等。具体支持的设置参数参加Livy官网。Post Sessions成功后会返回所创建Session的SessionId。3.2 Get Sessions
我们可以使用Get Sessions命令查询Sessions的状态,可以通过SessionId获取特定Session状态信息,也可以进行范围查询,获得Sessions列表。通过该命令,我们可以获得Session在Yarn集群对应的application_id、运行状态以及其他状态信息。3.3 Post Statements
Post Statements命令用来向Spark提交代码,一个Statement对应Spark Application中的一个Job。下图中我们提交了一段通过Spark Sql查询Hive表的代码。3.4 Get Statements
Statement创建后,可以使用Get Statements获取Statement的状态信息以及运行结果。下图中返回Body中text/plain中包含了查询Hive表的结果。3.5 Delete Sessions
Session闲置一段时间后,Livy会自动删除Session,Spark中对应的Application也会被自动删除。我们也可以通过Delete Sessions来手动删除Session。4. Apache Livy与Spark的逻辑关系
上节我们通过Post Sessions创建了一个Session,并使用Get Sessions得到了该Session的状态信息,其中appid为application_1506061012334_0021,这与我们下图中Yarn集群ALL Applications中得到的信息是一致的。
上节我们已经提到Livy中每个Session对应Spark中的一个Application,所以创建Session需要指定的参数,与Spark中创建Application时需要指定的参数基本一致。Livy中的Statement的概念对应Spark Application中的Job。Livy中Session包含若干Statement,与Spark中Application包含若干Job一致。
同时需要强调的一点是,Livy的Session在闲置一段时间后会自动删除,对应的Spark Application也会自动删除。因此Livy闲置时并不会始终占用Spark资源。