本教學課程說明建立 Spark Scala 工作並提交至 Managed Service for Apache Spark 叢集的不同方法,包括如何:
- 使用 Scala REPL (Read-Evaluate-Print-Loop 或互動式解譯器) 或 SBT 建構工具,在本機電腦上透過指令列編寫及編譯 Spark Scala「Hello World」應用程式
- 將編譯過的 Scala 類別封裝成含有資訊清單的 JAR 檔案
- 將 Scala JAR 提交至在 Managed Service for Apache Spark 叢集上執行的 Spark 工作
- 從 Google Cloud 控制台檢查 Scala 工作輸出內容
本教學課程也會說明如何:
使用
spark-shellREPL,直接在 Managed Service for Apache Spark 叢集上編寫及執行 Spark Scala「WordCount」MapReduce 工作在叢集上執行預先安裝的 Apache Spark 和 Hadoop 範例
設定 Google Cloud 專案
請執行以下步驟 (如果您尚未執行):
在本機編寫及編譯 Scala 程式碼
在本教學課程的基本練習中,您將使用 Scala REPL 或 SBT 指令列介面,在本機開發機器上編寫「Hello World」Scala 應用程式。
使用 Scala
- 從 Scala 安裝頁面下載 Scala 二進位檔
解壓縮檔案、設定
SCALA_HOME環境變數,並將其新增至路徑,如 Scala 安裝操作說明所示。例如:export SCALA_HOME=/usr/local/share/scala export PATH=$PATH:$SCALA_HOME/
啟動 Scala REPL
$ scala Welcome to Scala version ... Type in expressions to have them evaluated. Type :help for more information. scala>
複製
HelloWorld程式碼並貼到 Scala REPLobject HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
儲存
HelloWorld.scala並結束 REPLscala> :save HelloWorld.scala scala> :q
使用
scalac進行編譯$ scalac HelloWorld.scala
列出已編譯的
.class檔案$ ls HelloWorld*.class HelloWorld$.class HelloWorld.class
使用 SBT
建立「HelloWorld」專案,如下所示
$ mkdir hello $ cd hello $ echo \ 'object HelloWorld {def main(args: Array[String]) = println("Hello, world!")}' > \ HelloWorld.scala建立
sbt.build設定檔,將artifactName(您將在下方產生的 jar 檔案名稱) 設為「HelloWorld.jar」(請參閱「修改預設構件」)echo \ 'artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) => "HelloWorld.jar" }' > \ build.sbt啟動 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 ...
使用指定主要類別進入點 (
HelloWorld) 的資訊清單,將程式碼封裝成 jar 檔案,然後結束> package ... Packaging .../hello/target/scala-.../HelloWorld.jar ... ... Done packaging. [success] Total time: ... > exit
建立罐子
建立罐子
使用 SBT
SBT package 指令會建立 jar 檔案 (請參閱「使用 SBT」)。
建立罐子
手動
- 將目錄 (
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
- 使用 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 工作
使用 Google Cloud 控制台將 JAR 檔案提交至 Managed Service for Apache Spark 工作。按照下列指示,填寫「Submit a job」(提交工作) 頁面中的欄位:
- 選取工作的運算類型:Spark on Compute Engine
- 叢集工作詳細資料:
- 叢集:從叢集清單選取叢集名稱
檔案和構件:
- 工作類型:Spark (Scala/Java)
驅動程式設定:選取「Main jar URI」(主要 jar URI),然後在「Main jar」(主要 jar) 欄位中,指定 HelloWorld jar 的 Cloud Storage URI 路徑 (
gs://your-bucket-name/HelloWorld.jar)。如果 JAR 檔案不含指定程式碼進入點的資訊清單 (「Main-Class: HelloWorld」),請選取「Driver configuration」(驅動程式設定) 下方的「Main class」(主要類別),在「Main class」(主要類別) 欄位中輸入主要類別的名稱 (「HelloWorld」),並在「Jar files」(JAR 檔案) 欄位中填入 JAR 檔案的 URI 路徑 (
gs://your-bucket-name/HelloWorld.jar)。
按一下 [Submit] (提交) 以啟動工作。工作啟動後,就會加入工作清單。
按一下工作 ID,開啟「工作」頁面,即可查看工作的驅動程式輸出內容。
使用叢集的 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 應用程式。
使用 SSH 連線至叢集主要執行個體
前往 Google Cloud 控制台的「 Clusters 」(叢集) 頁面,然後按一下 叢集名稱。
在叢集詳細資料頁面中,選取「VM Instances」(VM 執行個體) 分頁標籤,然後按一下叢集名稱列右側顯示的 SSH 選項。
瀏覽器視窗會開啟主要節點上的主目錄
啟動
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>
從公開 Cloud Storage 中的莎士比亞作品文字片段,建立 RDD (彈性分散式資料集)
scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")對文字執行 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))將計數儲存至 Cloud Storage 的
<bucket-name>/wordcounts-out,然後退出scala-shellscala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/") scala> exit使用 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
檢查
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)
執行預先安裝的範例程式碼
叢集主要執行個體節點包含可執行的 jar 檔案,其中有標準 Apache Hadoop 和 Spark 範例。
| Jar 類型 | 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 bucket 和檔案)。
如要關閉叢集,請按照下列步驟操作:
gcloud dataproc clusters delete cluster-name \ --region=region
如要刪除 Cloud Storage jar 檔案,請按照下列步驟操作:
gcloud storage rm gs://bucket-name/HelloWorld.jar
您可以使用下列指令,刪除 bucket 及其所有資料夾和檔案:
gcloud storage rm gs://bucket-name/ --recursive