我在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'
我在这里做错了什么?
答案 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的答案,因为他提到行号而不是代码的确切位置。除了他的回答之外,请参阅此内容以进一步澄清。
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。
所以,