在 Managed Service for Apache Spark 上編寫及執行 Spark Scala 工作

本教學課程說明如何以不同方式建立 Spark Scala 工作,並提交至 Managed Service for Apache Spark 叢集,包括:

  • 使用 Scala REPL (讀取-評估-列印迴圈或互動式解譯器) 或 SBT 建構工具,在本機電腦上透過指令列編寫及編譯 Spark Scala「Hello World」應用程式
  • 將已編譯的 Scala 類別封裝至含有資訊清單的 JAR 檔案
  • 將 Scala JAR 提交至在 Managed Service for Apache Spark 叢集上執行的 Spark 工作
  • 從 Google Cloud 控制台檢查 Scala 工作輸出內容

本教學課程也會說明如何:

  • 使用 spark-shell REPL,直接在 Managed Service for Apache Spark 叢集上編寫及執行 Spark Scala「WordCount」MapReduce 工作

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

設定 Google Cloud Platform 專案

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

  1. 設定專案
  2. 建立 Cloud Storage bucket
  3. 建立 Managed Service for Apache Spark 叢集

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

在本教學課程中,請在開發電腦上使用 Scala REPLSBT 指令列介面,編寫簡單的「Hello World」Scala 應用程式。

使用 Scala

  1. 從「Scala Install」頁面下載 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
    

建立罐子

使用 SBT 建立 JAR 檔案,或使用 jar 指令。

使用 SBT 建立 JAR

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

手動建立存錢筒

  1. 將目錄 (cd) 變更為包含已編譯 HelloWorld*.class 檔案的目錄,然後執行下列指令,將類別檔案封裝至 JAR 中,並使用資訊清單指定主要類別進入點 (HelloWorld)。
    $ 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 bucket
$ 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 提交至 Managed Service for Apache Spark Spark 工作

  1. 使用 Google Cloud 控制台,將 JAR 檔案提交至 Managed Service for Apache Spark Spark 工作。在「Submit a job」(提交工作) 頁面中填寫欄位,如下所示:

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

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

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

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

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

您可能想直接在 Managed Service for Apache Spark 叢集上開發 Scala 應用程式。Hadoop 和 Spark 已預先安裝在 Managed Service for Apache Spark 叢集上,並設定 Cloud Storage 連接器,讓您的程式碼可以直接從 Cloud Storage 讀取及寫入資料。

本範例說明如何透過 SSH 連線至專案的 Managed Service for Apache Spark 叢集主要執行個體,然後使用 spark-shell REPL 建立及執行 Scala 字數統計 MapReduce 應用程式。

  1. 透過 SSH 連線至 Managed Service for Apache Spark 叢集的主要節點

    1. 前往 Google Cloud 控制台中專案的 Managed Service for Apache Spark「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)
    

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

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

罐子類型 Master node /usr/lib/ location GitHub 來源 Apache 文件
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar 來源連結 MapReduce 教學課程
Spark spark/lib/spark-examples.jar 來源連結 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

後續步驟