繁体   English   中英

集群部署模式下的spark-submit将应用程序ID提供给控制台

[英]spark-submit in cluster deploy mode get application id to console

我陷入了一个需要快速解决的问题。 我已经阅读了很多关于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命令中写入事件日志。

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

谢谢。

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

在完成集群部署模式和一些博客的Spark代码之后,很少有事情变得清晰。 它可能会帮助其他人寻求获得相同的结果。

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

所以我们需要使用: -

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

澄清:

  1. client mode意味着Spark驱动程序在您运行spark提交的同一台机器上运行
  2. cluster mode意味着Spark驱动程序正在某个集群上运行

您提到在客户端模式下运行应用程序时会记录它,您可以在控制台中看到它。 当您在群集模式下运行时,您的输出也会被记录因为它在另一台计算机上运行,​​您无法看到它

一些想法:

  • 将工作节点中的日志聚合到一个可以解析它们以获取应用程序ID的位置。
  • 将appID写入某些共享位置,如HDFS或数据库。 如果要保留log4j,则可以使用Log4j appender

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM