--- title: "Spark Scala Job 제출" slug: "hadoop-chadoop-4-5" updated: 2026-10-22T09:13:19Z published: 2026-10-22T09:13:19Z canonical: "guide-gov.ncloud-docs.com/hadoop-chadoop-4-5" --- > ## Documentation Index > Fetch the complete documentation index at: https://guide-gov.ncloud-docs.com/llms.txt > Use this file to discover all available pages before exploring further. # Spark Scala Job 제출 Classic 환경에서 이용 가능합니다 . 이 가이드에서는 Spark Scala Job을 생성하고 Cloud Hadoop 클러스터에 제출하는 방법에 대해서 설명합니다. ## Scala 코드 작성 및 컴파일 Spark 애플리케이션을 Scala로 작성하고 jar로 패키징하는 방법은 다음 두 가지가 있습니다. 1. [터미널에서 Scala 사용](/docs/hadoop-chadoop-4-5#1-%ED%84%B0%EB%AF%B8%EB%84%90%EC%97%90%EC%84%9C-scala-%EC%82%AC%EC%9A%A9) 2. [IntelliJ SBT 플러그인 사용](/docs/hadoop-chadoop-4-5#2-intellij-sbt-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-%EC%82%AC%EC%9A%A9) ### 1. 터미널에서 Scala 사용 터미널에서 `HelloScala`를 출력하는 Scala 코드를 작성한 뒤 컴파일하여 jar로 패키징하는 예시를 들어 설명합니다. #### Scala 바이너리 파일 다운로드 [Scala 바이너리](https://www.scala-lang.org/download/)를 다운로드하고 압축을 풀어 주십시오. MacOS에서 homebrew를 사용하는 경우 다음과 같이 설치할 수 있습니다. ``` brew install scala ``` #### 환경변수 설정 다음 명령어를 사용하여 실행 파일(예: `.bashrc`)에 `SCALA_HOME` 환경변수를 설정하고, `PATH`에 `$SCALA_HOME`을 추가해 주십시오. ``` export SCALA_HOME=/usr/local/share/scala export PATH=$PATH:$SCALA_HOME/ ``` #### Spark 애플리케이션 작성 Spark 애플리케이션을 작성하는 방법은 다음과 같습니다. 1. Scala REPL을 실행한 후 `scala`를 실행해 주십시오. ``` ❯ scala # Welcome to Scala version ... # Type in expressions to have them evaluated. # Type :help for more information. # scala> ``` 1. 다음과 같이 `HelloWorld.scala` class를 작성한 후 저장해 주십시오. ``` object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } } ``` ``` scala> :save HelloWorld.scala scala> :q ``` 1. 다음 명령어를 사용하여 `scalac`로 컴파일해 주십시오. ``` ❯ scalac HelloWorld.scala ``` 1. `ls` 명령어를 사용하여 정상적으로 컴파일되었는지 `.class` 파일을 확인해 주십시오. ``` ❯ ls HelloWorld*.class HelloWorld$.class HelloWorld.class ``` #### jar 파일 생성 jar 파일을 생성하는 방법은 다음과 같습니다. 참고 jar 명령어를 실행하려면, Java SE, JRE가 설치되어 있어야 합니다. 1. `HelloWorld*.class` 파일이 있는 디렉토리로 이동한 후, 다음 명령어를 사용하여 클래스 파일을 jar로 패키징해 주십시오. ``` ❯ jar cvfe HelloWorld.jar HelloWorld HelloWorld*.class added manifest adding: HelloWorld$.class(in = 670) (out= 432)(deflated 35%) adding: HelloWorld.class(in = 645) (out= 524)(deflated 18%) ``` 1. 패키징된 jar 파일에서 HelloWorld class가 애플리케이션의 **entry point**로 설정되어 있는지 **MANIFEST.MF**에서 확인해 주십시오. ``` ❯ unzip -q -c HelloWorld.jar META-INF/MANIFEST.MF Manifest-Version: 1.0 Created-By: 1.8.0_181 (Oracle Corporation) Main-Class: HelloWorld # entry point ``` ### 2. IntelliJ SBT 플러그인 사용 이 가이드에서는 Spark 애플리케이션 개발 및 디버그하기 위한 환경을 IntelliJ에 설정하고 `Hello Scala`라는 WordCount Job을 빌드하는 방법을 예시로 설명합니다. - 빌드 매니저: SBT - 예시 작성 환경: Windows OS, IntelliJ Ultimate 2022.1.4 #### 프로젝트 생성 프로젝트를 생성하는 방법은 다음과 같습니다. IntelliJ를 실행하여 주십시오. 1. 좌측의 **Plugins** 메뉴에서 **Scala**를 검색하여 설치해 주십시오. ![chadoop-4-6-002_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-002_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 2. 플러그인을 반영하기 위해서는 재시작이 필요합니다. **[Restart IDE]** 버튼을 클릭하여 IntelliJ를 재시작해 주십시오. ![chadoop-4-6-restart_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-restart_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 3. 홈 화면 좌측 메뉴에서 **Projects**를 클릭한 후, **New Project**를 클릭해 주십시오. ![chadoop-4-6-003_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-003_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 4. 다음과 같이 **Scala**와 **sbt**를 선택한 후, **[Create]** 버튼을 클릭해 주십시오. - 프로젝트 이름: `WordCount`로 지정 - **Scala**와 **sbt** 버전을 선택 ![chadoop-4-6-004_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-004_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 5. 프로젝트가 정상적으로 생성되었는지 확인해 주십시오. - 프로젝트가 생성되면 기본적으로 다음과 같은 구조의 디렉터리 및 파일 정보를 확인할 수 있습니다. - **.idea**: IntelliJ 구성 파일 - **project**: 컴파일에 사용되는 파일 - **src** : 소스코드. 애플리케이션 코드의 대부분은 `src/main`에 있어야 함. `src/test`는 테스트 스크립트를 위한 공간. - **target** : 프로젝트를 컴파일하면 이 위치에 저장 - **build.sbt** : SBT 구성 파일 ![chadoop-4-6-006_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-006_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) #### SBT 라이브러리 가져오기 IntelliJ가 Spark 코드를 인식하기 위해서는 spark-core 라이브러리와 문서를 가져와야 합니다. 참고 - spark-core 라이브러리는 특정 버전의 Scala와 호환되기 때문에 라이브러리를 가져올 경우에는 spark-core와 Scala 버전을 각각 확인해 주십시오. 1. [mvn repository](https://mvnrepository.com/artifact/org.apache.spark/spark-core)에서 spark-core 라이브러리와 Artifact Id와 함께 호환되는 Scala 버전을 확인해 주십시오. ![chadoop-4-6-008_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-008_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 2. **Target > build.sbt**를 클릭한 후 스크립트 창에 아래와 같은 내용을 추가해 주십시오. ``` libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0" ``` 1. 라이브러리를 정상적으로 가져왔는지 Build 콘솔을 통해 확인해 주십시오. ![chadoop-4-6-007_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-007_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 참고 SBT에서 라이브러리를 가져올 때는 다음과 같은 구문(syntax)을 사용해 주십시오. ``` Group Id %% Artifact Id % Revision ``` #### Spark 애플리케이션 작성 여기서는 셰익스피어 소넷 텍스트 파일(`shakespeare.txt`)을 데이터 셋으로 사용하여, 소넷에 포함된 단어를 세는 WordCount 애플리케이션 작성 방법을 예시로 설명합니다. 1. [shakespeare.txt](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/shakespeare.txt?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D)을 다운로드하여 `src/main/resources`에 저장해 주십시오. - Cloud Hadoop 클러스터에서 이 애플리케이션을 실행할 때에는 S3 버킷 또는 HDFS에 데이터 셋을 업로드해서 사용합니다. ![chadoop-4-6-009_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-009_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 2. `src > main`를 선택해 디렉터리를 확장하고, `scala` 디렉터리를 마우스 오른쪽 버튼으로 클릭한 후 **New > Scala Class**를 클릭해 주십시오. 3. `WordCount/src/main/scala` 아래 새로운 클래스를 생성해 주십시오. - **Kind**: `Object` ![chadoop-4-6-010_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-010_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 4. 정상적으로 설정되었는지 `WordCount.scala`에 아래와 같은 샘플 코드를 작성한 후 실행해 주십시오. ``` object WordCount { def main(args: Array[String]): Unit = { println("This is WordCount application") } } ``` 1. 아래와 같이 정상적으로 출력되었는지 확인해 주십시오. ![chadoop-4-6-011_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-011_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 2. `WordCount.scala`에 적용했던 샘플 코드를 삭제한 후, 셰익스피어 소넷 텍스트 파일의 단어 수를 세는 코드를 아래와 같이 작성해 주십시오. ``` import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]) : Unit = { //Create a SparkContext to initialize Spark val conf = new SparkConf() conf.setMaster("local") conf.setAppName("Word Count") val sc = new SparkContext(conf) // Load the text into a Spark RDD, which is a distributed representation of each line of text val textFile = sc.textFile("src/main/resources/shakespeare.txt") //word count val counts = textFile.flatMap(line => line.split(" ")) .map(word => (word, 1)) .reduceByKey(_ + _) counts.foreach(println) System.out.println("Total words: " + counts.count()) counts.saveAsTextFile("/tmp/sonnetWordCount") } } ``` 참고 **Master URLs** Spark 배포 환경에 따라 Master URL이 달라집니다. - **Local(pseudo-cluster)** : `local`, `local[N]`, `local[*]` (사용하는 thread 수에 따라 나뉨, '*'은 JVM에서 최대한 사용할 수 있는 프로세서만큼의 threads를 사용) - **Clustered** **Spark Standalone:** `spark://host:port,host1:port1...` **Spark on Hadoop YARN:** `yarn` **Spark on Apache Mesos:** `mesos://` 1. `WordCount.scala`를 실행하여 출력 결과를 확인해 주십시오. ![chadoop-4-6-012_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-012_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) #### jar 파일 생성 1. Object Storage 버킷에 데이터 셋을 업로드한 후 소스코드의 `resource` 파일 경로를 다음과 같이 변경해 주십시오. - 데이터 셋을 `HDFS`에 업로드해서 사용하려면 `s3a://` 대신에 `hdfs://`를 사용해 주십시오. ``` // FROM conf.setMaster("local") // TO conf.setMaster("yarn-cluster") // FROM val textFile = sc.textFile("src/main/resources/shakespeare.txt") // TO val textFile = sc.textFile("s3a://deepdrive-hue/tmp/shakespeare.txt") // FROM counts.saveAsTextFile("/tmp/sonnetWordCount"); // TO counts.saveAsTextFile("s3a://deepdrive-hue/tmp/sonnetWordCount"); ``` 참고 이 가이드는 Spark 1.6을 기준으로 하므로 `conf.setMaster()`에서 `yarn-cluster`로 명시해야 합니다. Spark 2부터는 `yarn`으로 사용 가능합니다. 1. Terminal 콘솔에서 다음 명령어를 사용하여, 업데이트한 코드를 Cloud Hadoop 클러스터에 제출할 수 있도록 compiled jar로 패키징해 주십시오. - jar 파일에는 애플리케이션 코드와 `build.sbt`에 정의한 모든 dependencies가 포함되어 있습니다. - `sbt package` 명령은 `$PROJECT_HOME/target/scala-2.11` 아래에 `wordcount_2.11-0.1.jar` 파일을 생성합니다. ``` > cd ~/IdeaProjects/WordCount # PROJECT_HOME > sbt package ``` ![chadoop-4-6-terminal_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-terminal_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) ## Cloud Hadoop 클러스터에 Spark Job 제출 로컬에서 작성한 Spark 애플리케이션(.jar)을 Cloud Hadoop에 배포하여 제출하는 방법을 설명합니다. #### Object Storage에 jar 업로드 Hue의 S3 브라우저 또는 Object Storage 콘솔을 사용하여 `shakespeare.txt`와 jar를 Object Storage 버킷에 복사해 주십시오. - Hue 접속 및 사용에 대한 자세한 내용은 [Hue 사용](/docs/hadoop-chadoop-4-3) 가이드를 참고해 주세요. - Object Storage 버킷에 대한 자세한 내용은 [Obeject Storage 개요](/docs/storage-storage-6-1) 가이드를 참고해 주십시오. ![chadoop-4-6-013_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-013_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) #### Job 제출 jar 파일을 클러스터에 제출하는 두 가지 방법에 대해서 설명합니다. 참고 `spark-defaults.conf`에 다음과 같은 property가 제대로 설정되어 있어야 합니다. ``` spark.hadoop.fs.s3a.access.key= spark.hadoop.fs.s3a.endpoint=http://kr.objectstorage.ncloud.com spark.hadoop.fs.s3a.secret.key= spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem ``` - Hue의 **Spark Submit Jar** 이용 ![chadoop-4-6-014_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-014_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) - Spark 클라이언트 노드에서 제출 1. 클러스터에서 Spark 클라이언트가 설치된 노드에서 다음과 같이 `spark-submit` 명령을 실행해 주십시오. ``` spark-submit --class WordCount --master yarn-cluster --deploy-mode cluster s3a://deepdrive-hue/tmp/wordcount_2.11-0.1.jar ``` 1. Job 실행이 완료되면 아래와 같이 결과가 지정한 버킷 경로 안에 저장되어 있는지 확인해 주십시오. ![chadoop-4-6-015_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-015_ko.png?sv=2026-02-06&spr=https&st=2026-10-29T12%3A50%3A41Z&se=2026-10-29T13%3A50%3A41Z&sr=c&sp=r&sig=tnWr%2BAFrqnF5expycg8SVpgKqYz25XLa%2BUrUC4sP9qc%3D) 참고 **Deploy mode**는 배포 환경에서 드라이버(SparkContext)가 실행되는 위치에 따라 결정됩니다. 모드에는 아래와 같은 옵션이 있습니다. - `client` (기본값): Spark 애플리케이션이 실행되는 머신에서 드라이버가 실행 - `cluster`: 클러스터 안의 랜덤한 노드 안에서 드라이버가 실행 `spark-submit` 명령어의 `--deploy-mode` CLI 옵션, 또는 Spark property 구성에서 `spark.submit.deployMode`로 변경할 수 있습니다.