이 가이드에서는 다음과 같이 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 프로젝트 설정
아직 설정하지 않은 경우 다음 단계에 따라 설정하세요.
로컬에서 Scala 코드 작성 및 컴파일
이 가이드에 대한 간단한 과제로 Scala REPL 또는 SBT 명령줄 인터페이스를 사용하여 개발 머신에서 로컬로 'Hello World' Scala 앱을 작성하세요.
Scala 사용
- Scala 설치 페이지에서 Scala 바이너리를 다운로드합니다.
Scala 설치 지침에 표시된 대로 파일의 압축을 풀고
SCALA_HOME
환경 변수를 설정한 다음 경로에 추가합니다. 예를 들면 다음과 같습니다.export SCALA_HOME=/usr/local/share/scala export PATH=$PATH:$SCALA_HOME/
Scala REPL을 실행합니다.
$ scala Welcome to Scala version ... Type in expressions to have them evaluated. Type :help for more information. scala>
HelloWorld
코드를 복사하여 Scala REPL에 붙여넣습니다.object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
HelloWorld.scala
를 저장하고 REPL을 종료합니다.scala> :save HelloWorld.scala scala> :q
scalac
로 컴파일합니다.$ scalac HelloWorld.scala
컴파일된
.class
파일을 나열합니다.$ ls HelloWorld*.class HelloWorld$.class HelloWorld.class
SBT 사용
아래 표시된 대로 'HelloWorld' 프로젝트를 만듭니다.
$ mkdir hello $ cd hello $ echo \ 'object HelloWorld {def main(args: Array[String]) = println("Hello, world!")}' > \ HelloWorld.scala
sbt.build
구성 파일을 만들어서artifactName
(아래 나와 있는 대로 생성하는 jar 파일의 이름)을 'HelloWorld.jar'로 설정합니다(기본 아티팩트 수정 참조).echo \ 'artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) => "HelloWorld.jar" }' > \ build.sbt
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 ...
기본 클래스 시작점을 지정하는 매니페스트(
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 만들기
- 디렉터리(
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 복사
- 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 제출
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
)를 입력해야 합니다.
제출을 클릭하여 작업을 시작합니다. 작업이 시작되면 작업 목록에 추가됩니다.
작업 ID를 클릭하여 작업의 드라이버 출력을 볼 수 있는 작업 페이지를 엽니다.
클러스터의 spark-shell
REPL을 사용하여 Spark Scala 코드 작성 및 실행
Dataproc 클러스터에서 직접 Scala 앱을 개발할 수 있습니다. Hadoop 및 Spark는 Dataproc 클러스터에 사전 설치되고 Cloud Storage 커넥터를 사용하여 구성되므로 코드를 사용하여 Cloud Storage에서 직접 데이터를 읽고 쓸 수 있습니다.
다음 예시는 프로젝트의 Dataproc 클러스터 마스터 노드에 SSH로 연결한 다음 spark-shell REPL을 사용하여 Scala WordCount 맵리듀스 애플리케이션을 만들고 실행하는 방법을 보여줍니다.
Dataproc 클러스터의 마스터 노드에 SSH로 연결합니다.
Google Cloud 콘솔에서 프로젝트의 Dataproc 클러스터 페이지로 이동한 후 클러스터 이름을 클릭합니다.
클러스터 세부정보 페이지에서 VM 인스턴스 탭을 선택한 후 클러스터 이름 오른쪽에 표시되는 SSH 선택사항을 클릭합니다.
마스터 노드의 홈 디렉토리에 브라우저 창이 열립니다.
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>
공용 Cloud Storage에 있는 Shakespeare 텍스트 스니펫에서 RDD(Resilient Distributed Dataset)를 만듭니다.
scala> val text_file = sc.textFile("gs://pub/shakespeare/rose.txt")
텍스트에서 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))
Cloud Storage에서
<bucket-name>/wordcounts-out
에 수를 저장한 다음scala-shell
을 종료합니다.scala> wordCounts.saveAsTextFile("gs://<bucket-name>/wordcounts-out/") scala> exit
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
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