Scrivi ed esegui job Spark Scala su Dataproc

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Questo tutorial illustra diversi modi per creare e inviare un job Spark Scala a un cluster Dataproc, incluso come:

  • scrivere e compilare un'app Spark Scala "Hello World" su una macchina locale dalla riga di comando utilizzando Scala REPL (Read-Valuta-Print-Loop o interprete interattivo) o lo strumento di compilazione SBT
  • il pacchetto ha compilato le classi Scala in un file jar con un manifest
  • invia il jar alla scalabilità con un job Spark eseguito sul cluster Dataproc
  • esaminare l'output del job Scala da Google Cloud Console

Questo tutorial illustra anche come:

  • scrivere ed eseguire un job Spark Scala "WordCount" mappareduce direttamente su un cluster Dataproc utilizzando il REPL spark-shell

  • Eseguire esempi di Apache Spark e Hadoop preinstallati su un cluster

Configura un progetto Google Cloud Platform

Se non lo hai già fatto:

  1. Configurare un progetto
  2. Crea un bucket Cloud Storage
  3. Crea un cluster Dataproc

Scrivi e compila il codice Scala localmente

Come esercizio semplice per questo tutorial, scrivi un'app "Hello World" Scala utilizzando la risorsa Scala REPL o l'interfaccia a riga di comando SBT in locale nella tua macchina di sviluppo.

Usa Scala

  1. Scarica i programmi binari Scala dalla pagina Installazione di Scala
  2. Apri il file, imposta la variabile di ambiente SCALA_HOME e aggiungila al tuo percorso, come mostrato nelle istruzioni per le installazioni di scale. Ad esempio:

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

  3. Avvia il REPL di Scala

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

  4. Copia e incolla il codice HelloWorld in REPL di Scala

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

  5. Salva HelloWorld.scala ed esci dal REPL

    scala> :save HelloWorld.scala
    scala> :q
    

  6. Compilazione con scalac

    $ scalac HelloWorld.scala
    

  7. Elenca i file .class compilati

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

Usa SBT

  1. Scarica SBT

  2. Crea un progetto "HelloWorld", come mostrato di seguito

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

  3. Crea un file di configurazione sbt.build per impostare artifactName (il nome del file jar che generi di seguito) su "quoWorld;HelloWorld.jar". (Vedi Modificare gli artefatti predefiniti)

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

  4. Avvia SBT ed esegui il codice

    $ 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. Codice del pacchetto in un file jar con un manifest che specifica il punto di ingresso della classe principale (HelloWorld), quindi esci

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

Crea un jar

Crea un file jar con SBT o utilizzando il comando jar.

Creare un jar con SBT

Il comando pacchetto SBT crea un file jar (vedi Utilizzare SBT).

Creare un jar manualmente

  1. Cambia la directory (cd) nella directory che contiene i file HelloWorld*.class compilati, quindi esegui il comando seguente per pacchettizzare i file del corso in un jar con un manifest che specifica il punto di ingresso principale della classe (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%)
    

Copia jar in Cloud Storage

  1. Utilizza il comando gsutil per copiare il jar in un bucket Cloud Storage nel tuo progetto
$ 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

Inviare un file jar a un job Dataproc Spark

  1. Utilizza Google Cloud Console per inviare il file jar al tuo job Dataproc Spark. Compila i campi nella pagina Invia un job come segue:

    • Cluster: seleziona il nome del cluster dall'elenco dei cluster.
    • Tipo di job: Spark
    • Classe o jar principale: specifica il percorso dell'URI Cloud Storage del jar HelloWorld (gs://your-bucket-name/HelloWorld.jar).

      Se il tuo file jar non include un manifest che specifica il punto di ingresso del tuo codice ("Main-Class: HelloWorld"), il campo "Classe principale o jar" deve indicare il nome della tua classe principale ("HelloWorld") e devi compilare il campo"File Terraform"con il percorso dell'URI del tuo file jargs://your-bucket-name/HelloWorld.jar.

  2. Fai clic su Invia per avviare il job. Una volta avviato, il job viene aggiunto all'elenco dei job.

  3. Fai clic sull'ID job per aprire la pagina Job, in cui puoi visualizzare l'output del driver del job.

Scrivi ed esegui il codice Spark Scala utilizzando il REPL spark-shell del cluster

Potresti voler sviluppare app Scala direttamente sul tuo cluster Dataproc. Hadoop e Spark sono preinstallati nei cluster Dataproc e sono configurati con il connettore Cloud Storage, che consente al tuo codice di leggere e scrivere dati direttamente da e in Cloud Storage.

Questo esempio mostra come connetterti al nodo master del cluster Dataproc del progetto SSH, quindi utilizza il REPL spark-shell per creare ed eseguire un'applicazione mappareduce Scala.

  1. SSH nel nodo master del cluster Dataproc

    1. Vai alla pagina Cluster del progetto in Google Cloud Console, quindi fai clic sul nome del cluster.

    2. Nella pagina dei dettagli del cluster, seleziona la scheda Istanze VM, quindi fai clic sulla selezione SSH che appare a destra della riga del nome del cluster.

      Si apre una finestra del browser nella directory home sul nodo master

  2. Lancia 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. Crea un RDD (Resilient Distributed Dataset) da uno snippet di testo Shakespeare situato nella Cloud Storage pubblica

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

  4. Esegui un conteggio delle parole mappato sul testo, quindi visualizza il risultato 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. Salva i conteggi in <bucket-name>/wordcounts-out in Cloud Storage, quindi esci da scala-shell

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

  6. Usa gsutil per elencare i file di output e visualizzarne i contenuti

    $ 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. Controlla i contenuti 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)
    

Eseguire il codice di esempio preinstallato

Il nodo master Dataproc contiene file jar eseguibili con esempi di Apache Hadoop e Spark standard.

Tipo di barattolo Master node /usr/lib/ location Origine GitHub Documenti Apache
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar link di origine Tutorial MapReduce
Spark spark/lib/spark-examples.jar link di origine Esempi di Spark

Invio di esempi al cluster dalla riga di comando

Gli esempi possono essere inviati dalla tua macchina di sviluppo locale utilizzando lo strumento a riga di comando gcloud dell'interfaccia a riga di comando di Google Cloud (vedi Utilizzo di Google Cloud Console per inviare job da Google Cloud Console).

Esempio di 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

Esempio di conteggio parole 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

Arresta il cluster

Per evitare addebiti continui, arresta il cluster ed elimina le risorse Cloud Storage (bucket e file Cloud Storage) utilizzati per questo tutorial.

Per arrestare un cluster:

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

Per eliminare il file jar di Cloud Storage:

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

Puoi eliminare un bucket e tutte le sue cartelle e i relativi file con il comando seguente:

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

Passaggi successivi