我目前正在使用Python构建一个中等复杂的应用程序,该应用程序依赖于来自多个源的有状态数据。使用Pyspark
我遇到了一个问题,即在应用程序从检查点重新启动后,未在updateStateByKey
函数中使用全局变量。使用forEachRDD
我有一个全局变量A
,每次批处理运行时都会从文件传播,然后在A
中使用updateStateByKey
。当我最初运行应用程序时,它按预期运行,并且在更新函数的范围内正确引用A
的值。
但是,当我关闭应用程序并重新启动时,我会看到不同的行为。变量A
通过其对应的forEachRDD
函数分配了正确的值,但是当执行updateStateByKey
函数时,不使用A
的新值。它只是......消失了。
我可能会解决这个错误的实施,但我希望有人可以指出我正确的方向。
这是一些伪代码:
def readfile(rdd):
global A
A = readFromFile
def update(new, old)
if old in A:
do something
dstream.forEachRDD(readfile)
dstream.updateStateByKey(update)
ssc.checkpoint('checkpoint')
A
在第一次运行时是正确的,但是当应用程序被终止并重新启动时A
似乎没有被正确地重新分配。