天天看點

Spark在Windows下的環境搭建

由于Spark是用Scala來寫的,是以Spark對Scala肯定是原生态支援的,是以這裡以Scala為主來介紹Spark環境的搭建,主要包括四個步驟,分别是:JDK的安裝,Scala的安裝,Spark的安裝,Hadoop的下載下傳和配置。為了突出”From Scratch”的特點(都是标題沒選好的緣故),是以下面的步驟稍顯有些啰嗦,老司機大可不必閱讀,直接跳過就好。 

這裡我省略掉了jdk的安裝和配置。

二. Scala的安裝

  首先從DOWNLOAD PREVIOUS VERSIONS下載下傳到對應的版本,在這裡需要注意的是,Spark的各個版本需要跟相應的Scala版本對應,比如我這裡使用的Spark 1.6.2就隻能使用Scala 2.10的各個版本,目前最新的Spark 2.0就隻能使用Scala 2.11的各個版本,是以下載下傳的時候,需要注意到這種Scala版本與Spark版本互相對應的關系。我這裡現在用的是Scala 2.10.6,适配Spark從1.3.0到Spark 1.6.2之間的各個版本。在版本頁面DOWNLOAD PREVIOUS VERSIONS選擇一個适合自己需要的版本後,會進入到該版本的具體下載下傳頁面,如下圖所示,記得下載下傳二進制版本的Scala,點選圖中箭頭所指,下載下傳即可:

Spark在Windows下的環境搭建
下載下傳得到Scala的msi檔案後,可以輕按兩下執行安裝。安裝成功後,預設會将Scala的bin目錄添加到PATH系統變量中去(如果沒有,和JDK安裝步驟中類似,将Scala安裝目錄下的bin目錄路徑,添加到系統變量PATH中),為了驗證是否安裝成功,開啟一個新的cmd視窗,輸入​

​scala​

​然後回車,如果能夠正常進入到Scala的互動指令環境則表明安裝成功。如下圖所示:
Spark在Windows下的環境搭建

如果不能顯示版本資訊,并且未能進入Scala的互動指令行,通常有兩種可能性: 

- Path系統變量中未能正确添加Scala安裝目錄下的bin檔案夾路徑名,按照JDK安裝中介紹的方法添加即可。 

- Scala未能夠正确安裝,重複上面的步驟即可。

三. Spark的安裝

  Spark的安裝非常簡單,直接去Download Apache Spark。有兩個步驟:

  • 選擇好對應Hadoop版本的Spark版本,如下圖中所示;
  • 然後點選下圖中箭頭所指的​

    ​spark-1.6.2-bin-hadoop2.6.tgz​

    ​,等待下載下傳結束即可。
Spark在Windows下的環境搭建

這裡使用的是Pre-built的版本,意思就是已經編譯了好了,下載下傳來直接用就好,Spark也有源碼可以下載下傳,但是得自己去手動編譯之後才能使用。下載下傳完成後将檔案進行解壓(可能需要解壓兩次),最好解壓到一個盤的根目錄下,并重命名為​

​Spark​

​,簡單不易出錯。并且需要注意的是,在Spark的檔案目錄路徑名中,不要出現空格,類似于“Program Files”這樣的檔案夾名是不被允許的。

  解壓後基本上就差不多可以到cmd指令行下運作了。但這個時候每次運作spark-shell(spark的指令行互動視窗)的時候,都需要先​

​cd​

​到Spark的安裝目錄下,比較麻煩,是以可以将Spark的bin目錄添加到系統變量PATH中。例如我這裡的Spark的bin目錄路徑為​

​D:\Spark\bin​

​,那麼就把這個路徑名添加到系統變量的PATH中即可,方法和JDK安裝過程中的環境變量設定一緻,設定完系統變量後,在任意目錄下的cmd指令行中,直接執行​

​spark-shell​

​指令,即可開啟Spark的互動式指令行模式。

四.HADOOP下載下傳

  系統變量設定後,就可以在任意目前目錄下的cmd中運作spark-shell,但這個時候很有可能會碰到各種錯誤,這裡主要是因為Spark是基于Hadoop的,是以這裡也有必要配置一個Hadoop的運作環境。在Hadoop Releases裡可以看到Hadoop的各個曆史版本,這裡由于下載下傳的Spark是基于Hadoop 2.6的(在Spark安裝的第一個步驟中,我們選擇的是​

​Pre-built for Hadoop 2.6​

​),我這裡選擇2.6.4版本,選擇好相應版本并點選後,進入詳細的下載下傳頁面,如下圖所示,選擇圖中紅色标記進行下載下傳,這裡上面的src版本就是源碼,需要對Hadoop進行更改或者想自己進行編譯的可以下載下傳對應src檔案,我這裡下載下傳的就是已經編譯好的版本,即圖中的’hadoop-2.6.4.tar.gz’檔案。

Spark在Windows下的環境搭建

下載下傳并解壓到指定目錄,然後到環境變量部分設定HADOOP_HOME為Hadoop的解壓目錄,我這裡是​

​F:\Program Files\hadoop​

​,然後再設定該目錄下的bin目錄到系統變量的PATH下,我這裡也就是​

​F:\Program Files\hadoop\bin​

​,如果已經添加了HADOOP_HOME系統變量,也可以用​

​%HADOOP_HOME%\bin​

​來指定bin檔案夾路徑名。這兩個系統變量設定好後,開啟一個新的cmd,然後直接輸入​

​spark-shell​

​指令。

  正常情況下是可以運作成功并進入到Spark的指令行環境下的,但是對于有些使用者可能會遇到空指針的錯誤。這個時候,主要是因為Hadoop的bin目錄下沒有winutils.exe檔案的原因造成的。這裡的解決辦法是: 

   

- 去 https://github.com/steveloughran/winutils 選擇你安裝的Hadoop版本号,然後進入到bin目錄下,找到​

​winutils.exe​

​檔案,下載下傳方法是點選​

​winutils.exe​

​檔案,進入之後在頁面的右上方部分有一個​

​Download​

​按鈕,點選下載下傳即可。 

- 下載下傳好​

​winutils.exe​

​後,将這個檔案放入到Hadoop的bin目錄下,我這裡是​

​F:\Program Files\hadoop\bin​

​。 

- 在打開的cmd中輸入 

​ F:\Program Files\hadoop\bin\winutils.exe chmod 777 /tmp/hive  ​

這個操作是用來修改權限的。注意前面的​

​F:\Program Files\hadoop\bin​

​部分要對應的替換成實際你所安裝的bin目錄所在位置。

  經過這幾個步驟之後,然後再次開啟一個新的cmd視窗,如果正常的話,應該就可以通過直接輸入​

​spark-shell​

​來運作Spark了。 

正常的運作界面應該如下圖所示:

Spark在Windows下的環境搭建

從圖中可以看到,在直接輸入​

​spark-shell​

​指令後,Spark開始啟動,并且輸出了一些日志資訊,大多數都可以忽略,需要注意的是兩句話:

Spark context available as sc.
SQL context available as sqlContext.      

​Spark context​

​和​

​SQL context​

​分别是什麼,後續再講,現在隻需要記住,隻有看到這兩個語句了,才說明Spark真正的成功啟動了。

五. Python下的PySpark

  針對Python下的Spark,和Scala下的spark-shell類似,也有一個PySpark,它同樣也是一個互動式的指令行工具,可以對Spark進行一些簡單的調試和測試,和spark-shell的作用類似。對于需要安裝Python的來說,這裡建議使用Python(x,y),它的優點就是集合了大多數的工具包,不需要自己再單獨去下載下傳而可以直接import來使用,并且還省去了繁瑣的環境變量配置,下載下傳位址是Python(x,y) - Downloads,下載下傳完成後,輕按兩下運作安裝即可。因為本教程主要以Scala為主,關于Python的不做過多講解。 

  并且,pyspark的執行檔案和spark-shell所在路徑一緻,按照上述方式解壓好spark後,可以直接在cmd的指令行視窗下執行pyspark的指令,啟動python的調試環境。 

  但是如果需要在python中或者在類似于IDEA IntelliJ或者PyCharm等IDE中使用PySpark的話,需要在系統變量中建立一個​

​PYTHONPATH​

​的系統變量,然後

PATHONPATH=%SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-0.10.4-src.zip      

六. 小結

七. Tips

  • 血的教訓:永遠不要在軟體的安裝路徑中留有任何的空格
  • 網上找Hadoop 2.7.2的winutils.exe找不到的時候,直接用2.7.1的winutils.exe,照樣能用 

     (2017.06.14更新) 

參考

  • PATH and CLASSPATH(Oracle官方給出的一些關于Path和CLASSPATH的解釋,推薦)
  • Difference among JAVA_HOME,JRE_HOME,CLASSPATH and PATH
  • Java中設定classpath、path、JAVA_HOME的作用
  • Why does starting spark-shell fail with NullPointerException on Windows?(關于如何解決啟動spark-shell時遇到的NullPointerException問題)