本教學課程將說明如何建立 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 專案
請執行以下步驟 (如果您尚未執行):
在本機編寫及編譯 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 REPL 中object 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 ...
將程式碼封裝至jar 檔案,其中包含指定主要類別進入點 (
HelloWorld
) 的資訊清單,然後退出> package ... Packaging .../hello/target/scala-.../HelloWorld.jar ... ... Done packaging. [success] Total time: ... > exit
建立 JAR
使用 SBT 建立 JAR
SBT package 指令會建立 JAR 檔案 (請參閱「使用 SBT」)。
手動建立 JAR
- 將目錄 (
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
- 使用 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 工作
使用 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
)。
按一下 [Submit] (提交) 以啟動工作。工作啟動後,即會加入「Jobs」[工作] 清單中。
按一下工作 ID 以開啟「Jobs」(工作) 頁面。您可以在此頁面查看工作的驅動程式輸出。
使用叢集的 spark-shell
REPL 編寫並執行 Spark Scala 程式碼
您可能會想直接在 Dataproc 叢集中開發 Scala 應用程式。Hadoop 和 Spark 會預先安裝在 Dataproc 叢集上,並透過 Cloud Storage 連接器進行設定,讓程式碼可直接讀取及寫入 Cloud Storage 中的資料。
本範例將說明如何透過 SSH 登入專案的 Dataproc 叢集主節點,然後使用 spark-shell REPL 建立並執行 Scala 字詞計數 mapreduce 應用程式。
使用 SSH 連結 Dataproc 叢集的主要節點
前往 Google Cloud 控制台的專案 Dataproc「Clusters」(叢集) 頁面,然後按一下叢集名稱。
在叢集詳細資料頁面中,選取「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))
將
<bucket-name>/wordcounts-out
中的計數儲存至 Cloud Storage,然後退出scala-shell
scala> 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)
執行預先安裝的範例程式碼
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