将Spark Launcher-Output保存到文件

时间:2017-08-20 11:52:32

标签: java apache-spark logging spark-launcher

我使用Java-app和Spark Launcher以编程方式将我的作业提交到spark-cluster(使用YARN)(使用startApplication()启动作业,而不是launch())。 我喜欢在执行Java应用程序时在启动程序的stdout和stderr上生成所有日志输出,在文件中,我可以使用java-app访问它。我不想更改全局spark-log-config,我想要一个动态解决方案,我可以根据每次执行时从java-app更改变量来控制它。

documentation之后,应该可以使用CHILD_PROCESS_LOGGER_NAME选项。所以我定义了一个java.util.logging.logger,如here,并将此代码添加到我的作业启动器中:

SparkLauncher.setConfig(SparkLauncher.CHILD_PROCESS_LOGGER_NAME, "MyLog");

但这不起作用,logfile为空。我也尝试过其他方法,如setConf(...)或添加addSparkArg(...),但没有成功。我错了什么? 或者我应该更好地使用log4j,进行自定义配置,并以任何方式将其提供给启动器?如果是的话,如何在我的java-app中做到这一点?

2 个答案:

答案 0 :(得分:1)

以下是我用slf4j-log4j打印sparkLauncher日志的代码片段:

private static final Logger LOGGER = LoggerFactory.getLogger(JobSubmitter.class);

SparkLauncher launcher = new SparkLauncher()............;//prepare launcher

launcher.redirectToLog(JobSubmitter.class.getName());
        SparkAppHandle handler = launcher.startApplication();
        while (handler.getState() == null || !handler.getState().isFinal()) {
            if (handler.getState() != null) {
                LOGGER.info("Job state is :{} " , handler.getState());
                if (handler.getAppId() != null) {
                    LOGGER.info("App id: {} :: state:{}" , handler.getAppId() , handler.getState());
                }
            }
//Pause job to reduce job check frequency
            Thread.sleep(jobStatusCheckInterval ==0?DEFAULT_JOB_STATUS_CHECK_INTERVAL:jobStatusCheckInterval);
        }

如果您有任何疑问,请添加评论。

答案 1 :(得分:0)

我尝试使用redirectOutput(java.io.File outFile)并且能够将所有sparkLauncher的日志记录到outFile。