【问题标题】:Pyspark with Zeppelin: distributing files to cluster nodes versus SparkContext.addFile()Pyspark 与 Zeppelin:将文件分发到集群节点与 SparkContext.addFile()
【发布时间】:2018-11-10 16:09:07
【问题描述】:

我有一个我构建的库,我希望它可供 pyspark 集群 (1.6.3) 上的所有节点使用。我通过 Zeppelin (0.7.3) 在该火花集群上运行测试程序。

我想要的文件在 github 存储库中。所以我将该存储库克隆到集群的所有节点上,并通过 pssh 创建一个脚本来同时更新它们。所以这些文件存在于每个节点上的一个设定位置,我希望每个节点都可以访问它们。

我试过了

import sys
sys.path.insert(0, "/opt/repo/folder/")

from module import function
return_rdd = function(arguments)

这产生了一个错误堆栈:

  File "/usr/hdp/current/spark-client/python/pyspark/worker.py", line 98, in main
    command = pickleSer._read_with_length(infile)
  File "/usr/hdp/current/spark-client/python/pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
  File "/usr/hdp/current/spark-client/python/pyspark/serializers.py", line 439, in loads
    return pickle.loads(obj, encoding=encoding)
ImportError: No module named 'module'

我发现这个错误很不寻常,因为它是由 pickle 调用提示的。该代码似乎加载了一个数据帧并将其分区,但仅当在转换为 rdd 的分区 df 上调用模块内的另一个函数时才会失败。我不确定这里涉及泡菜电话的位置和原因;模块 pyscript 不需要被腌制,因为有问题的模块应该已经在集群的每个节点上的 sys.path 中。

另一方面,我能够做到这一点

sc.addFile("/opt/repo/folder/module.py")
import sys
from pyspark import SparkFiles
sys.path.insert(0, SparkFiles.getRootDirectory())

from module import function
return_rdd = function(arguments)

知道为什么第一种方法不起作用吗?

【问题讨论】:

    标签: python-3.x apache-spark pyspark apache-zeppelin


    【解决方案1】:

    一个可能的解决方案是:

    sc.addFile("/opt/repo/folder/module.py")
    import sys
    from pyspark import SparkFiles
    sys.path.insert(0, SparkFiles.getRootDirectory())
    
    from module import function
    return_rdd = function(arguments)
    

    这在集群模式下不起作用

    【讨论】:

    • 您可以在行首使用 4 个空格将段落标记为代码块。这美化了格式。
    猜你喜欢
    • 2021-04-04
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 2018-01-17
    • 2018-02-11
    • 2016-04-12
    • 2015-12-19
    相关资源
    最近更新 更多