Livy探究(二) -- 运行模式

P_Chou水冗

上一篇的例子采用Livy默认的Local模式运行Spark任务。本篇我们尝试一下其他模式。因为修改配置文件需要重启,而每次重启服务都要设置SPARK_HOMEHADOOP_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

image.png

这个session关联了1个driver和2个executor:

image.png

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应用:

image.png

进一步到spark界面查看executor:

image.png

注意到这次同样启动了1个driver和2个executor,但是区别在于driver并不是启动在livy所在服务器的。这与yarn-cluster模式的行为一直。

再次查看livy的webui,看到刚刚创建的这个应用:

image.png

这里注意到一个细节,Logs列有两个链接,一个是session,一个是drvier。点进去看,可以察觉到:

  • session日志显示的是提交spark任务时client打印的日志
  • drvier日志跳转到yarn日志,显示的是driver运行输出的日志

进一步,我们还是通过python代码提交两个job。查看ui界面看到两个任务已经执行成功:

image.png

查看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是如何支持多种运行模式的。

阅读 750

全干工程师
分享和记录个人技术经验,由于接触的东西比较杂,可能什么都写,看官见谅

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发

5k 声望
238 粉丝
0 条评论
你知道吗?

大数据spark/flink/hadoop/elasticsearch/kafka架构与开发

5k 声望
238 粉丝
宣传栏