代码之家  ›  专栏  ›  技术社区  ›  rawwar

pyspark的sparkcontext中PyFiles参数的用途是什么[duplicate]

  •  0
  • rawwar  · 技术社区  · 6 年前

    我用python编写了一个实现分类器的类。我想使用Apache Spark使用这个分类器来并行化大量数据点的分类。

    1. 我在一个集群上使用Amazon EC2,集群上有10个从机,这是基于一个a m I,上面有python的Anaconda发行版。ami允许我远程使用IPython笔记本。
    2. 我已经检查了在从master运行命令行spark时是否可以导入和使用BoTree.py(我只需要从编写import BoTree开始,我的类BoTree就可用了
    3. 我已经通过ssh连接到其中一个从机并尝试在那里运行ipython,并且能够导入BoTree,因此我认为模块已经成功地跨集群发送(我还可以在…/python2.7/文件夹中看到BoTree.py文件)

    然而

    import BoTree
    bo_tree = BoTree.train(data)
    rdd = sc.parallelize(keyed_training_points) #create rdd of 10 (integer, (float, float) tuples
    rdd = rdd.mapValues(lambda point, bt = bo_tree: bt.classify(point[0], point[1]))
    out = rdd.collect()
    

    Spark因错误而失败(我认为是相关的一点):

      File "/root/spark/python/pyspark/worker.py", line 90, in main
        command = pickleSer.loads(command.value)
      File "/root/spark/python/pyspark/serializers.py", line 405, in loads
        return cPickle.loads(obj)
    ImportError: No module named BoroughTree
    

    有人能帮我吗?有点绝望。。。

    谢谢

    0 回复  |  直到 9 年前
        1
  •  15
  •   zero323 little_kid_pea    9 年前

    可能最简单的解决方案是 pyFiles 创建时的参数 SparkContext

    from pyspark import SparkContext
    sc = SparkContext(master, app_name, pyFiles=['/path/to/BoTree.py'])
    

    PYTHONPATH .

    如果在交互模式下工作,则必须停止使用现有的上下文。 sc.stop() 在你创建一个新的。

    PYSPARK_PYTHON 你可以用 conf/spark-env.sh 文件夹。

    把文件复制到 lib 是一个相当混乱的解决方案。如果要避免使用 pyFiles文件 我建议您创建一个普通的Python包或Conda包并进行正确的安装。这样,您就可以轻松地跟踪安装的内容,删除不必要的包,并避免一些难以调试的问题。

        2
  •  11
  •   dmbaker    9 年前

    addPyFile 随后将模块发送给每个工人。

    sc.addPyFile('/path/to/BoTree.py')
    

    pyspark.SparkContext.addPyFile( path ) documentation