2017-02-20 111 views
7

我在Windows上安裝了Spark,但無法啓動pyspark。當我輸入c:\Spark\bin\pyspark時,出現以下錯誤:無法運行pyspark

Python 3.6.0 |Anaconda custom (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. Traceback (most recent call last): File "c:\Spark\bin..\python\pyspark\shell.py", line 30, in import pyspark File "c:\Spark\python\pyspark__init__.py", line 44, in from pyspark.context import SparkContext File "c:\Spark\python\pyspark\context.py", line 36, in from pyspark.java_gateway import launch_gateway File "c:\Spark\python\pyspark\java_gateway.py", line 31, in from py4j.java_gateway import java_import, JavaGateway, GatewayClient File "", line 961, in _find_and_load File "", line 950, in _find_and_load_unlocked File "", line 646, in _load_unlocked File "", line 616, in _load_backward_compatible File "c:\Spark\python\lib\py4j-0.10.4-src.zip\py4j\java_gateway.py", line 18, in File "C:\Users\Eigenaar\Anaconda3\lib\pydoc.py", line 62, in import pkgutil File "C:\Users\Eigenaar\Anaconda3\lib\pkgutil.py", line 22, in ModuleInfo = namedtuple('ModuleInfo', 'module_finder name ispkg') File "c:\Spark\python\pyspark\serializers.py", line 393, in namedtuple cls = _old_namedtuple(*args, **kwargs) TypeError: namedtuple() missing 3 required keyword-only arguments: 'verbose', 'rename', and 'module'

我在做什麼錯在這裏?

+0

我能說出幾件事情,你做錯了 - _(1)_你格式化你的日誌條目爲「塊引用」(用於引用純文本文檔,如)而不是「代碼樣本」; _(2)_你沒有提及你已經安裝的Spark版本:_(3)_你甚至沒有嘗試谷歌spark類型錯誤:namedtuple()缺少3個必需的關鍵字參數, //issues.apache.org/jira/browse/SPARK-19019作爲最佳答案。 –

+0

請儘量在回溯中保留行結束,以使其遠程可讀。 – Eric

回答

7

Spark < = 2.1.0與Python 3.6不兼容。請參閱this issue,它也聲稱這將在即將發佈的Spark版本中得到修復。

+0

我有同樣的問題!之前我並不知道Spark 2.1.0與Python 3.6不兼容。 – titipata

+0

Spark-2.2.0與Python-3.6兼容。任何想法 ? – JKC

+0

@JKC根據相關問題,2.2.0應該工作得很好,2.1.1也是如此。 – karlson

6

我在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到您的命令行本將工作..

+1

這解決了這個問題,下面只是更多的解釋,隨時編輯這些信息來完成你的答案。 –

+1

這解決了最初的問題,但我相信依賴關係要複雜得多,這隻能解決許多碰撞中的第一個。 –

2

我想延長Indrajeet的答案,因爲他提到行號而不是代碼的確切位置。除了他的回答外,請參閱此處以獲得進一步的說明。

CLS = _old_namedtuple(*指定參數時,** 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變量)的不給予適當的路徑或通過使用Python 3.X運行星火

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

Hi @ D.S。我按照你的建議爲python = 3.5創建了一個新的環境,但是當我進入pyspark時,即使我已經正確設置了spark_home和pythonpath環境變量,我得到了錯誤「pyspark不被識別爲內部或外部命令」。有關如何解決此問題的任何輸入? – JKC

+0

這是一段時間了,但我意識到它不值得在windows上做這個工作,所以我使用Ubuntu映像設置了virtualbox,並且我的工作移動得更快。我知道這並不能解決你的直接問題,但如果你開關,你將可以節省更多的時間來對抗這種惱人的衝突。 –

0

在Windows上運行星火當面對可能存在的問題是,。

所以,

  1. 做檢查鑑於火花即在/ usr /本地路徑/火花合適。
  2. 將Python Path設置爲Python 2.x(移除Python 3.x)。
13

Spark 2.1.0不支持python 3.6.0。 解決這個問題在anaconda環境中改變你的python版本。 運行在您的蟒蛇ENV以下命令

conda create -n py35 python=3.5 anaconda 
activate py35