---
title: "Spark Scala Job 제출"
slug: "chadoop-app4-vpc"
updated: 2026-05-21T09:01:28Z
published: 2026-05-21T09:03:07Z
canonical: "guide-gov.ncloud-docs.com/chadoop-app4-vpc"
---

> ## 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 제출

VPC 환경에서 이용 가능합니다.

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

## Scala 코드 작성 및 컴파일

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

1. [터미널에서 Scala 사용](/docs/chadoop-app4-vpc#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/chadoop-app4-vpc#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)
2. 플러그인을 반영하기 위해서는 재시작이 필요합니다. **[Restart IDE]** 버튼을 클릭하여 IntelliJ를 재시작해 주십시오. ![chadoop-4-6-restart_ko.png](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/chadoop-4-6-restart_ko.png)
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)
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)
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)

#### 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)
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)

          참고

          

SBT에서 라이브러리를 가져올 때는 다음과 같은 구문(syntax)을 사용해 주십시오.

```
Group Id %% Artifact Id % Revision
```

#### Spark 애플리케이션 작성

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

1. [shakespeare.txt](https://cdn.document360.io/6998976f-9d95-4df8-b847-d375892b92c2/Images/Documentation/shakespeare.txt)을 다운로드하여 `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)
2. `src &gt; 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)
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)
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)

#### 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)

## Cloud Hadoop 클러스터에 Spark Job 제출

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

#### Object Storage에 jar 업로드

Hue의 S3 브라우저 또는 Object Storage 콘솔을 사용하여 `shakespeare.txt`와 jar를 Object Storage 버킷에 복사해 주십시오.

- Hue 접속 및 사용에 대한 자세한 내용은 [Hue 사용](/docs/chadoop-app2-vpc) 가이드를 참고해 주세요.
- 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)

#### Job 제출

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

          참고

          

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

          참고

          

**Deploy mode**는 배포 환경에서 드라이버(SparkContext)가 실행되는 위치에 따라 결정됩니다. 모드에는 아래와 같은 옵션이 있습니다.

- `client` (기본값): Spark 애플리케이션이 실행되는 머신에서 드라이버가 실행
- `cluster`: 클러스터 안의 랜덤한 노드 안에서 드라이버가 실행

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