2015年1月17日 星期六

[Apache Spark][教學] Spark x Docker x ipython Notebook !(一)-Docker + Spark安裝篇

圖片來源:http://www.docker.com/
       
        文章開頭先感謝前輩們的貢獻:http://philipzheng.gitbooks.io/docker_practice/.Docker是今年非常火紅的技術,可以透過輕量化虛擬container來實現系統或程式的部屬配置.我們在實物開發上常遇到的問題是,開發環境和正式環境彼此存在著差異,來來回回把程式搬到正式環境上執行是非常花時間的事情.Docker透過輕量化虛擬技術讓開發者可以很輕易地將程式放到模擬出來的正式環境執行,測試,減低了很多開發上的時間成本.同時Docker可以保證開發環境的一致性,如果不小心掛掉,簡單重啟一個就好,也節省很多維護的時間.
        我們可以在Docker上run Hadoop或Spark,把寫好的程式丟到上面執行,但是有沒有辦法直接在Docker的模擬出來的環境上開發spark程式,而且還是透過方便又強大的IDE介面(你當然也可以直接開vim寫,但是不在討論範圍內XD)?本文要介紹如何在Docker上面運行spark,並且透過ipython notebook來編輯,並以互動式方式來使用Spark.

  •         安裝Docker
    https://www.docker.com
    MAC請走這邊:https://docs.docker.com/installation/mac/
    因為Docker是linux的程式,所以mac無法直接執行docker,而是會透過boot2docker先模擬一個linux環境,在其中執行Docker
  • 安裝好後點擊他會進入linux的環境,可以看到第二行顯示了啟動的是一個vm
  • Docker的概念和一般VM的差異在於是以執行的APP為主,不會需要為了每個APP模擬一個OS,所以可以大量節省系統資源
  • 當我們要建立自己的vm時,不需要從頭自己設定,Docker User可以把建立好的VM(又稱為image)放到網路上的Docker Repositories讓大家下載(https://docs.docker.com/docker-hub/repos/)
  • 像Spark那麼火紅的科技,一定有大大已經作好放在上面了(https://github.com/sequenceiq/docker-spark
  • 我們首先先把image檔拉下來
    docker pull sequenceiq/spark:1.2.0
  • 然後run他
    docker run -i -t -h sandbox sequenceiq/spark:1.2.0 bash
  • 這樣就會進入這個映像檔中(互動式介面)
  • 在這裡運行spark也是沒問題的
  • 不過這個環境是給spark用的,所以python不但是舊版的,甚至也沒有easy_install,更不用說python了.
  • 接著我們將在下一篇介紹如何在container中建立python的環境
  • 直接看下一集:[Spark][教學] Spark x Docker x ipython Notebook !(二)-Python安裝設定篇


7 則留言:

  1. 不好意思,一直打擾你。
    我用 lines = sc.textFile("...") 讀檔完後,執行action, 像是 lines.count(),
    一直會出現 Py4JJavaError, 我一直找不出原因。
    截圖連結如下,
    https://db.tt/6Xihjf1m
    https://db.tt/EUAhVQxz
    https://db.tt/KNNo308x
    謝謝~

    回覆刪除
  2. 查不到什麼確切的原因會發生@@ 那如果你操作其他的RDD操作呢?
    像是自己產生陣列,不透過讀取檔案的方式來操作RDD試試看
    看是不是讀取檔案的問題

    回覆刪除
  3. 如果用其他RDD操作,像是lines.first(),也是會出現一樣問題。如果改用別的方式產生RDD,像是parallelize然後再操控RDD的話就不會出現錯誤。有可能是讀檔textFile那邊出錯,請問我指令有打錯嗎:lines = sc.textFile("/usr/local/spark/README.md")?
    謝謝

    回覆刪除
    回覆
    1. 不是指令的問題,看起來是PYTHON在CALL JAVA的時候發生了問題

      刪除
    2. 如果你的檔案放在local(非HDFS)上的話,
      試試看改成sc.textFile("file:///usr/local/spark/README.md")

      刪除
  4. 改成 lines = sc.textFile("file:///usr/local/spark/README.md"), 終於可以順利的讀取檔案.
    執行 lines.count() 也順利跑出來, 但執行 lines.first() 卻又出現相同問題,
    錯誤截圖 : https://db.tt/AftW8FBt
    非常感激答覆~

    回覆刪除
    回覆
    1. 超怪的啊啊!!
      錯誤訊息顯示RDD is empty...
      上一行才讀進來,怎麼馬上就empty了XD

      刪除