当使用以下内容运行Spark Shell查询时:
spark-shell yarn --name myQuery -i ./my-query.scala
在我的查询中是一个简单的Spark SQL查询,在这里我读取镶木地板文件,运行简单的查询并写出镶木地板的文件。当运行这些查询时,我会得到一个很好的进度条,如下所示:
[Stage7:===========> (14174 + 5) / 62500]
当我使用完全相同的查询创建一个jar并使用以下命令行运行它时:
spark-submit
--master yarn-cluster
--driver-memory 16G
--queue default
--num-executors 5
--executor-cores 4
--executor-memory 32G
--name MyQuery
--class com.data.MyQuery
target/uber-my-query-0.1-SNAPSHOT.jar
我没有这样的进度条。命令只是重复地说
17/10/20 17:52:25 INFO yarn.Client: Application report for application_1507058523816_0443 (state: RUNNING)
查询工作正常,结果也很好。但我只需要在这个过程结束时得到反馈。我试过以下几种。
- RUNNING Hadoop应用程序的网页确实有进度条,但它基本上从不移动。即使在sparkshell查询的情况下,进度条也是无用的
- 我已经尝试过通过YARN日志获取进度条,但在作业完成之前,它们不会聚合。即便如此,日志中也没有进度条
有没有一种方法可以在集群上的jar中启动spark查询并拥有进度条?
当我使用完全相同的查询创建一个jar并使用以下命令行(…)运行它时,我没有得到任何这样的进度条。
这两个看似相似的Spark执行之间的区别在于主URL。
在前一个使用spark-shell yarn
的Spark执行中,主机是客户端部署模式下的YARN,即驱动程序在启动spark-shell
的机器上运行。
在后一个使用spark-submit --master yarn-cluster
的Spark执行中,主机是集群部署模式下的YARN(实际上相当于--master yarn --deploy-mode cluster
),即驱动程序运行在YARN节点上。
话虽如此,你不会在本地机器上得到漂亮的进度条(实际上称为ConsoleProgressBar),而是在驱动程序运行的机器上。
一个简单的解决方案是用yarn
代替yarn-cluster
。
ConsoleProgressBar显示活动阶段到标准错误的进度,即stderr
。
进度包括阶段id、已完成任务数、活动任务数和总任务数。
ConsoleProgressBar是在spark.ui.showConsoleProgressspark属性打开并且org.apache.spark.SparkContext记录器的日志记录级别为WARN
或更高时创建的(即打印出的消息更少,因此有一个"空间"用于ConsoleProgessBar)。
您可以在Mastering Apache Spark 2的ConsoleProgressBar中找到更多信息。