【发布时间】:2017-03-29 12:31:51
【问题描述】:
我正在使用带有 SparkContext 的 Jupyter 笔记本和 Python 内核。一位同事编写了一些 Python 代码,将 Spark 事件与 ipykernel 事件联系起来。当我们从笔记本单元导入他的模块时,它可以在我们需要支持的所有组合中工作:Python 2.7 和 3.5、Spark 1.6 和 2.x,仅限 Linux。
现在我们要为所有 Python 内核自动启用该代码。我将导入放入我们的sitecustomize.py。这适用于 Spark 2.x,但不适用于 Spark 1.6。带有 Spark 1.6 的内核不再获得 sc,而且有些事情搞砸了,以至于像 matplotlib.cbook 这样的不相关的导入失败了。当我使用计时器将导入延迟几秒钟时,它可以工作。
显然,sitecustomize.py 中的代码执行得太早,无法导入连接 Spark 和 ipykernel 的模块。
我正在寻找一种方法来延迟导入,直到 Spark 和/或 ipykernel 完全初始化。但它仍应作为内核启动的一部分在执行任何笔记本单元之前执行。
我发现this trick 延迟代码执行直到sys.argv 被初始化。但我不认为它可以处理像sc 这样的全局变量,因为Python 全局变量仍然是模块的本地变量。到目前为止,我能想到的最好方法是使用计时器每秒检查 sys.modules 中是否存在某些模块。但这不是很可靠,因为我不知道如何区分完全初始化的模块和仍在加载的模块。
关于如何挂钩在启动期间执行较晚的启动代码有什么想法吗?特定于 pyspark 和/或 ipykernel 的解决方案将满足我的需求。
【问题讨论】:
-
我又玩了一些检查模块的存在......这还不够好。我可以让导入可靠地工作,但预期的功能可能会或可能不会在之后工作。导入时加载的模块列表是相同的。
-
您检查过
PYTHONSTARTUP环境变量吗?来自python --help:PYTHONSTARTUP:交互式启动时执行的文件(无默认) -
@piotr-dobrogost:这不是一个交互式启动。我们使用
-m ipykernel调用Python 来启动IPython 内核。
标签: python apache-spark ipython pyspark