Scrittura ed esecuzione di job Spark Scala su Managed Service per Apache Spark

Questo tutorial illustra diversi modi per creare e inviare un job Spark Scala a un cluster Managed Service for Apache Spark, tra cui come:

  • Scrivere e compilare un'app Spark Scala "Hello World" su una macchina locale dalla riga di comando utilizzando il REPL Scala (Read-Evaluate-Print-Loop o interprete interattivo) o lo strumento di build SBT
  • pacchetto di classi Scala compilate in un file jar con un manifest
  • Invia il file jar Scala a un job Spark eseguito sul cluster Managed Service for Apache Spark
  • esaminare l'output del job Scala dalla console Google Cloud

Questo tutorial mostra anche come:

  • scrivere ed eseguire un job MapReduce "WordCount" di Spark Scala direttamente su un cluster Managed Service for Apache Spark utilizzando il REPL spark-shell

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

Configura un progetto Google Cloud

Se non l'hai ancora fatto:

  1. Configura un progetto
  2. Crea un bucket Cloud Storage
  3. Crea un cluster Managed Service for Apache Spark

Scrivi e compila il codice Scala localmente

Come esercizio di base per questo tutorial, scrivi un'app Scala "Hello World" utilizzando la REPL Scala o l'interfaccia a riga di comando SBT localmente sulla tua macchina di sviluppo.

Usa Scala

  1. Scarica i file binari di Scala dalla pagina Scala Install.
  2. Decomprimi il file, imposta la variabile di ambiente SCALA_HOME e aggiungila al percorso, come mostrato nelle istruzioni di installazione di Scala. Ad esempio:

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

  3. Avvia la 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 Scala REPL

    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. Compila 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 genererai di seguito) su "HelloWorld.jar" (vedi Modifica degli 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. Pacchettizza il codice in un file jar con un manifest che specifica l'entry point della classe principale (HelloWorld), quindi esci

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

Crea un barattolo

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

Crea un barattolo

con SBT

Il comando package di SBT crea un file jar (vedi Utilizza SBT).

Crea un barattolo

manualmente

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

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

Invia il file JAR a un job Managed Service for Apache Spark

  1. Utilizza la consoleGoogle Cloud per inviare il file jar al job Managed Service for Apache Spark. Compila i campi della pagina Invia un job come segue:

    • Seleziona il tipo di computing per il job: Spark su Compute Engine
    • Dettagli del job del cluster:
      • Cluster: seleziona il nome del cluster dall'elenco dei cluster
    • File e artefatti:

      • Tipo di prestazione: Spark (Scala/Java)
      • Configurazione driver: seleziona URI jar principale e, nel campo Jar principale, specifica il percorso dell'URI Cloud Storage del tuo jar HelloWorld (gs://your-bucket-name/HelloWorld.jar).

        Se il file jar non include un manifest che specifica l'entry point al codice ("Main-Class: HelloWorld"), seleziona Classe principale in Configurazione driver, inserisci il nome della classe principale ("HelloWorld") nel campo Classe principale e compila il campo File jar con il percorso URI del file jar (gs://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, dove 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 Managed Service for Apache Spark. Hadoop e Spark sono preinstallati sui cluster Managed Service for Apache Spark e sono configurati con il connettore Cloud Storage, che consente al codice di leggere e scrivere dati direttamente da e verso Cloud Storage.

Questo esempio mostra come utilizzare SSH per connetterti al nodo master del cluster Managed Service for Apache Spark, quindi utilizzare il REPL spark-shell per creare ed eseguire un'applicazione mapreduce di conteggio delle parole in Scala.

  1. Utilizza SSH per connetterti al nodo master del cluster

    1. Vai alla pagina Cluster nella console Google Cloud , quindi fai clic sul nome del tuo cluster.

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

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

  2. Avvia 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 di Shakespeare che si trova in cloud pubblico Storage

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

  4. Esegui un mapreduce di conteggio delle parole 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. Utilizza gcloud CLI per elencare i file di output e visualizzare i contenuti dei file

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

Esegui il codice di esempio preinstallato

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

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

Invia 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 di Google Cloud CLI (consulta Utilizzo della console Google Cloud per inviare job dalla console Google Cloud ).

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

Esempio di WordCount di 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 Cloud Storage e file) utilizzate per questo tutorial.

Per arrestare un cluster:

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

Per eliminare il file jar di Cloud Storage:

gcloud storage rm gs://bucket-name/HelloWorld.jar

Puoi eliminare un bucket e tutte le relative cartelle e file con il seguente comando:

gcloud storage rm gs://bucket-name/ --recursive

Passaggi successivi