1. 程式人生 > >Spark本地安裝與配置

Spark本地安裝與配置

  由於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 一些題外話

  
  這裡講兩句題外話,各位看官不關心的話可以跳過這裡,不影響後續的安裝步驟。 
  在軟體安裝的時候,相信各位沒少遇到過環境變數和系統變數,所以這裡就來扒一扒令人頭疼的PATHCLASSPATHJAVA_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的安裝

  • 選擇好對應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的互動式命令列模式。

從圖中可以看到,在直接輸入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更新) 

參考