上一篇的例子采用Livy默认的Local模式运行Spark任务。本篇我们尝试一下其他模式。因为修改配置文件需要重启,而每次重启服务都要设置SPARK_HOME
和HADOOP_CONF_DIR
比较麻烦。我们首先修改一下conf/livy-env.sh
:
cp conf/livy-env.sh.template conf/livy-env.sh
vi conf/livy-env.sh
# 将环境变量添加进来,每次重启会自动使环境变量生效
HADOOP_CONF_DIR=/etc/hadoop/conf
SPARK_HOME=/home/spark-2.4.1-bin-hadoop2.7
许多apache软件都采用同样的套路,例如spark, zeppelin。所以弄的东西多了,即使没有文档指导也能猜测出配置的方式
Standalone集群模式
首先我们需要部署一个spark的standalone集群,此处略过部署的过程。假设集群的master地址如下:
spark://vm3198:7077
修改conf/livy.conf
,设置如下参数,指向部署好的spark集群:
livy.spark.master = spark://vm3198:7077
重启服务
bin/livy-server stop
bin/livy-server start
用第一篇中的命令创建session,并运行两个例子,可以发现是能够成功的,这里略过这个过程了。重点来看一看提交到集群上的应用。观察spark集群上的应用我们看到livy在集群上提交了一个application叫livy-session-0
:
这个session关联了1个driver和2个executor:
driver其实运行在livy所在的服务器上,作为livy的子进程,由livy管理。虽然从进程关系上与local模式没什么区别。但是我们知道,本质上,local模式其实是在一个进程中通过多个线程来运行driver和executor的;而standalone模式时,这个进程仅仅运行driver,而真正的job是在spark集群运行的。显然,standalone模式更合理一些。
笔者尝试通过修改livy.spark.deploy-mode = cluster,但是这种模式下无法成功运行session。所以standalone模式中,只能采用client模式
yarn模式
我们知道,生产环境最好配合yarn来运行spark任务。所以必须要实验一下yarn模式。由于yarn-client
模式本质上与standalone区别不大。所以直接选择yarn-cluster
模式。
修改conf/livy.conf
,设置如下参数,设置yarn-cluster模式:
livy.spark.master = yarn-cluster
后来通过日志发现Warning: Master yarn-cluster is deprecated since 2.0. Please use master "yarn" with specified deploy mode instead. 所以更好的配置是livy.spark.master = yarn
,并且livy.spark.deploy-mode = cluster
由于我们提前设置了HADOOP_CONF_DIR
,所以显然livy是可以知道yarn的RM位置的。重启livy后,创建一个session。我们通过yarn的webui界面可以看到启动的Spark应用:
进一步到spark界面查看executor:
注意到这次同样启动了1个driver和2个executor,但是区别在于driver并不是启动在livy所在服务器的。这与yarn-cluster
模式的行为一直。
再次查看livy的webui,看到刚刚创建的这个应用:
这里注意到一个细节,Logs列有两个链接,一个是session,一个是drvier。点进去看,可以察觉到:
- session日志显示的是提交spark任务时client打印的日志
- drvier日志跳转到yarn日志,显示的是driver运行输出的日志
进一步,我们还是通过python代码提交两个job。查看ui界面看到两个任务已经执行成功:
查看livy服务器上与livy有关的进程,之前无论是local模式还是standalone模式都存在一个SparkSubmit进程。而这次,在yarn-cluster
模式下,并没有这个进程。那么问题来了,我们通过restful接口,提交的代码
,究竟是如何传输到driver进程,并执行的呢?观察日志我们大概找到写蛛丝马迹。在driver端,找到如下日志:
...
20/10/01 20:04:18 INFO driver.RSCDriver: Connecting to: vm3198:10000
20/10/01 20:04:18 INFO driver.RSCDriver: Starting RPC server...
20/10/01 20:04:18 INFO rpc.RpcServer: Connected to the port 10001
...
带着这些问题,下一篇我们一起去源码中找一下线索。
总结
本篇我们分别针对standalone和yarn-cluster模式,实验了livy的工作方式。了解了livy是如何支持多种运行模式的。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。