---
title: "Spark Scala Job 제출"
slug: "hadoop-chadoop-4-5"
updated: 2026-05-21T09:01:30Z
published: 2026-05-21T09:03:08Z
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 제출

<p class='platform-info type-classic'>Classic 환경에서 이용 가능합니다 .</p>

이 가이드에서는 Spark Scala Job을 생성하고 Cloud Hadoop 클러스터에 제출하는 방법에 대해서 설명합니다.

## Scala 코드 작성 및 컴파일<a name="Scala코드작성및컴파일"></a>

Spark 애플리케이션을 Scala로 작성하고 jar로 패키징하는 방법은 다음 두 가지가 있습니다.

1. [터미널에서 Scala 사용](#1-터미널에서-scala-사용)
2. [IntelliJ SBT 플러그인 사용](#2-intellij-sbt-플러그인-사용)

### 1. 터미널에서 Scala 사용<a name="1터미널에서Scala사용"></a>

터미널에서 `HelloScala`를 출력하는 Scala 코드를 작성한 뒤 컴파일하여 jar로 패키징하는 예시를 들어 설명합니다.

#### Scala 바이너리 파일 다운로드<a name="Scala바이너리파일다운로드"></a>

[Scala 바이너리](https://www.scala-lang.org/download/){target="_blank"}를 다운로드하고 압축을 풀어 주십시오.

MacOS에서 homebrew를 사용하는 경우 다음과 같이 설치할 수 있습니다.

```bash
brew install scala
```

#### 환경변수 설정<a name="환경변수설정"></a>

다음 명령어를 사용하여 실행 파일(예: `.bashrc`)에 `SCALA_HOME` 환경변수를 설정하고, `PATH`에 `$SCALA_HOME`을 추가해 주십시오.

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

#### Spark 애플리케이션 작성<a name="Spark애플리케이션작성"></a>
Spark 애플리케이션을 작성하는 방법은 다음과 같습니다.

1. Scala REPL을 실행한 후 `scala`를 실행해 주십시오.

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

2. 다음과 같이 `HelloWorld.scala` class를 작성한 후 저장해 주십시오.

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

  ```
  scala> :save HelloWorld.scala
  scala> :q
  ```

3. 다음 명령어를 사용하여 `scalac`로 컴파일해 주십시오.

  ```bash
  ❯ scalac  HelloWorld.scala
  ```

4. `ls` 명령어를 사용하여 정상적으로 컴파일되었는지 `.class` 파일을 확인해 주십시오.

  ```
  ❯ ls HelloWorld*.class
  HelloWorld$.class HelloWorld.class
  ```

#### jar 파일 생성<a name="jar파일생성"></a>
jar 파일을 생성하는 방법은 다음과 같습니다.

:::(Info) (참고)
 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%)
  ```

2. 패키징된 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 플러그인 사용<a name="2IntelliJSBT플러그인사용"></a>

이 가이드에서는 Spark 애플리케이션 개발 및 디버그하기 위한 환경을 IntelliJ에 설정하고 `Hello Scala`라는 WordCount Job을 빌드하는 방법을 예시로 설명합니다.
   * 빌드 매니저: SBT
   * 예시 작성 환경: Windows OS, IntelliJ Ultimate 2022.1.4

#### 프로젝트 생성<a name="프로젝트생성"></a>

프로젝트를 생성하는 방법은 다음과 같습니다.

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){height="" width="70%"}

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){height="" width="70%"}

2. 홈 화면 좌측 메뉴에서 **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){height="" width="70%"}

3. 다음과 같이 **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){height="" width="70%"}
    
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){height="" width="70%"}


#### SBT 라이브러리 가져오기 <a name="SBT라이브러리가져오기"></a>
IntelliJ가 Spark 코드를 인식하기 위해서는 spark-core 라이브러리와 문서를 가져와야 합니다.

:::(Info) (참고)
* spark-core 라이브러리는 특정 버전의 Scala와 호환되기 때문에 라이브러리를 가져올 경우에는 spark-core와 Scala 버전을 각각 확인해 주십시오.
:::

1. [mvn repository](https://mvnrepository.com/artifact/org.apache.spark/spark-core){target="_blank"}에서 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){height="" width="50%"}

2. **Target > build.sbt**를 클릭한 후 스크립트 창에 아래와 같은 내용을 추가해 주십시오.

  ```
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.6.0"
  ```

3. 라이브러리를 정상적으로 가져왔는지 Build 콘솔을 통해 확인해 주십시오.

    ![chadoop-4-6-007_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-007_ko.png){height="" width="70%"}


:::(Info) (참고)
 SBT에서 라이브러리를 가져올 때는 다음과 같은 구문(syntax)을 사용해 주십시오.
 
 ```
 Group Id %% Artifact Id % Revision
 ```
:::

#### Spark 애플리케이션 작성<a name="SparkApplication작성"></a>

여기서는 셰익스피어 소넷 텍스트 파일(`shakespeare.txt`)을 데이터 셋으로 사용하여, 소넷에 포함된 단어를 세는 WordCount 애플리케이션 작성 방법을 예시로 설명합니다.

1. [shakespeare.txt](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/shakespeare.txt){target="_blank"}을 다운로드하여 `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){height="" width="40%"}

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){height="" width=""}

4. 정상적으로 설정되었는지 `WordCount.scala`에 아래와 같은 샘플 코드를 작성한 후 실행해 주십시오.

  ```scala
  object WordCount {
      def main(args: Array[String]): Unit = {
        println("This is WordCount application")
      }
  }
  ```

5. 아래와 같이 정상적으로 출력되었는지 확인해 주십시오.
![chadoop-4-6-011_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-011_ko.png){height="" width="70%"}

6. `WordCount.scala`에 적용했던 샘플 코드를 삭제한 후, 셰익스피어 소넷 텍스트 파일의 단어 수를 세는 코드를 아래와 같이 작성해 주십시오.

  ```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")
  }

}
  ```

:::(Info) (참고)
**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://`
:::

7. `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){height="" width="70%"}


#### jar 파일 생성<a name="jar파일생성"></a>

1. Object Storage 버킷에 데이터 셋을 업로드한 후 소스코드의 `resource` 파일 경로를 다음과 같이 변경해 주십시오.
   * 데이터 셋을 `HDFS`에 업로드해서 사용하려면 `s3a://` 대신에 `hdfs://`를 사용해 주십시오.

  ```scala
  // 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");
  ```

  :::(Info) (참고)
  이 가이드는 Spark 1.6을 기준으로 하므로 `conf.setMaster()`에서 `yarn-cluster`로 명시해야 합니다. Spark 2부터는 `yarn`으로 사용 가능합니다.
  :::

2. Terminal 콘솔에서 다음 명령어를 사용하여, 업데이트한 코드를 Cloud Hadoop 클러스터에 제출할 수 있도록 compiled jar로 패키징해 주십시오.
   * jar 파일에는 애플리케이션 코드와 `build.sbt`에 정의한 모든 dependencies가 포함되어 있습니다.
   * `sbt package` 명령은 `$PROJECT_HOME/target/scala-2.11` 아래에 `wordcount_2.11-0.1.jar` 파일을 생성합니다.

  ```bash
  > 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){height="" width="70%"}

## Cloud Hadoop 클러스터에 Spark Job 제출<a name="CloudHadoop클러스터에SparkJob제출"></a>

로컬에서 작성한 Spark 애플리케이션(.jar)을 Cloud Hadoop에 배포하여 제출하는 방법을 설명합니다.

#### Object Storage에 jar 업로드<a name="ObjectStorage에jar업로드"></a>

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){height="" width="80%"}

#### Job 제출<a name="Job제출"></a>

jar 파일을 클러스터에 제출하는 두 가지 방법에 대해서 설명합니다.

:::(Info) (참고)
`spark-defaults.conf`에 다음과 같은 property가 제대로 설정되어 있어야 합니다.
```
spark.hadoop.fs.s3a.access.key=<OBEJCT-STORAGE-ACCESS-KEY>
spark.hadoop.fs.s3a.endpoint=http://kr.objectstorage.ncloud.com
spark.hadoop.fs.s3a.secret.key=<OBJECT-STORAGE-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){height="" width="80%"}

* Spark 클라이언트 노드에서 제출
1. 클러스터에서 Spark 클라이언트가 설치된 노드에서 다음과 같이 `spark-submit` 명령을 실행해 주십시오.

  ```bash
  spark-submit --class WordCount --master yarn-cluster --deploy-mode cluster s3a://deepdrive-hue/tmp/wordcount_2.11-0.1.jar
  ```

2. Job 실행이 완료되면 아래와 같이 결과가 지정한 버킷 경로 안에 저장되어 있는지 확인해 주십시오.
![chadoop-4-6-015_ko.png](https://cdn.document360.io/f2d93c92-8957-408f-94df-b9b370f76a32/Images/Documentation/chadoop-4-6-015_ko.png){height="" width="80%"}

:::(Info) (참고)
**Deploy mode**는 배포 환경에서 드라이버(SparkContext)가 실행되는 위치에 따라 결정됩니다. 모드에는 아래와 같은 옵션이 있습니다.
* `client` (기본값): Spark 애플리케이션이 실행되는 머신에서 드라이버가 실행
* `cluster`: 클러스터 안의 랜덤한 노드 안에서 드라이버가 실행

`spark-submit` 명령어의 `--deploy-mode` CLI 옵션, 또는 Spark property 구성에서 `spark.submit.deployMode`로 변경할 수 있습니다.
:::
