2014年11月9日 星期日

[Apache Spark][教學] 應用IDEA以及Scala於Spark程式開發(圖多)


        俗話說,工欲善其事,必先利其器,對於程式開發者來說,有個好的IDE介面絕對能大幅增加開發速度以及減少不必要的錯誤.先前在玩Spark的時候([Spark] 建立第一個RDD物件,體驗in Memory Computing的威力)是使用python,自然就是以Ipython notebook為首選,可以很方便的測試和操作RDD物件.但是因為Spark的原生語言其實是Scala,python在一些功能的支援上目前還趕不上Scala,所以目前選擇Scala作為開發Spark的主要工具.


        Scala是基於Java做改良的近代程式語言,同時具備Script Language以及編譯成Java binary code的特色,可以在Jvm上面運行.Scala相較於Python,同是物件導向語言,也有便利的REPL(Real-eval-print Loop)設計可以即時與程式互動,但是比較大的差別在於scala繼承了Java特性是個強型態的語言,而且傾向使用value而非variable的方式來定義變項.

        根據上述Scala的特性,我們要找的IDE介面除了要能夠支援jvm之外,還要支援REPL,更重要的是可以在IDE中啟動Spark才能做即時的測試.根據以前玩Android的經驗,我一開始是選擇Eclipse,Eclipse的確對於Java有很好的支援,下載了Scala支援包後也可以以REPL方式來運行程式.但是缺點在於無法將Scala當成Sript的方式來操作,而且我找不到如何在Eclipse下啟動Spark的方法...囧.後來爬了一些論壇,發現Spark推薦的開發平台是IDEA,就載來玩玩,立刻就愛不釋手,主要原因在於介面和文字實在比Eclipse漂亮太多啦!可以參考操作步驟中的貼圖就可以看得出來IDEA和MAC的相容性有多好.以下我們將介紹如何使用IDEA來開發Spark程式的詳細流程,我參考相當多的網站和做法,搞了兩天才試成功QQ

1. 到Spark網站上下載Spark(安裝教學請參考:[Spark] Spark 單機版安裝教學(for mac))

2. 安裝好Spark後,進入Spark的目錄,在spark>assembly>target>scala-2.10>spark-assembly...-hadoop1.0.4.jar(檔案大小約104Mb)看看有沒有這個檔案等一下要用.
(找不到這個檔案的人可以在Spark目錄下輸入:$sudo sbt/sbt assembly,會幫你打包成jar檔)


2. 下載IDEA

3. 進入IDEA介面,進入IDEA > Preference > Plugins > Browse repositories > 搜尋“scala"和“SBT”並安裝

4. 選擇File > New Project開一個新的Scala Project ,要選擇SBT

5. 隨便取個檔名

6. 設定好相關路徑後建立.scala的檔案


7. 再來就是進入File > Project Structure設定相關連的Library

8. Library要去找剛剛在安裝scala時生成的jar檔,這邊不要選錯檔案了!!


9. 選完相關的library後,來到.scala的畫面右上角會請你設定Scala的SDK,點進去按確定就是了

10. 接著我們編寫一個基本的code,目的是呼叫Spark的系統UI
SparkContext是運行Spark的基本服務,傳入的兩個參數,“Local"代表從本機執行,"App"代表的是這次啟動的服務名稱

11. 寫好之後先設定等下執行程式時是以REPL的方式執行



12. 設定好後,將剛剛編寫的code反白按右鍵,就可以將指令送到Scala Console執行

13. 執行後應該會看到Spark服務啟動,包括SPARK的UI介面,我們可以連進去確定是否成功
14. 到這邊我們算是已經成功的透過IDEA使用Scala來啟用Spark,來測試一下是否能運行.建立一個簡單的Array,請Spark計算一下個數:




從console看來,已經建立RDD物件,同時也得到正確個數,測試OK!

後記:為了要能執行上述程式,看了超多網頁也測試了很多方法,但是都不太適合我QQ,最後東湊西湊湊出這樣的方法目前在我的環境看起來是能正確執行的,給跟我一樣苦手,不用IDE不會寫程式的人參考!





16 則留言:

  1. 請問您 IDEA 版本為?
    用目前的版本設定不太起來
    ^^

    回覆刪除
    回覆
    1. 應該是14版,但是IDEA版本和SPARK版本都與去年不太一樣了~

      刪除
  2. 即時與城市互動 ==> 打字錯誤

    回覆刪除
  3. 您好..想請教您,如果在linux(centos)設定方式也是一樣嗎??
    您的步驟我的能完成,但在第12點開始,將指令送到Scala Console執行
    以及看不到Spark服務啟動,包括SPARK的UI介面....
    是不是還有哪裡需要做設定呢??
    謝謝您

    回覆刪除
    回覆
    1. 建議您先執行spark-shell看看spark是否能夠正常使用

      刪除
    2. 在command line spark-shell是可以執行的進的去到「scala>」,也看的到spark的那個畫面,spark UI也出的來
      唯有在idea時將指令傳到spark時,服務不會帶起來...

      刪除
    3. 看一下啟動spark context的時候 master的路徑和port有沒有設對,或是設定為localhost看看

      刪除
  4. Bryan大大,謝謝您那麼耐心的回答,我是透過idea時才無法看到UI的網頁,但是如果單獨開啓spark-shell那個網頁是看的到的
    如果port跟路徑沒設對的話是不是應該連網頁都看不到?剛入門的新手問題很多,不好意思..

    回覆刪除
    回覆
    1. 你是透過idea的shell嗎? 還是透過程式呼叫
      可以請您提供相關的畫面會比較好回覆~謝謝

      刪除
    2. https://drive.google.com/open?id=0B4VO-YWNuHIQTVJRZzNrR3gteUk

      我是照著你上面的方法,那應該是透過idea shell對吧~當我按下去send selection to scala console 就是無法把spark服務啓動

      刪除
    3. 沒有權限看圖喔~
      不過我後來自己也不太使用這種方法了...哈

      刪除
  5. 是哦~~Bryan大大那你有什麼推的方式嗎?可以讓我這個初學者容易上手的
    目前只會用:load的方式,想說如果可以用IDE直接呼叫,應該會比較方便

    回覆刪除
    回覆
    1. 如果要用互動介面的話建議直接從spark-shell進去比較方便
      或者改用pyspark XD

      刪除