Escrever e executar jobs Spark Scala em um cluster do Cloud Dataproc

Este tutorial ilustra maneiras diferentes de criar e enviar um job Spark Scala a um cluster do Cloud Dataproc, incluindo:

  • escrever e compilar um app "Hello World" em Spark Scala em uma máquina local a partir da linha de comando usando o Scala REPL (Read-Evaluate-Print-Loop ou interpretador interativo), a ferramenta de criação SBT ou o Eclipse IDE com o plug-in Scala IDE para Eclipse;
  • empacotar classes Scala compiladas em um arquivo jar com um manifesto;
  • enviar o jar do Scala a um job Spark que seja executado no cluster do Cloud Dataproc;
  • examinar a saída do job Scala a partir do Console do Google Cloud Platform.

Este tutorial também mostra como:

  • escrever e executar um job MapReduce "WordCount" em Spark Scala diretamente em um cluster do Cloud Dataproc usando o REPL spark-shell;

  • executar exemplos pré-instalados do Apache Spark e do Hadoop em um cluster.

Configurar um projeto do Google Cloud Platform

Faça o seguinte, se ainda não tiver feito:

  1. Configure um projeto.
  2. Crie um intervalo do Cloud Storage.
  3. Crie um cluster do Cloud Dataproc.

Escrever e compilar código em Scala localmente

Como um exercício simples para este tutorial, escreva um app "Hello World" em Scala usando o Scala REPL, a interface de linha de comando SBT ou o plug-in Scala IDE para Eclipse localmente na máquina de desenvolvimento.

Uso do Scala

  1. Faça download dos binários do Scala da página de instalação do Scala.
  2. Desempacote o arquivo, defina a variável de ambiente SCALA_HOME e adicione-a ao caminho, conforme mostrado nas instruções de instalação do Scala. Por exemplo:

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

  3. Inicie o Scala REPL.

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

  4. Copie e cole o código HelloWorld no Scala REPL.

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

  5. Salve HelloWorld.scala e saia do REPL.

    scala> :save HelloWorld.scala
    scala> :q
    

  6. Compile com scalac.

    $ scalac HelloWorld.scala
    

  7. Liste os arquivos .class compilados.

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

Uso do SBT

  1. Faça download do SBT.

  2. Crie um projeto "HelloWorld", como mostrado abaixo.

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

  3. Crie um arquivo de configuração sbt.build para definir o artifactName (nome do arquivo jar que você vai gerar, abaixo) como "HelloWorld.jar" (consulte Como modificar os artefatos padrão).

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

  4. Inicie o SBT e execute o código.

    $ 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. Empacote o código em um arquivo jar com um manifesto que especifique o ponto de entrada de classe principal (HelloWorld), depois saia.

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

Uso do plug-in SBT para Eclipse

  1. Instale o plug-in SBT para Eclipse.

  2. Selecione/crie um espaço de trabalho e inicie um novo projeto do Scala.

  3. Na página Create a Scala project, nomeie o projeto "HelloWorld" e clique em "Finish" para aceitar as configurações padrão.
  4. Selecione a pasta src no painel esquerdo ("Package Explorer") e, em seguida, selecione "New"→"Scala Object".
  5. Insira "HelloWorld" como sendo o nome do objeto do Scala na caixa de diálogo Create New File e clique em "Finish".
  6. O arquivo HelloWorld.scala é criado com um modelo de objeto HelloWorld. Preencha o modelo para concluir a definição do objeto HelloWorld como a seguir:
    object HelloWorld {
      def main(args: Array[String]): Unit = {
        println("Hello, world!")
      }
    }
    
    
  7. Clique no documento HelloWorld.scala ou selecione o nome do documento no painel esquerdo ("Package Explorer"), depois clique nele com o botão direito e selecione "Run As"→"Scala Application" para criar e executar o app.
  8. O console mostra que o app foi criado e executado com sucesso.
  9. Os arquivos de classe compilados ficam na pasta bin do projeto no espaço de trabalho do Eclipse. Use-os para criar um jar (consulte Criar um jar).

Criar um jar

Crie um arquivo jar com SBT ou usando o comando jar.

Uso do SBT

O comando de pacote do SBT cria um arquivo jar (consulte Como usar o SBT).

Criação manual do jar

  1. Com o comando cd, acesse o diretório que contém os arquivos HelloWorld*.class compilados e, em seguida, execute o comando a seguir para empacotar os arquivos de classe em um jar com um manifesto que especifica o ponto de entrada de classe principal (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%)
    

Copiar o jar no Cloud Storage

  1. Use o comando gsutil para copiar o jar em um intervalo do Cloud Storage do projeto.
$ 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

Enviar o jar a um job Spark do Cloud Dataproc

  1. Use o Console do GCP para enviar o arquivo jar ao job Spark do Cloud Dataproc.

  2. Preencha os campos na página Enviar um job da seguinte maneira:

    • Cluster: selecione o nome do cluster na lista de clusters.
    • Tipo de job: Spark.
    • Classe principal ou jar: especifique o caminho URI do Cloud Storage para o jar do HelloWorld (gs://your-bucket-name/HelloWorld.jar). Se o jar não incluir um manifesto que especifique o ponto de entrada do código ("Main-Class: HelloWorld"), o campo "Classe principal ou jar" deverá indicar o nome da classe principal ("HelloWorld") e você deverá preencher o campo "Arquivos jar" com o caminho URI para o arquivo jar (gs://your-bucket-name/HelloWorld.jar).
  3. Clique em Enviar para iniciar o job. Ao ser iniciado, o job entra na lista Jobs.

  4. Clique no código do job para abrir a página Jobs, na qual você pode ver a saída do driver do job.

Escrever e executar código em Spark Scala usando o REPL spark-shell do cluster

Talvez convenha desenvolver apps em Scala diretamente no cluster do Cloud Dataproc. Hadoop e Spark, pré-instalados nos clusters do Cloud Dataproc, são configurados com o conector do Google Cloud Storage, que permite que o código leia e escreva dados diretamente do e para o Google Cloud Storage.

Este exemplo mostra como incorporar o SSH ao node mestre do cluster do Cloud Dataproc do projeto, depois usar o REPL spark-shell para criar e executar um aplicativo MapReduce de contagem de palavras em Scala.

  1. Incorpore o SSH ao node mestre do cluster do Cloud Dataproc.
    1. Acesse a página Clusters do Cloud Dataproc do seu projeto no console do GCP e clique no nome do seu cluster.
    2. Na página de detalhes do cluster, selecione a guia "Instâncias de VM" e clique na seleção de SSH que aparece à direita do nome do node mestre do cluster.
      Uma janela de navegador é aberta no diretório principal do nó mestre.
      Connected, host fingerprint: ssh-rsa 2048 ...
      ...
      user@clusterName-m:~$
      
  2. Inicie o 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. Crie um RDD (Resilient Distributed Dataset) a partir de um fragmento de texto de Shakespeare localizado em um Google Cloud Storage público.
    scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")
    
  4. Execute um MapReduce de contagem de palavras no texto e exiba o resultado de 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. Salve as contagens em <bucket-name>/wordcounts-out no Cloud Storage e saia do scala-shell.
    scala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/")
    scala> exit
    
  6. Use gsutil para listar os arquivos de saída e exibir o conteúdo do arquivo.
    $ 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. Verifique o conteúdo de 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)
    

Execução de código de exemplo pré-instalado

O node mestre do Cloud Dataproc contém arquivos jar executáveis com exemplos padrão do Apache Hadoop e do Spark.

Tipo de jar Master node /usr/lib/ location Fonte no GitHub Documentos do Apache
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar link da fonte Tutorial do MapReduce
Spark spark/lib/spark-examples.jar link da fonte Exemplos do Spark

Como enviar exemplos ao cluster pela linha de comando

É possível enviar exemplos a partir da máquina de desenvolvimento local usando a ferramenta de linha de comando gcloud do Google Cloud SDK. Consulte Como usar o Console do Google Cloud Platform para enviar jobs a partir do Console do GCP.

Exemplo de WordCount do Hadoop

gcloud dataproc jobs submit hadoop --cluster <cluster-name> \
  --jar file:///usr/lib/hadoop-mapreduce/hadoop-mapreduce-examples.jar \
  --class org.apache.hadoop.examples.WordCount \
  <URI of input file> <URI of output file>

Exemplo de WordCount do Spark

gcloud dataproc jobs submit spark --cluster <cluster-name> \
  --jar file:///usr/lib/spark/lib/spark-examples.jar \
  --class org.apache.spark.examples.JavaWordCount
  <URI of input file>

Encerrar o cluster

Para evitar cobranças contínuas, encerre o cluster e exclua os recursos do Cloud Storage (intervalo e arquivos) usados neste tutorial.

Para encerrar um cluster:

gcloud dataproc clusters delete <cluster-name>

Para excluir o arquivo jar do Cloud Storage:

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

Você pode excluir um intervalo e todos os respectivos arquivos e pastas usando o seguinte comando:

gsutil rb -r gs://<bucket-name>/

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Cloud Dataproc
Precisa de ajuda? Acesse nossa página de suporte.