Menulis dan menjalankan tugas Scala Spark di Dataproc

Tutorial ini menggambarkan berbagai cara untuk membuat dan mengirimkan tugas Scala Spark ke cluster Dataproc, termasuk cara:

  • menulis dan mengompilasi aplikasi "Hello World" Scala Spark di komputer lokal dari command line menggunakan Scala REPL (Read-Evaluate-Print-Loop atau penafsir interaktif) atau alat build SBT
  • memaketkan class Scala yang dikompilasi ke dalam file jar dengan manifes
  • kirim jar Scala ke tugas Spark yang berjalan di cluster Dataproc Anda
  • memeriksa output tugas Scala dari konsol Google Cloud

Tutorial ini juga menunjukkan cara:

  • menulis dan menjalankan tugas mapmengurangi Scala Spark Scala secara langsung di cluster Dataproc menggunakan REPL spark-shell

  • menjalankan contoh Apache Spark dan Hadoop yang telah diinstal sebelumnya di cluster

Siapkan proyek Google Cloud Platform

Jika Anda belum melakukannya:

  1. Menyiapkan project
  2. Membuat bucket Cloud Storage
  3. Membuat cluster Dataproc

Menulis dan mengompilasi kode Scala secara lokal

Sebagai latihan sederhana untuk tutorial ini, tulis aplikasi Scala "Halo Dunia" menggunakan Scala REPL atau antarmuka command line SBT secara lokal di mesin pengembangan Anda.

Gunakan Scala

  1. Download biner Scala dari halaman Scala Install
  2. Ekstrak file, tetapkan variabel lingkungan SCALA_HOME, dan tambahkan ke jalur Anda, seperti yang ditunjukkan dalam petunjuk Penginstalan skala. Contoh:

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

  3. Meluncurkan Scala REPL

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

  4. Salin dan tempel kode HelloWorld ke Scala REPL

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

  5. Simpan HelloWorld.scala dan keluar dari REPL

    scala> :save HelloWorld.scala
    scala> :q
    

  6. Kompilasi dengan scalac

    $ scalac HelloWorld.scala
    

  7. Buat daftar file .class yang dikompilasi

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

Gunakan SBT

  1. Download SBT

  2. Buat project "HelloWorld", seperti yang ditunjukkan di bawah

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

  3. Buat file konfigurasi sbt.build untuk menetapkan artifactName (nama file jar yang akan Anda buat di bawah) ke "HelloWorld.jar" (lihat Mengubah artefak default)

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

  4. Luncurkan SBT dan jalankan kode

    $ 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. Kemas kode ke dalam file jar dengan manifes yang menentukan titik entri class utama (HelloWorld), lalu keluar

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

Membuat jar

Buat file jar dengan SBT atau menggunakan perintah jar.

Membuat jar dengan SBT

Perintah package SBT membuat file jar (lihat Menggunakan SBT).

Membuat jar secara manual

  1. Ubah direktori (cd) ke direktori yang berisi file HelloWorld*.class terkompilasi, lalu jalankan perintah berikut untuk memaketkan file class ke dalam jar dengan manifes yang menentukan titik entri class utama (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%)
    

Salin jar ke Cloud Storage

  1. Gunakan perintah gsutil untuk menyalin jar ke bucket Cloud Storage di project Anda
$ gsutil 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

Mengirim jar ke tugas Dataproc Spark

  1. Gunakan Google Cloud Console untuk mengirimkan file jar ke tugas Dataproc Spark Anda. Isi kolom di halaman Submit a job sebagai berikut:

    • Cluster: Pilih nama cluster Anda dari daftar cluster
    • Jenis tugas: Spark
    • Main class atau jar: Menentukan jalur URI Cloud Storage ke jar HelloWorld (gs://your-bucket-name/HelloWorld.jar).

      Jika jar tidak menyertakan manifes yang menentukan titik entri ke kode Anda ("Main-Class: HelloWorld"), kolom "Main class or jar" harus menyatakan nama Class Utama ("HelloWorld"), dan Anda harus mengisi kolom "Jar files" dengan jalur URI ke file jar (gs://your-bucket-name/HelloWorld.jar).

  2. Klik Submit untuk memulai tugas. Setelah dimulai, tugas akan ditambahkan ke daftar Pekerjaan.

  3. Klik ID Tugas untuk membuka halaman Tugas, tempat Anda dapat melihat output driver tugas.

Menulis dan menjalankan kode Scala Spark menggunakan spark-shell REPL cluster

Anda dapat mengembangkan aplikasi Scala langsung di cluster Dataproc. Hadoop dan Spark sudah diinstal sebelumnya di cluster Dataproc, dan dikonfigurasi dengan konektor Cloud Storage, yang memungkinkan kode Anda membaca dan menulis data langsung dari dan ke Cloud Storage.

Contoh ini menunjukkan cara menerapkan SSH ke node master cluster Dataproc project Anda, lalu menggunakan REPL spark-shell untuk membuat dan menjalankan aplikasi mapReduce kata Scala.

  1. SSH ke node master cluster Dataproc

    1. Buka halaman Clusters Dataproc project Anda di Google Cloud Console, lalu klik nama cluster Anda.

    2. Di halaman detail cluster, pilih tab VM Instances, lalu klik pilihan SSH yang muncul di sebelah kanan baris nama cluster Anda.

      Jendela browser akan terbuka di direktori beranda Anda pada node master

  2. Meluncurkan 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. Buat RDD (Set Data Terdistribusi Ketahanan) dari cuplikan teks Shakespeare yang berada di Cloud Storage publik

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

  4. Jalankan mapmengurangi jumlah kata pada teks, lalu tampilkan hasil 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. Simpan jumlah di <bucket-name>/wordcounts-out di Cloud Storage, lalu keluar dari scala-shell

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

  6. Menggunakan gsutil untuk mencantumkan file output dan menampilkan isi file

    $ gsutil 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. Periksa konten gs://<bucket-name>/wordcounts-out/part-00000

    $ gsutil 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)
    

Menjalankan Kode Contoh Pra-Terinstal

Node master Dataproc berisi file jar yang dapat dijalankan dengan contoh Apache Hadoop dan Spark standar.

Jenis Toples Master node /usr/lib/ location Sumber GitHub Dokumen Apache
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar link sumber Tutorial MapReduce
Spark spark/lib/spark-examples.jar link sumber Contoh Spark

Mengirimkan contoh ke cluster Anda dari command line

Contoh dapat dikirimkan dari mesin pengembangan lokal Anda menggunakan alat command line gcloud Google Cloud CLI (lihat Menggunakan konsol Google Cloud untuk mengirim tugas dari Konsol Google Cloud).

Contoh WordCount Hadoop

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

Contoh WordCount Spark

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

Mematikan cluster Anda

Untuk menghindari biaya yang berkelanjutan, matikan cluster Anda dan hapus resource Cloud Storage (bucket dan file Cloud Storage) yang digunakan untuk tutorial ini.

Untuk mematikan cluster:

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

Untuk menghapus file jar Cloud Storage:

gsutil rm gs://bucket-name/HelloWorld.jar

Anda dapat menghapus bucket beserta semua folder dan file di dalamnya dengan perintah berikut:

gsutil rm -r gs://bucket-name/

Langkah selanjutnya