閱讀253 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Spark的那些外部框架

Spark Package

  要使用Spark庫,你首先必須了解的東西是Spark package。它有點像Spark的包管理器。當你給Spark集群提交job時,你可以到存放Spark package的網站下載任何package。所有package都存放在這個站點。
  https://spark-packages.org/
  當你想用一個Spark package時,可以在spark-submit命令或者spark- shell命令中增加包選項:

$ $Spark_HOME/bin/Spark-shell \
    -packages com.databricks:Spark-avro_2.10:2.0.1

  如果使用了--packages選項,Spark package就會自動把它的JAR包添加到你指定的路徑下。你不僅能在Spark集群上使用社區的庫,還能到公開發布自己的庫。如果要把一個Spark package發布到這個托管服務下,必須遵守下列規則:

  • 源代碼必須放在Github上。
  • 代碼庫的名字必須與包名相同。
  • 代碼庫的主分支必須有README.md文件,在根目錄下必須有LICENSE文件。

換句話說,你不需要編譯自己的package。即使你用Spark Packages的模板,編譯、發布以及版本更新都將由這項服務完成。sbt插件sbt-spark-package(https://github.com/databricks/sbt-spark-packages)對於生成package也非常有用。如果要在你的項目中包含此插件,請務必在sbt項目的project/plugins.sbt文件中寫入下麵的代碼:

resolvers += "bintray-Spark-packages" at "https://dl.bintray.com/
Spark-packages/maven/"
    addSbtPlugin("org.Spark-packages" % "sbt-Spark-packages" % "0.2.3")

  發布Spark包時必須提供如下信息,應該把它們寫到build.sbt中:

  • spName——package的名稱。
  • sparkVersion——package所依賴的Spark版本。
  • sparkComponents——package所依賴的Spark組件列表,例如SQL、MLlib。
  • spShortDescription——package的一句話描述。
  • spDescription——關於package的完整描述。
  • spHomePage——用於描述package的Web頁麵的URL。

上述6項是你在發布package之前需要提供的信息。一定要發布到package的代碼庫的主分支上。你可以使用Spark package的托管站點(https://spark- packages.org/)的Web UI來完成這項工作。
            圖片描述
  在Spark package站點上注冊了Github賬號後,可以從“name”下拉菜單中選擇你的代碼庫。
             圖片描述
  上麵的簡短描述和主頁最好與build.sbt中的描述和主頁URL一致。一旦你提交了package,驗證過程就開始了。這個過程通常需要幾分鍾。當驗證完成後,你會收到一封郵件,告訴你驗證是否成功。如果成功,就可以用前麵描述的--package選項下載你的package了。截至2015年11月,Spark package站點上已經有153個package了。下一節將介紹一些庫,它們也是支持Spark package形式的,即它們也以Spark package格式分發。

XGBoost

  XGBoost是一個專用於分布式框架的優化庫。這個框架由DMLC(Distributed Machine Learning Community,分布式機器學習社區)開發。顧名思義,在DMLC項目下有許多機器學習庫,它們在Hadoop和Spark等已有資源上具有高擴展性。XGBoost是基於Gradient Boosting(梯度提升)算法的。決策樹提升算法(Tree Boosting)是一種用於分類的集成學習(ensemble learning)算法,它組合使用了決策樹與提升算法,是一種輕量而快速的分類算法。關於樹集成及樹提升算法在此就不展開講述了,它們都是簡單高效的算法:https://xgboost.readthedocs.org/ en/latest/model.html。
  雖然當前XGBoost還不能與Spark集成,但是XGBoost的名氣使得Spark社區開發了XGBoost的Spark package:https://Spark-packages.org/package/ rotationsymmetry/Sparkxgboost/。
  盡管XGBoost核心開發組不支持這個package,你還是可以使用sparkxgboost包體驗一下在Spark上的XGBoost的實現。

spark-jobserver

  提交job的流程需要改進,因為對於非工程師來說,這項工作有點難。你需要理解如何用命令行或者其他UNIX命令去提交Spark job。Spark項目現在是使用CLI來提交job的。spark-jobserver提供了一個RESTful API來管理提交到Spark集群的job。因此,這意味著可以在企業內部環境中將Spark作為一個服務啟動。最簡單的使用spark-observer的方法就是啟動一個為之準備的Docker容器。如果你的筆記本上已經有了Docker環境,你需要做的就是輸入下麵的命令:

$ docker run -d -p 8090:8090\
    velvia/spark-jobserver:0.5.2-SNAPSHOT

  執行這條命令,spark-jobserver的Docker鏡像將被下載,它會在Docker上啟動spark-jobserver作為守護進程。可以通過8090端口查看這個服務器的狀態。啟動之後,可以看到下圖所示的Web UI。
              圖片描述
  雖然這個界麵很簡單,但它為管理job提供了足夠的信息。job服務器的後台是帶有一個本地executor的Spark集群,它有4個線程運行在這個Docker容器配置下。不過對於你的生產環境而言,這樣的配置可能遠遠不夠。現在,假設你的job已經通過REST API發送。在spark-jobserver項目目錄下有一個著名的單詞計數例子。下載這個例子的源碼後,用sbt命令編譯。如果你的筆記本上沒有sbt,請參照https://www.scala-sbt.org/。

$ git clone \
    https://github.com/spark-jobserver/Spark-jobserver.git
$ cd spark-jobserver
$ sbt job-server-tests/package
# You can build test package as a jar format under
# job-server-tests/target/scala-2.10/job-server-
# tests2_2.10-0.6.1-SNAPSHOT.jar, though version number
# might be a little bit different

  運行一個job,其過程如下:
  (1)上傳應用的JAR文件。
  (2)選擇運行在spark-jobserver上的主類。
  提交job時不需要每次都編寫Spark應用或者編譯它,即使你想與其他人共享。spark-jobserver會對如下對象持久化:

  • job狀態
  • job配置
  • JAR

因此,一旦你設置了這些信息,就不需要再次重新上傳。重要的是,可以通過spark-jobserver與同事共享你的應用的代碼。可以用curl命令進行上傳:

$ curl --data-binary @job-server-test/target/scala-2.10/job-server-
tests_2.10.0.6.1-SNAPSHOT.jar \
    https://<Your Docker Host IP>:8090/jars/test
$ curl 'https://<Your Docker Host IP>:8090/jars'
    {
      "tests" : "2015-11-12T02:26:50.069-05:00"
    }

  如果收到上麵信息,就可以上傳你的JAR。現在,是時候用輸入數據啟動你的應用了。

$ curl -d "input.string = takeshi nobita dora suneo suneo nobita" '
https://<Your Docker Host IP>:8090/jobs?appName=test&classPath=spark.
jobserver.WordCountExample'
$ curl 'https://<Your Docker Host IP>:8090/jobs'
    {
     "duration": "0.448 secs", 
     "classPath": "spark.jobserver.WordCountExample", 
     "startTime": "2015-11-12T03:01:12.362-05:00",
     "context": "0a518c58-spark.jobserver.WordCountExample",
     "status": "FINISHED",
     "jobId": "aed9a387-5319-4d8e-ac3d-0f1ce9d4b1a1"
    }

  你的job應當成功地完成。得到的結果也能通過REST API下載。

$ curl https://<Your Docker Host IP>:8090/jobs/aed9a387-5319-4d8e-
ac3d-0f1ce9d4b1a1
    {
    "status": "OK",
    "result": {
    "takeshi": 1,
    "nobita": 2,
    "suneo": 2,
    "dora": 1
        }
    }

  這就是一個使用spark-jobserver的進程。雖然這個庫仍然在開發中,但由於它是一個開源項目,因此可能很快就會被應用到實際場景。如果你打算在內部使用以處理日常數據,那麼spark-jobserver是一個不錯的選項。
  本文選自《Spark:大數據集群計算的生產實踐》,點此鏈接可在博文視點官網查看此書。
                      圖片描述
  想及時獲得更多精彩文章,可在微信中搜索“博文視點”或者掃描下方二維碼並關注。
                         圖片描述

最後更新:2017-06-15 09:31:48

  上一篇:go  SAP的ABAP屏幕程序如何使用Table Control進行數據交互
  下一篇:go  Is a multi-cloud strategy the new normal?