byzer-lang
byzer-lang copied to clipboard
一个包含python代码脚本文件,执行过程中groupId发生变化
一个包含python代码脚本文件,执行过程中groupId发生变化,执行多次变化的都是同一个值,以下跟踪代码图片及定位到的问题
------->>>定位到的问题:pythonWorkers.getOrElseUpdate(key, new PythonWorkerFactory(pythonExec, envVars, conf)) ------->>>getOrElseUpdate函数非更新,一直获取第一次放入的值,导致groupId最终都是一个值
@anan0120 你这个直接在window idea上面调试吗?
@anan0120 你这个直接在window idea上面调试吗?
发现问题是在linux上,但无法定位到问题, 定位问题是在windows上面调试的,是在window idea上面调试的
可以确认这个问题确实存在的;根源在 tech.mlsql.arrow.python.PythonWorkerFactory.startDaemon
中的如下两行代码:
// Redirect daemon stdout and stderr
Utils.redirectStream(conf, in)
Utils.redirectStream(conf, daemon.getErrorStream)
这个方法会把python日志包裹上用户名和group id,然后发送给driver,然后打印到到driver的log里, 所以其实问题可能还更多点,可能不仅仅是groupid没变化,用户名可能也没有变化。
其中conf 是初始创建 PythonWorkerFactory的值。一直不会发生变化。
def createPythonWorker(pythonExec: String, envVars: Map[String, String], conf: Map[String, String]): java.net.Socket = {
synchronized {
val key = (pythonExec, envVars)
pythonWorkers.getOrElseUpdate(key, new PythonWorkerFactory(pythonExec, envVars, conf)).create()
}
}
key没有考虑conf,所有导致没有生效;而如果考虑conf,可能就会导致缓存几乎都是失效的,每次执行都会产生python daemon/worker进程。所以后续我们会再重点考虑下如何解决。