Dataproc에서 Spark Scala 작업 작성 및 실행

이 가이드에서는 다음과 같이 Spark Scala 작업을 만들고 Dataproc 클러스터에 제출하는 다양한 방법에 대해 설명합니다.

  • Scala REPL(읽기-평가-인쇄-루프 또는 대화형 인터프리터) 또는 SBT 빌드 도구를 사용하여 명령줄에서 로컬 머신에 Spark Scala 'Hello World' 앱을 작성 및 컴파일
  • 컴파일된 Scala 클래스를 매니페스트가 있는 jar 파일에 패키지화
  • Scala jar을 Dataproc 클러스터에서 실행되는 Spark 작업에 제출
  • Google Cloud Console의 Scala 작업 출력 검토

다음 방법도 이 가이드에서 소개합니다.

  • spark-shell REPL을 사용하여 Dataproc 클러스터에 직접 Spark Scala 'WordCount' 맵리듀스 작업 작성 및 실행

  • 클러스터에 사전 설치된 Apache Spark 및 Hadoop 예시 실행

Google Cloud Platform 프로젝트 설정

아직 설정하지 않은 경우 다음 단계에 따라 설정하세요.

  1. 프로젝트 설정
  2. Cloud Storage 버킷 생성
  3. Dataproc 클러스터 만들기

로컬에서 Scala 코드 작성 및 컴파일

이 가이드에 대한 간단한 과제로 Scala REPL 또는 SBT 명령줄 인터페이스를 사용하여 개발 머신에서 로컬로 'Hello World' Scala 앱을 작성하세요.

Scala 사용

  1. Scala 설치 페이지에서 Scala 바이너리를 다운로드합니다.
  2. Scala 설치 지침에 표시된 대로 파일의 압축을 풀고 SCALA_HOME 환경 변수를 설정한 다음 경로에 추가합니다. 예를 들면 다음과 같습니다.

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

  3. Scala REPL을 실행합니다.

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

  4. HelloWorld 코드를 복사하여 Scala REPL에 붙여넣습니다.

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

  5. HelloWorld.scala를 저장하고 REPL을 종료합니다.

    scala> :save HelloWorld.scala
    scala> :q
    

  6. scalac로 컴파일합니다.

    $ scalac HelloWorld.scala
    

  7. 컴파일된 .class 파일을 나열합니다.

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

SBT 사용

  1. SBT를 다운로드합니다.

  2. 아래 표시된 대로 'HelloWorld' 프로젝트를 만듭니다.

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

  3. sbt.build 구성 파일을 만들어서 artifactName(아래 나와 있는 대로 생성하는 jar 파일의 이름)을 'HelloWorld.jar'로 설정합니다(기본 아티팩트 수정 참조).

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

  4. 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 ...
    

  5. 기본 클래스 시작점을 지정하는 매니페스트(HelloWorld)가 있는 jar 파일에 코드를 패키지화한 다음 종료합니다.

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

jar 만들기

SBT 또는 jar 명령어를 사용하여 jar 파일을 만듭니다.

SBT를 사용하여 jar 만들기

SBT 패키지 명령어가 jar 파일을 만듭니다(SBT 사용 참조).

수동으로 jar 만들기

  1. 디렉터리(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%)
    

Cloud Storage에 jar 복사

  1. 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

Dataproc Spark 작업에 jar 제출

  1. Google Cloud 콘솔을 사용하여 jar 파일을 Dataproc Spark 작업에 제출합니다. 다음과 같은 작업 제출 페이지의 필드를 작성합니다.

    • 클러스터: 클러스터 목록에서 클러스터 이름을 선택합니다.
    • 작업 유형: Spark
    • 기본 클래스 또는 jar: HelloWorld jar(gs://your-bucket-name/HelloWorld.jar)에 대한 Cloud Storage URI 경로를 지정합니다.

      jar에 코드의 시작점('Main-Class: HelloWorld')을 지정하는 매니페스트가 없는 경우, 'Main class 또는 jar' 입력란에 기본 클래스의 이름("HelloWorld")이 표시되어야 하고 'Jar 파일' 입력란에 jar 파일의 URI 경로(gs://your-bucket-name/HelloWorld.jar)를 입력해야 합니다.

  2. 제출을 클릭하여 작업을 시작합니다. 작업이 시작되면 작업 목록에 추가됩니다.

  3. 작업 ID를 클릭하여 작업의 드라이버 출력을 볼 수 있는 작업 페이지를 엽니다.

클러스터의 spark-shell REPL을 사용하여 Spark Scala 코드 작성 및 실행

Dataproc 클러스터에서 직접 Scala 앱을 개발할 수 있습니다. Hadoop 및 Spark는 Dataproc 클러스터에 사전 설치되고 Cloud Storage 커넥터를 사용하여 구성되므로 코드를 사용하여 Cloud Storage에서 직접 데이터를 읽고 쓸 수 있습니다.

다음 예시는 프로젝트의 Dataproc 클러스터 마스터 노드에 SSH로 연결한 다음 spark-shell REPL을 사용하여 Scala WordCount 맵리듀스 애플리케이션을 만들고 실행하는 방법을 보여줍니다.

  1. Dataproc 클러스터의 마스터 노드에 SSH로 연결합니다.

    1. Google Cloud 콘솔에서 프로젝트의 Dataproc 클러스터 페이지로 이동한 후 클러스터 이름을 클릭합니다.

    2. 클러스터 세부정보 페이지에서 VM 인스턴스 탭을 선택한 후 클러스터 이름 오른쪽에 표시되는 SSH 선택사항을 클릭합니다.

      마스터 노드의 홈 디렉토리에 브라우저 창이 열립니다.

  2. 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. 공용 Cloud Storage에 있는 Shakespeare 텍스트 스니펫에서 RDD(Resilient Distributed Dataset)를 만듭니다.

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

  4. 텍스트에서 WordCount 맵리듀스를 실행한 다음 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. Cloud Storage에서 <bucket-name>/wordcounts-out에 수를 저장한 다음 scala-shell을 종료합니다.

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

  6. 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
    

  7. 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 마스터 노드는 표준 Apache Hadoop 및 Spark 예시가 있는 실행 가능한 jar 파일을 포함합니다.

Jar 유형 Master node /usr/lib/ location GitHub 출처 Apache 문서
Hadoop hadoop-mapreduce/hadoop-mapreduce-examples.jar 출처 링크 맵리듀스 가이드
Spark spark/lib/spark-examples.jar 출처 링크 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

다음 단계