为什么incubator-dolphinscheduler中Python任务输出日志总是延迟显示?
摘要:一、incubator-dolphinscheduler 中如何获取shell类型的节点或者python类型的节点任务的日志 -> 关注清哥聊技术公众号,了解更多技术文章 1、在org.apa
一、incubator-dolphinscheduler 中如何获取shell类型的节点或者python类型的节点任务的日志->关注清哥聊技术公众号,了解更多技术文章
1、在org.apache.dolphinscheduler.server.worker.task.AbstractCommandExecutor 类中通过java.lang.ProcessBuilder 来将python 脚本生成命令进行执行,AbstractCommandExecutor中的部分源码如下:
......
} else {
//init process builder
ProcessBuilder processBuilder = new ProcessBuilder();
// setting up a working directory
processBuilder.directory(new File(taskExecutionContext.getExecutePath()));
// merge error information to standard output stream
processBuilder.redirectErrorStream(true);
// setting up user to run commands
command.add("sudo");
command.add("-u");
command.add(taskExecutionContext.getTenantCode());
command.add(commandInterpreter());
command.addAll(commandOptions());
command.add(commandFile);
// setting commands
processBuilder.command(command);
process = processBuilder.start();
}
......
2、通过process.getInputStream() 来获取命令终端输出的日志,部分源码如下:
private void parseProcessOutput(Process process) {
String threadLoggerInfoName = String.format(LoggerUtils.TASK_LOGGER_THREAD_NAME + "-%s", taskExecutionContext.getTaskAppId());
ExecutorService parseProcessOutputExecutorService = ThreadUtils.newDaemonSingleThreadExecutor(threadLoggerInfoName);
parseProcessOutputExecutorService.submit(new Runnable() {
@Override
public void run() {
BufferedReader inReader = null;
try {
inReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
long lastFlushTime = System.currentTimeMillis();
logBuffer.add("welcome to use bigdata scheduling system...");
Thread.sleep(Constants.DEFAULT_LOG_FLUSH_INTERVAL * 2);
