在 Dataproc 上編寫及執行 Spark Scala 工作

本教學課程將說明如何建立 Spark Scala 工作並提交至 Dataproc 叢集,包括:

  • 使用 Scala REPL (Read-Evaluate-Print-Loop 或互動式轉譯器) 或 SBT 建構工具,在本機電腦上透過指令列編寫及編譯 Spark Scala「Hello World」應用程式
  • 將編譯的 Scala 類別封裝至含有資訊清單的 JAR 檔案
  • 將 Scala JAR 提交至在 Dataproc 叢集中執行的 Spark 工作
  • 透過 Google Cloud 主控台檢查 Scala 工作輸出內容

本教學課程也說明如何:

  • 使用 spark-shell REPL 直接在 Dataproc 叢集中編寫及執行 Spark Scala「WordCount」MapReduce 工作

  • 在叢集上執行預先安裝的 Apache Spark 和 Hadoop 範例

設定 Google Cloud Platform 專案

請執行以下步驟 (如果您尚未執行):

  1. 設定專案
  2. 建立 Cloud Storage 值區
  3. 建立 Dataproc 叢集

在本機編寫及編譯 Scala 程式碼

本教學課程的簡單練習,是在開發機器上使用 Scala REPLSBT 指令列介面,編寫「Hello World」Scala 應用程式。

使用 Scala

  1. 從「Scala 安裝」頁面下載 Scala 二進位檔
  2. 解壓縮檔案、設定 SCALA_HOME 環境變數,然後將其新增至路徑,如 Scala 安裝操作說明所示。例如:

    export SCALA_HOME=/usr/local/share/scala
    export PATH=$PATH:$SCALA_HOME/
    

  3. 啟動 Scala REPL

    $ scala
    Welcome to Scala version ...
    Type in expressions to have them evaluated.
    Type :help for more information.
    scala>
    

  4. HelloWorld 程式碼複製並貼到 Scala REPL 中

    object HelloWorld {
      def main(args: Array[String]): Unit = {
        println("Hello, world!")
      }
    }

  5. 儲存 HelloWorld.scala 並退出 REPL

    scala> :save HelloWorld.scala
    scala> :q
    

  6. 使用 scalac 編譯

    $ scalac HelloWorld.scala
    

  7. 列出已編譯的 .class 檔案

    $ ls HelloWorld*.class
    HelloWorld$.class   HelloWorld.class
    

使用 SBT

  1. 下載 SBT

  2. 建立「HelloWorld」專案,如下所示

    $ mkdir hello
    $ cd hello
    $ echo \
    'object HelloWorld {def main(args: Array[String]) = println("Hello, world!")}' > \
    HelloWorld.scala
    

  3. 建立 sbt.build 設定檔,將 artifactName (您將產生的 jar 檔案名稱,請見下方) 設為「HelloWorld.jar」(請參閱「修改預設構件」)

    echo \
    'artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
    "HelloWorld.jar" }' > \
    build.sbt
    

  4. 啟動 SBT 並執行程式碼

    $ sbt
    [info] Set current project to hello ...
    > run
    ... Compiling 1 Scala source to .../hello/target/scala-.../classes...
    ... Running HelloWorld
    Hello, world!
    [success] Total time: 3 s ...
    

  5. 將程式碼封裝至jar 檔案,其中包含指定主要類別進入點 (HelloWorld) 的資訊清單,然後退出

    > package
    ... Packaging .../hello/target/scala-.../HelloWorld.jar ...
    ... Done packaging.
    [success] Total time: ...
    > exit
    

建立 JAR

使用 SBTjar 指令建立jar 檔案

使用 SBT 建立 JAR

SBT package 指令會建立 JAR 檔案 (請參閱「使用 SBT」)。

手動建立 JAR

  1. 將目錄 (cd) 變更為包含已編譯 HelloWorld*.class 檔案的目錄,然後執行下列指令,將類別檔案封裝成包含指定主要類別進入點資訊清單 (HelloWorld) 的 JAR 檔案。
    $ jar cvfe HelloWorld.jar HelloWorld HelloWorld*.class
    added manifest
    adding: HelloWorld$.class(in = 637) (out= 403)(deflated 36%)
    adding: HelloWorld.class(in = 586) (out= 482)(deflated 17%)
    

將 JAR 複製到 Cloud Storage

  1. 使用 Google Cloud CLI 將 JAR 複製到專案中的 Cloud Storage 值區
$ gcloud storage cp HelloWorld.jar gs://<bucket-name>/
Copying file://HelloWorld.jar [Content-Type=application/java-archive]...
Uploading   gs://bucket-name/HelloWorld.jar:         1.46 KiB/1.46 KiB

將 JAR 提交至 Dataproc Spark 工作

  1. 使用 Google Cloud 主控台將 JAR 檔案提交至 Dataproc Spark 工作。依照下列說明填寫「Submit a job」頁面中的欄位:

    • 叢集:從叢集清單中選取叢集名稱
    • 工作類型:Spark
    • 主類別或 JAR:指定 HelloWorld JAR (gs://your-bucket-name/HelloWorld.jar) 的 Cloud Storage URI 路徑。

      如果 JAR 檔案未包含指定程式碼進入點的資訊清單 (「Main-Class: HelloWorld」),則「Main class or jar」欄位應填入 Main 類別的名稱 (「HelloWorld」),而您應在「Jar files」欄位中填入 JAR 檔案的 URI 路徑 (gs://your-bucket-name/HelloWorld.jar)。

  2. 按一下 [Submit] (提交) 以啟動工作。工作啟動後,即會加入「Jobs」[工作] 清單中。

  3. 按一下工作 ID 以開啟「Jobs」(工作) 頁面。您可以在此頁面查看工作的驅動程式輸出。

使用叢集的 spark-shell REPL 編寫並執行 Spark Scala 程式碼

您可能會想直接在 Dataproc 叢集中開發 Scala 應用程式。Hadoop 和 Spark 會預先安裝在 Dataproc 叢集上,並透過 Cloud Storage 連接器進行設定,讓程式碼可直接讀取及寫入 Cloud Storage 中的資料。

本範例將說明如何透過 SSH 登入專案的 Dataproc 叢集主節點,然後使用 spark-shell REPL 建立並執行 Scala 字詞計數 mapreduce 應用程式。

  1. 使用 SSH 連結 Dataproc 叢集的主要節點

    1. 前往 Google Cloud 控制台的專案 Dataproc「Clusters」(叢集) 頁面,然後按一下叢集名稱。

    2. 在叢集詳細資料頁面中,選取「VM 執行個體」分頁標籤,然後按一下叢集名稱列右側的「SSH」選項。

      瀏覽器視窗會開啟主要節點的主目錄

  2. 啟動 spark-shell

    $ spark-shell
    ...
    Using Scala version ...
    Type in expressions to have them evaluated.
    Type :help for more information.
    ...
    Spark context available as sc.
    ...
    SQL context available as sqlContext.
    scala>
    

  3. 從位於公開 Cloud Storage 的莎士比亞文字片段建立 RDD (彈性分散式資料集)

    scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")
    

  4. 對文字執行 wordcount mapreduce,然後顯示 wordcounts 結果

    scala> val wordCounts = text_file.flatMap(line => line.split(" ")).map(word =>
    (word, 1)).reduceByKey((a, b) => a + b)
    scala> wordCounts.collect
    ... Array((call,1), (What's,1), (sweet.,1), (we,1), (as,1), (name?,1), (any,1), (other,1),
    (rose,1), (smell,1), (name,1), (a,2), (would,1), (in,1), (which,1), (That,1), (By,1))
    

  5. <bucket-name>/wordcounts-out 中的計數儲存至 Cloud Storage,然後退出 scala-shell

    scala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/")
    scala> exit
    

  6. 使用 gcloud CLI 列出輸出檔案並顯示檔案內容

    $ gcloud storage ls gs://bucket-name/wordcounts-out/
    gs://spark-scala-demo-bucket/wordcounts-out/
    gs://spark-scala-demo-bucket/wordcounts-out/_SUCCESS
    gs://spark-scala-demo-bucket/wordcounts-out/part-00000
    gs://spark-scala-demo-bucket/wordcounts-out/part-00001
    

  7. 檢查 gs://<bucket-name>/wordcounts-out/part-00000 內容

    $ gcloud storage cat gs://bucket-name/wordcounts-out/part-00000
    (call,1)
    (What's,1)
    (sweet.,1)
    (we,1)
    (as,1)
    (name?,1)
    (any,1)
    (other,1)
    

執行預先安裝的範例程式碼

Dataproc 主節點包含可執行的 JAR 檔案,其中包含標準 Apache Hadoop 和 Spark 範例。

罐子類型 Master node /usr/lib/ location GitHub 原始碼 Apache 文件
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar source_link MapReduce 教學課程
Spark spark/lib/spark-examples.jar source_link Spark 範例

透過指令列將範例提交至叢集

您可以使用 Google Cloud CLI gcloud 指令列工具,從本機開發機器提交範例 (請參閱使用 Google Cloud 控制台提交 Google Cloud 控制台的工作)。

Hadoop WordCount 範例

gcloud dataproc jobs submit hadoop --cluster=cluster-name \
    --region=region \
    --jars=file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
    --class=org.apache.hadoop.examples.WordCount \
    -- URI of input file URI of output file

Spark WordCount 範例

gcloud dataproc jobs submit spark --cluster=cluster-name \
    --region=region \
    --jars=file:///usr/lib/spark/examples/jars/spark-examples.jar \
    --class=org.apache.spark.examples.JavaWordCount \
    -- URI of input file

關閉叢集

為避免持續產生費用,請關閉叢集,並刪除本教學課程使用的 Cloud Storage 資源 (Cloud Storage 值區和檔案)。

如何關閉叢集:

gcloud dataproc clusters delete cluster-name \
    --region=region

如要刪除 Cloud Storage jar 檔案,請按照下列步驟操作:

gcloud storage rm gs://bucket-name/HelloWorld.jar

您可以使用下列指令刪除值區及其所有資料夾和檔案:

gcloud storage rm gs://bucket-name/ --recursive

後續步驟