1. 程式人生 > >Spark在Windows下的環境搭建

Spark在Windows下的環境搭建

[] 特定 features 千萬 安裝目錄 standard har java test load

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

一.JDK的安裝與環境變量的設置

1.1 JDK的安裝

  JDK(全稱是JavaTM Platform Standard Edition Development Kit)的安裝,下載地址是Java SE Downloads,一般進入頁面後,會默認顯示一個最新版的JDK,如下圖所示,當前最新版本是JDK 8,更為詳細具體的地址是Java SE Development Kit 8 Downloads:

技術分享圖片

  上圖中兩個用紅色標記的地方都是可以點擊的,點擊進去之後可以看到這個最新版本的一些更為詳細的信息,如下圖所示:

技術分享圖片

  首先,這裏主要包含有8u101和8u102這兩個版本,Java給出的官方說明是:

“Java SE 8u101 includes important security fixes. Oracle strongly recommends that all Java SE 8 users upgrade to this release. Java SE 8u102 is a patch-set update, including all of 8u101 plus additional features (described in the release notes). ”

  也就是說Java推薦所有開發人員從以前的版本升級到JDK 8u101,而JDK 8u102則除了包括101的所有特性之外,還有一些其他的特性。對於版本的選擇,自行選擇就好了,其實對於普通開發人員來說,體現不了太大的區別,我這裏就是使用的JDK 8u101版本。

  選好8u101版本後,再選擇你的對應開發平臺,由於我的機器是64位的,所以我這裏選擇Windows64位的版本。記得在下載之前,必須要接受上方的許可協議,在上圖中用紅色圈出。
  
  除了下載最新版本的JDK,也可以在Oracle Java Archive下載到歷史版本的JDK,但官方建議只做測試用。
  
  JDK在windows下的安裝非常簡單,按照正常的軟件安裝思路去雙擊下載得到的exe文件,然後設定你自己的安裝目錄(安裝目錄在設置環境變量的時候需要用到)即可。

  

1.2 環境變量的設置

  接下來設置相應的環境變量,設置方法為:在桌面右擊【計算機】--【屬性】--【高級系統設置】,然後在系統屬性裏選擇【高級】--【環境變量】,然後在系統變量中找到“Path”變量,並選擇“編輯”按鈕後出來一個對話框,可以在裏面添加上一步中所安裝的JDK目錄下的bin文件夾路徑名,我這裏的bin文件夾路徑名是:F:\Program Files\Java\jdk1.8.0_101\bin,所以將這個添加到path路徑名下,註意用英文的分號“;”進行分割。這樣設置好後,便可以在任意目錄下打開的cmd命令行窗口下運行

java -version
  • 1

觀察是否能夠輸出相關java的版本信息,如果能夠輸出,說明JDK安裝這一步便全部結束了。

  全部流程如下圖所示(後續軟件安裝的系統變量設置都是這套流程):
技術分享圖片

1.3 一些題外話

 
  這裏講兩句題外話,各位看官不關心的話可以跳過這裏,不影響後續的安裝步驟。
  在軟件安裝的時候,相信各位沒少遇到過環境變量和系統變量,所以這裏就來扒一扒令人頭疼的PATH, CLASSPATH和JAVA_HOME等參數的具體含義。

1.3.1 環境變量、系統變量和用戶變量

  • 環境變量包括系統變量和用戶變量
  • 系統變量的設置針對該操作系統下的所有用戶起作用;
  • 用戶變量的設置只針對當前用戶起作用

如果對這些概念還不是特別熟悉的,建議先看完下面幾個點之後,再回過頭來看這三句話。

1.3.2 PATH

  也就是上一步設置的系統變量,告訴操作系統去哪裏找到Java.exe的執行路徑,當你在命令行窗口冷不丁的敲上如下命令的時候,

java -version
  • 1

操作系統首先會一驚,What the hell does “java” mean? 不過吐槽歸吐槽,活還是得幹,於是悠悠的記起來了蓋茨爸爸說過的三句話:

  1. 當你看不懂命令行窗口中的一個命令的時候,你首先去你所在的當前目錄下找找,是否有這個命令的.exe程序?如果有,那就用它來啟動執行;
  2. 如果沒有,千萬別放棄,記得要去Path系統變量下的那些目錄下去找一找,如果找到了,啟動並執行命令;
  3. 如果上面兩個地方依然還沒找到,那你就撒個嬌,報個錯好了。

所以我們將JDK安裝目錄下的bin文件夾添加到Path系統變量的目的也就在這裏,告訴操作系統:如果在當前目錄下找不到java.exe,就去Path系統變量裏的那些路徑下挨個找一找,直到找到java.exe為止。那為什麽要設置bin文件夾,而不是JDK安裝的根目錄呢?原因就在於根目錄下沒有java.exe啊,只有bin文件夾下才有啊餵……

如果只是在命令行窗口下運行一下java的命令,那其實也可以不設置系統變量,只是每次在命令行窗口運行java的命令時,都必須帶上一長串路徑名,來直接指定java.exe的位置,如下所示。

C:\Users\weizierxu>F:\Program Files\Java\jdk1.8.0_101\bin\java.exe -version
‘F:\Program‘ 不是內部或外部命令,也不是可運行的程序
或批處理文件。
  • 1
  • 2
  • 3

註意:這裏報錯的原因並不是說直接指定java.exe的路徑名這種方式有問題,而是命令行下無法解析帶有空格的路徑名,所以需要用到雙引號,如下:

C:\Users\weizierxu>"F:\Program Files"\Java\jdk1.8.0_101\bin\java.exe -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
  • 1
  • 2
  • 3
  • 4

1.3.3 CLASSPATH

  CLASSPATH是在Java執行一個已經編譯好的class文件時,告訴Java去哪些目錄下找到這個class文件,比如你的程序裏用到某個Jar包(Jar包裏的都是已經編譯好的class文件),那麽在執行的時候,Java需要找到這個Jar包才行,去哪找呢?從CLASSPATH指定的目錄下,從左至右開始尋找(用分號區分開的那些路徑名),直到找到你指定名字的class文件,如果找不到就會報錯。這裏做一個實驗,就能明白具體是什麽意思了。
  首先,我在F:\Program Files\Java目錄下,利用Windows自帶的記事本寫了一個類似於Hello World的程序,保存為testClassPath.java文件(註意後綴名得改成java),內容如下:

public class testClassPath{
    public static void main(String[] args){
        System.out.println("Hello, this is a test on CLASSPATH!");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5

然後,我將cmd的當前目錄切換到(通過cd命令)F:\Program Files\Java目錄下,然後用javac命令來對這個.java文件進行編譯,如下圖所示:
技術分享圖片

從上圖中可以看到,javac命令可以正常使用(沒有任何輸出的就表明正確編譯了),這是因為執行該命令的javac.exe同樣存在於JDK安裝路徑下的bin目錄中,而這個目錄我們已經添加到Path系統變量中去了,所以cmd能夠認識這個命令。這個時候可以看到F:\Program Files\Java目錄下多了一個testClassPath.class文件。不過運行這個class文件的時候,報錯了。這個時候,CLASSPATH就派上用場了,和1.2節中對Path系統變量設置的方法一樣,這裏在CLASSPATH(如果系統變量的列表中沒有CLASSPATH這個選項,那麽點擊新建,然後添加路徑即可)中最後面添加上;.,英文的分號表示和前面已有的路徑分割開,後面的小點.表示當前目錄的意思。
這個時候記得要另起一個新的cmd窗口,然後利用cd命令切換到testClassPath.class所在目錄,然後再去執行,便可以成功得到結果了。

F:\Program Files\Java>java testClassPath
Hello, this is a test on CLASSPATH!
  • 1
  • 2

  因此,和Path變量不同的是,Java在執行某個class文件的時候,並不會有默認的先從當前目錄找這個文件,而是只去CLASSPATH指定的目錄下找這個class文件,如果CLASSPATH指定的目錄下有這個class文件,則開始執行,如果沒有則報錯(這裏有去當前目錄下找這個class文件,是因為當前路徑通過.的方式,已經添加到了CLASSPATH系統變量中)。
  上面講的指定CLASSPATH系統變量的方法,都是直接寫死在系統變量中的,為了避免造成幹擾(比如多個同名class文件存在於多個路徑中,這些路徑都有添加到CLASSPATH系統變量中,由於在找class文件的時候,是從左往右掃描CLASSPATH系統變量中的路徑的,所以在利用java testClassPath方法執行的時候,運行的便是位置在CLASSPATH系統變量中最左邊的那個路徑中,對應的class文件,而這顯然不是我們想要的結果),因此在諸如Eclipse等等這些IDE中,並不需要人為手動設定CLASSPATH系統變量,而是只設定當前程序的特定的CLASSPATH系統變量,這樣便不會影響到其他程序的運行了。

1.3.4 JAVA_HOME

JAVA_HOME並不是Java本身所需要的參數,而是其他的一些第三方工具需要這個參數來配置它們自己的參數,它存在的意義無非是告訴那些軟件,我的JDK安裝在這個目錄下,你如果要用到我的Java程序的話,直接來我這個目錄下找就好了,而JAVA_HOME就是JDK的安裝路徑名。比如我的JDK安裝在F:\Program Files\Java\jdk1.8.0_101目錄下(註意該目錄下的bin目錄,就是在1.3.2節裏Path系統變量中要添加的值),那麽JAVA_HOME裏要添加的值便是F:\Program Files\Java\jdk1.8.0_101,以後碰到類似HOME的系統變量,都是軟件的安裝目錄。

二. 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,點擊圖中箭頭所指,下載即可:

技術分享圖片

  下載得到Scala的msi文件後,可以雙擊執行安裝。安裝成功後,默認會將Scala的bin目錄添加到PATH系統變量中去(如果沒有,和JDK安裝步驟中類似,將Scala安裝目錄下的bin目錄路徑,添加到系統變量PATH中),為了驗證是否安裝成功,開啟一個新的cmd窗口,輸入scala然後回車,如果能夠正常進入到Scala的交互命令環境則表明安裝成功。如下圖所示:
技術分享圖片
如果不能顯示版本信息,並且未能進入Scala的交互命令行,通常有兩種可能性:
- Path系統變量中未能正確添加Scala安裝目錄下的bin文件夾路徑名,按照JDK安裝中介紹的方法添加即可。
- Scala未能夠正確安裝,重復上面的步驟即可。

三. Spark的安裝

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

  • 選擇好對應Hadoop版本的Spark版本,如下圖中所示;
  • 然後點擊下圖中箭頭所指的spark-1.6.2-bin-hadoop2.6.tgz,等待下載結束即可。

技術分享圖片

  這裏使用的是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’文件。

技術分享圖片
  
  下載並解壓到指定目錄,然後到環境變量部分設置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-shell命令後,Spark開始啟動,並且輸出了一些日誌信息,大多數都可以忽略,需要註意的是兩句話:

Spark context available as sc.
SQL context available as sqlContext.
  • 1
  • 2

Spark contextSQL 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
  • 1

設置好後,建議使用PyCharm作為IDE(因為IDEA IntelliJ的設置繁瑣很多,沒耐心了設置一堆參數啦,哈哈哈)

六. 小結

  至此,基本的Spark本地調試環境便擁有了,對於初步的Spark學習也是足夠的。但是這種模式在實際的Spark開發的時候,依然是不夠用的,需要借助於一個比較好用的IDE來輔助開發過程。下一講就主要講解ItelliJ IDEA以及Maven的配置過程。

七. 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問題)

Spark在Windows下的環境搭建