无法运行pyspark

时间:2017-02-20 16:45:30

标签: pyspark

我在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 个答案:

答案 0 :(得分:28)

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

conda create -n py35 python=3.5 anaconda
activate py35

答案 1 :(得分:20)

Spark< = 2.1.0与Python 3.6不兼容。请参阅this issue,其中还声称将在即将发布的Spark版本中修复此问题。

答案 2 :(得分:10)

我使用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)

然后将pyspark运行到您的命令行中,这将有效..

答案 3 :(得分:3)

我想扩展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

答案 4 :(得分:1)

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

所以,

  1. 检查路径是否为火花,即/ usr / local / spark正确与否。
  2. 将Python Path设置为Python 2.x(删除Python 3.x)。