上一篇的例子采纳 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 是如何反对多种运行模式的。