集群部署模式下的spark-submit将应用程序ID获取到控制台

时间:2018-07-03 16:36:10

标签: apache-spark logging log4j log4j2 apache-spark-2.0

我陷入一个需要迅速解决的问题。我已经阅读了许多有关Spark集群部署模式的帖子和教程,但是由于这种方法停留了几天,所以对这种方法一无所知。

我的用例:-我有很多使用'spark2-submit'命令提交的spark作业,一旦提交,我需要在控制台中打印应用程序ID。 Spark作业使用集群部署模式提交。 (在正常的客户端模式下,它会被打印出来)

在创建解决方案时我需要考虑的要点:-我不应该更改代码(这将花费很长时间,因为正在运行许多应用程序),我只能提供log4j属性或一些自定义编码。

我的方法:-

1)我尝试更改log4j级别和各种log4j参数,但日志记录仍转到集中式日志目录。

来自我的log4j.properties的一部分:-

log4j.logger.org.apache.spark.scheduler.cluster.YarnClusterSchedulerBackend=ALL,console
log4j.appender.org.apache.spark.scheduler.cluster.YarnClusterSchedulerBackend.Target=System.out

log4j.logger.org.apache.spark.deploy.SparkSubmit=ALL
log4j.appender.org.apache.spark.deploy.SparkSubmit=console

log4j.logger.org.apache.spark.deploy.SparkSubmit=TRACE,console
log4j.additivity.org.apache.spark.deploy.SparkSubmit=false

log4j.logger.org.apache.spark.deploy.yarn.Client=ALL
log4j.appender.org.apache.spark.deploy.yarn.Client=console


log4j.logger.org.apache.spark.SparkContext=WARN
log4j.logger.org.apache.spark.scheduler.DAGScheduler=INFO,console

log4j.logger.org.apache.hadoop.ipc.Client=ALL

2)我还尝试添加自定义侦听器,并且能够在应用程序完成后获取spark应用程序ID,但无法控制台。

代码逻辑:-

public void onApplicationEnd(SparkListenerApplicationEnd arg0) 
    {
         for (Thread t : Thread.getAllStackTraces().keySet()) 
         {
            if (t.getName().equals("main"))
            {
                System.out.println("The current state : "+t.getState());

                Configuration config = new Configuration();

                ApplicationId appId = ConverterUtils.toApplicationId(getjobUId);

                // some logic to write to communicate with the main thread to print the app id to console.
            }
         }
    }

3)我已将spark.eventLog启用为true,并在HDFS中指定了一个目录,以通过spark-submit命令写入事件日志。

如果有人可以帮助我找到解决方案的方法,那将真的很有帮助。或者,如果我做错了什么,任何见解都会对我有所帮助。

谢谢。

2 个答案:

答案 0 :(得分:2)

在同一个地方呆了几天后,我终于能够解决我的问题。

在针对集群部署模式的Spark代码和一些博客之后,几乎没有什么清楚的。这可能会帮助其他希望达到相同结果的人。

在集群部署模式下,作业是通过客户端线程从用户提交机器上提交的。实际上,我正在将log4j配置传递给驱动程序和执行程序,但错过了缺少“客户端”的日志4j配置的部分。

所以我们需要使用:-

SPARK_SUBMIT_OPTS =“-Dlog4j.debug = true -Dlog4j.configuration = <location> / log4j.properties” spark-submit <rest of the parameters>

答案 1 :(得分:1)

要澄清:

  1. client mode表示Spark驱动程序在您运行火花提交的同一台计算机上运行
  2. cluster mode表示Spark驱动程序在集群中某个位置的运行中耗尽了

您提到当您在 client 模式下运行该应用程序时,该应用程序已记录下来,您可以在控制台中看到它。当您在集群模式下运行时,由于它们运行在不同机器上,您只是看不见,因此您的输出也会被记录。 / p>

一些想法:

  • 将来自工作程序节点的日志汇总到一个位置,您可以在其中解析它们以获取应用程序ID。
  • 将appID写入一些共享位置,例如HDFS或数据库。如果您想保留log4j,则可以使用Log4j appender