在 pyspark 的映射器中导入错误

Posted

技术标签:

【中文标题】在 pyspark 的映射器中导入错误【英文标题】:Import error inside a mapper in pyspark 【发布时间】:2017-06-17 09:44:50 【问题描述】:

我正在开发一个 EMR YARN 集群,但遇到了 networkx 问题。 我正在尝试在映射器内的 networkx 包中运行其中一种算法,并收到一条错误消息,指出没有模块名称“装饰器”,并立即失败,并出现以下错误:

文件“./networkx-1.11-py2.7.egg/networkx/utils/init.py”,第 2 行,在 文件“./networkx-1.11-py2.7.egg/networkx/utils/decorators.py”,第 7 行,在 ImportError: No module named decorator

    at org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRDD.scala:193)
    at org.apache.spark.api.python.PythonRunner$$anon$1.<init>(PythonRDD.scala:234)
    at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:152)
    at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:63)
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)

当我在本地模式下运行确切的脚本时它工作正常(不使用集群)。

我为运行代码所采取的步骤如下:

    wget networkx 包和它的 egg 到集群。 在集群上安装了 networkx。 使用命令 --py-files 运行我的脚本,并带有 egg 的路径: spark-submit --py-files path-to-egg/networkx-1.11-py2.7.egg --master yarn --deployed-mode cluster path-to-file/NX.py

仅当我在集群模式下运行代码时才存在此问题。似乎由于某种原因,networkx egg 无法导入装饰器。

我该如何进行?我是否还需要为装饰者寻找另一个彩蛋?关于如何在映射器中使用 networkx 包的任何其他想法?

非常感谢。

【问题讨论】:

【参考方案1】:

您似乎需要为 decorator 包添加另一个 egg 文件。

例如,您可以下载 tarball(从上面的链接)并构建自己的 egg:

$ python setup.py bdist_egg

然后,您可以在--py-files 参数中添加蛋的路径,例如

$ spark-submit --py-files /path/to/foo.egg,/path/to/bar.egg

【讨论】:

谢谢!在我生成“decorator.egg”并将其添加到命令参数后,它工作得很好。

以上是关于在 pyspark 的映射器中导入错误的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Sqoop 导出中自定义的映射器数量

从文件中为hadoop中的映射器创建自定义键值

如何将不同的数据集传递给同一作业的两个不同的映射器

SQLAlchemy bulk_insert_mappings():无法获取表“测试”的映射器

了解 HIVE 数据库中的映射器和缩减器

如何创建从实体到 dto 的映射器,其中 dto 嵌套在哪里?