一周前我发布了一个类似的问题,但从未得到回答。 我花了很多时间调试我遇到的问题,请允许我简要介绍一下这个问题:
大约8到16个小时(平均11个小时)后,有一个工作卡住了,Spark停了下来。屏幕截图
和
如果我手动(杀死)该作业,则Spark会崩溃。
log4j日志根本不显示任何警告/错误。所以我添加了自己的记录器来查找失败的步骤。我的代码如下所示:
DS = KafkaUtils.createDirectStream(ssc, ...)
dstream = DS.map(...)
dstream.foreachRDD(lambda time, rdd:
rdd.foreachPartition(lamda parti: doWork(time, parti) )
)
def doWork(time, parti):
for part in parti:
mention = part['mention'] # extract string from json
words = nltk.wordpunct_tokenize(mention)
kw = part['keyword']
#...
log.info("I")
if len(set(dictKeywords[kw]).intersection([w.lower() for w in words])) <= 0:
retobj['keeper']=0 # don't keep it
elif detect(editedMention) != 'en':
retobj['keeper']=0 # don't keep it
cleantxt = ppr.clean(mention)
log.info("J")
# ...
这是作业卡住时的日志文件:
...
2018-01-16 16:48:35,797 I
2018-01-16 16:48:35,818 J
...
2018-01-16 16:48:35,853 I
^ this is the end (job got stuck after printing "I")
它应该打印“J”,但它没有,所以三个函数之一导致它挂起/崩溃/停止:set.Intersect / langdetect.detect / tweet-preprocessor ppr。
但它没有意义,为什么它会在这么多时间后失败?我的代码中到处都有“try + except”块,如果有异常则会被记录。
有什么想法吗?感谢!!!
答案 0 :(得分:0)
@ user8371915我非常感谢你帮助我。 我相信我已经确定了问题,现在正在进行最后的测试。
我使用的Tweet-Preprocessor模块(来源:https://github.com/s/preprocessor)有一个非常讨厌的错误。看看这段代码:
import preprocessor as ppr
mention = "Try this Bitcoin Price app https://itunes.apple.com/in/app/bitcoin-price-calculator/id1315298877?mt=8[app](https://itunes.apple.com/in/app/bitcoin-price-calculator/id1315298877?mt=8)"
print(mention)
cleantxt = ppr.clean(mention)
print(cleantxt)
以上代码将永远陷入&#34; clean&#34;方法。但这只发生在一个非常具体的推文上(如上所述)。因此,在遇到这样的推文之前需要几个小时。
我删除了与预处理器模块相关的所有内容并重新设计了我的代码。我相信我不会再遇到这个问题了。