PySpark工作永远挂起(在实时分析期间)

时间:2018-01-16 17:56:59

标签: python apache-spark pyspark spark-streaming

一周前我发布了一个类似的问题,但从未得到回答。 我花了很多时间调试我遇到的问题,请允许我简要介绍一下这个问题:

大约8到16个小时(平均11个小时)后,有一个工作卡住了,Spark停了下来。屏幕截图

enter image description here

enter image description here

如果我手动(杀死)该作业,则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”块,如果有异常则会被记录。

  • 我在本地模式(单节点)。
  • 我使用“spark-submit”来启动python脚本。
  • 我试过让Spark使用Python 3.5.2和Python 3.6。
  • 我尝试过缓存RDD并且没有缓存。
  • 这不是OOM问题,GC日志没有表明任何异常。

有什么想法吗?感谢!!!

1 个答案:

答案 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;方法。但这只发生在一个非常具体的推文上(如上所述)。因此,在遇到这样的推文之前需要几个小时。

我删除了与预处理器模块相关的所有内容并重新设计了我的代码。我相信我不会再遇到这个问题了。