이 튜토리얼에서는 다음과 같이 Spark Scala 작업을 만들고 Dataproc 클러스터에 제출하는 다양한 방법에 대해 설명합니다.
- Scala REPL(읽기-평가-인쇄-루프 또는 대화형 인터프리터) 또는 SBT 빌드 도구를 사용하여 명령줄에서 로컬 머신에 Spark Scala 'Hello World' 앱을 작성 및 컴파일
- 컴파일된 Scala 클래스를 매니페스트가 있는 jar 파일에 패키지화
- Scala jar을 Dataproc 클러스터에서 실행되는 Spark 작업에 제출
- Google Cloud 콘솔의 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(탄력적 분산 데이터 세트)를 만듭니다.
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