如何在每个Spark执行器中加载无法pickle的数据?

2024-10-02 00:41:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是用Cython写的NoAho library。它的内部triecannot be pickled:如果我在master节点上加载它,我就永远不会得到在worker中执行的操作的匹配项。在

由于我希望在每个Spark执行器中使用相同的trie,因此我找到了一种懒洋洋地加载trie的方法,灵感来自于spaCy on Spark issue。在

global trie

def get_match(text):
    # 1. Load trie if needed
    global trie
    try:
        trie
    except NameError:
        from noaho import NoAho

        trie = NoAho()
        trie.add(key_text='ms windows', payload='Windows 2000')
        trie.add(key_text='ms windows 2000', payload='Windows 2000')
        trie.add(key_text='windows 2k', payload='Windows 2000')
        ...

    # 2. Find an actual match to get they payload back
    return trie.findall_long(text)

当这项工作正常时,对每个Spark作业执行所有.add()调用,这大约需要一分钟。由于我不确定“Spark job”是否正确,我将更明确地说:我在Jupyter笔记本中使用Spark,每次我运行需要get_match()函数的单元格时,trie永远不会被缓存,并且需要一分钟的时间来加载trie,这在运行时占主导地位。在

我能做些什么来确保缓存trie吗?或者我的问题有更好的解决方案吗?在


Tags: keytextaddgetwindowsmatchlibraryglobal
1条回答
网友
1楼 · 发布于 2024-10-02 00:41:43

您可以尝试使用单例模块来加载和初始化trie。基本上,您只需要一个单独的模块,其中包含以下内容:

  • trie_loader.py

    from noaho import NoAho
    
    def load():
        trie = NoAho()
        trie.add('ms windows', 'Windows 2000')
        trie.add('ms windows 2000', 'Windows 2000')
        trie.add('windows 2k', 'Windows 2000')
        return trie
    
    trie  = load()
    

并使用标准Spark工具分发:

^{pr2}$

这应该在每次启动Python进程执行器时加载所需的数据,而不是在访问数据时加载它。我不确定它是否能帮上忙,但值得一试。在

相关问题 更多 >

    热门问题