byzer-lang icon indicating copy to clipboard operation
byzer-lang copied to clipboard

一个包含python代码脚本文件,执行过程中groupId发生变化

Open anan0120 opened this issue 3 years ago • 3 comments

一个包含python代码脚本文件,执行过程中groupId发生变化,执行多次变化的都是同一个值,以下跟踪代码图片及定位到的问题

微信图片_20210706091825

微信图片_20210706091841

微信图片_20210706091854

微信图片_20210706091858

------->>>定位到的问题:pythonWorkers.getOrElseUpdate(key, new PythonWorkerFactory(pythonExec, envVars, conf)) ------->>>getOrElseUpdate函数非更新,一直获取第一次放入的值,导致groupId最终都是一个值

anan0120 avatar Jul 06 '21 01:07 anan0120

@anan0120 你这个直接在window idea上面调试吗?

hecheng64 avatar Jul 07 '21 09:07 hecheng64

@anan0120 你这个直接在window idea上面调试吗?

发现问题是在linux上,但无法定位到问题, 定位问题是在windows上面调试的,是在window idea上面调试的

anan0120 avatar Jul 07 '21 09:07 anan0120

可以确认这个问题确实存在的;根源在 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进程。所以后续我们会再重点考虑下如何解决。

allwefantasy avatar Jul 14 '21 09:07 allwefantasy