【问题标题】:How can I get Spark to see code in a different module?如何让 Spark 查看不同模块中的代码?
【发布时间】:2016-10-05 23:25:16
【问题描述】:

我有一个复杂的函数,我使用 map 函数在 spark 中运行数据集。它位于不同的 python 模块中。调用 map 时,executor 节点没有该代码,然后 map 函数失败。

s_cobDates = getCobDates() #returns a list of dates
sb_dataset = sc.broadcast(dataset) #fyi - it is not trivial to slice this into chunks per date

def sparkInnerLoop(n_cobDate):
   n_dataset = sb_dataset.value
   import someOtherModule
   return someOtherModule.myComplicatedCalc(n_dataset)

results = s_cobDates.map(sparkInnerLoop).collect()

Spark 然后失败,因为它无法导入 myOtherModule。

到目前为止,我已经通过创建一个包含 someOtherModule 的 python 包并在我的 spark 作业之前将其部署到集群来解决这个问题,但这并不能实现快速原型设计。

如何让 spark 将完整代码发送到执行程序节点,而不将所有代码内联到“sparkInnerLoop”中?该代码在我的解决方案中的其他地方使用,我不希望代码重复。

我在独立模式下使用 8 节点集群,v 1.6.2,驱动程序正在我的 pycharm 工作站上运行。

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案1】:

    上面的答案很有效,如果你的模块是包的一部分,它就会失败。相反,它可以压缩您的模块,然后将 zip 文件添加到您的 spark 上下文中,然后它们具有正确的包名称。

    def ziplib():
        libpath = os.path.dirname(__file__)  # this should point to your packages directory
        zippath = r'c:\Temp\mylib-' + randstr.randstr(6) + '.zip'
        zippath = os.path.abspath(zippath)
        zf = zipfile.PyZipFile(zippath, mode='w')
        try:
            zf.debug = 3  # making it verbose, good for debugging
            zf.writepy(libpath)
            return zippath  # return path to generated zip archive
        finally:
            zf.close()
    
    sc = SparkContext(conf=conf)
    
    zip_path = ziplib()  # generate zip archive containing your lib
    zip_path = pathlib.Path(zip_path).as_uri()
    sc.addPyFile(zip_path)  # add the entire archive to SparkContext
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多