首页 文章

无法运行pyspark

提问于
浏览
16

我在Windows上安装了Spark,我无法启动 pyspark . 当我输入 c:\Spark\bin\pyspark 时,我收到以下错误:

Python 3.6.0 | Anaconda自定义(64位)| (默认情况下,2016年12月23日,11:57:41)win32上的[MSC v.1900 64 bit(AMD64)]输入“help”,“copyright”,“credits”或“license”以获取更多信息 . 回溯(最近一次调用最后一次):文件“c:\ Spark \ bin .. \ python \ pyspark \ shell.py”,第30行,在导入pyspark文件“c:\ Spark \ python \ pyspark__init __ . py”,第44行,从pyspark.context导入SparkContext文件“c:\ Spark \ python \ pyspark \ context.py”,第36行,从pyspark.java_gateway导入launch_gateway文件“c:\ Spark \ python \ pyspark \ java_gateway.py”,第31行,从py4j.java_gateway导入java_import,JavaGateway,GatewayClient文件“”,第961行,在_find_and_load文件“”,第950行,在_find_and_load_unlocked文件“”,第646行,在_load_unlocked文件“”,第616行,在_load_backward_compatible在文件“C:\ Users \ Eigenaar \ Anaconda3 \ lib \ pydoc.py”中的文件“c:\ Spark \ python \ lib \ py4j-0.10.4-src.zip \ py4j \ java_gateway.py”,第18行,第62行,在导入pkgutil文件“C:\ Users \ Eigenaar \ Anaconda3 \ lib \ pkgutil.py”,第22行,在ModuleInfo = namedtuple('ModuleInfo','module_finder name ispkg')文件“c:\ Spark \ python \ pyspark \ serializers.py“,第393行,在namedtuple cls = _old_namedtuple(* args,** kwargs )TypeError:namedtuple()缺少3个必需的仅限关键字参数:'verbose','rename'和'module'

我在这做错了什么?

5 回答

  • 2

    在Windows上运行Spark时可能遇到的问题是,没有提供正确的Path或使用Python 3.x来运行Spark .

    所以,

    • 检查路径给定的火花,即/ usr / local / spark正确与否 .

    • 将Python Path设置为Python 2.x(删除Python 3.x) .

  • 15

    Spark 2.1.0不支持python 3.6.0 . 要解决这个问题,请在anaconda环境中更改python版本 . 在你的anaconda环境中运行以下命令

    conda create -n py35 python=3.5 anaconda
    activate py35
    
  • 23

    Spark <= 2.1.0与Python 3.6不兼容 . 请参阅this issue,其中也声称这将在即将发布的Spark版本中修复 .

  • 8

    我使用pythons脚本中的一个更改解决了这个问题 .

    我在python脚本中的下面一段代码名为serializers.py,位置是 c:\your-installation-dir\spark-2.0.2-bin-hadoop-2.7\python\pyspark\ ,下面的行将被替换为第381行 .

    cls = _old_namedtuple(*args, **kwargs, verbose=False, rename=False, module=None)
    

    And then run pyspark into your command line this will work..

  • 1

    我想扩展Indrajeet的答案,因为他提到行号而不是代码的确切位置 . 除了他的回答之外,请参阅此内容以进一步澄清 .

    cls = _old_namedtuple(* args,** kwargs)是在他的回答中引用的更改行

    def _hijack_namedtuple():
    """ Hack namedtuple() to make it picklable """
    # hijack only one time
    if hasattr(collections.namedtuple, "__hijack"):
        return
    
    global _old_namedtuple  # or it will put in closure
    
    def _copy_func(f):
        return types.FunctionType(f.__code__, f.__globals__, f.__name__,
                                  f.__defaults__, f.__closure__)
    
    _old_namedtuple = _copy_func(collections.namedtuple)
    
    def namedtuple(*args, **kwargs):
        # cls = _old_namedtuple(*args, **kwargs)
        cls = _old_namedtuple(*args, **kwargs, verbose=False, rename=False, module=None)
        return _hack_namedtuple(cls)
    

    !编辑2017年3月6日!!这确实解决了原始问题,但我认为这不会使Spark 2.1与3.6兼容,但是还有更多的冲突 . 结果我使用conda来创建一个python 35虚拟环境,它就像一个魅力 .

    (Windows,假设你有env变量)

    >conda create -n py35 python=3.5
    >activate py35 
    >pyspark
    

相关问题