Spark在Windows下的環境搭建

來源:互聯網
上載者:User

標籤:static   jdk1.8   out   分割   目前的目錄   enc   recommend   add   archive   

由於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 -versionjava 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 testClassPathHello, 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的命令列環境下的,但是對於有些使用者可能會遇到null 指標的錯誤。這個時候,主要是因為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下的環境搭建

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.