Spark, SBT / HelloWorld

Jeonghak Cho·2025년 3월 25일

Spark

목록 보기
1/12

📗스파크 애플리케이션 구축은 어떻게 하나

단독 실행 가능한 기본 적인 애플리케이션을 구축하고 스파크 플랫폼으로 옮겨 실행하는 과정을 보여준다.

  • 목표 애플리케이션 구축하기
    • 프로젝트 관리 도구 설치
    • 신규 프로젝트 생성
    • 애플리케이션 구축
    • 단위 테스트
    • 스파크 서버 실행
    • 스파크에서 애플리케이션 실행

[목차]

HelloWorld 애플리케이션 구축하기

프로젝트 관리 도구 SBT 설치 ( 우분투 기준 )

wget https://github.com/sbt/sbt/releases/download/v1.9.7/sbt-1.9.7.tgz
tar xvf sbt-1.9.7.tgz

sudo mv sbt /usr/local/sbt

echo 'export PATH=/usr/local/sbt/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

ubuntu@DESKTOP-SCOK45O:~/myspark$ sbt sbtVersion
copying runtime jar...
[info] [launcher] getting org.scala-sbt sbt 1.9.7  (this may take some time)...
[info] [launcher] getting Scala 2.12.18 (for sbt)...
[warn] No sbt.version set in project/build.properties, base directory: /home/ubuntu/myspark
[info] welcome to sbt 1.9.7 (Ubuntu Java 17.0.14)
[info] set current project to myspark (in build file:/home/ubuntu/myspark/)
[info] 1.9.7

⚙️ Spark 버전에 따른 지원 Scala 버전

Spark 버전지원 Scala 버전
3.5.x2.12, 2.13
3.4.x2.12, 2.13
3.3.x2.12
3.2.x2.12
3.1.x2.12
3.0.x2.12

⚙️ Scala 버전에 따른 권장 sbt 버전

Scala 버전권장 sbt 버전
2.13.x1.5.5 이상
2.12.x1.3.0 이상
2.11.x1.2.0 이하

⚙️ 호환 JDK

JDK 8 또는 11

sudo apt install openjdk-11-jdk
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

SBT로 신규 프로젝트 생성

:label: SBT로 신규 프로젝트 생성 시 템플릿 선택을 해야 한다. spark는 scala3을 지원하지 않는다.

sbt new scala/scala-seed.g8 --name=HelloWorld --organization=com.mycompany
cd helloworld

SBT 의 스칼라 버전을 2.12.18로 바꾼다. 최신 스파크 이미지를 받았을 때 참조하고 있는 스칼라 버전과 동기화하는 과정이다.

build.sbt 파일을 수정한다.

import Dependencies._

ThisBuild / scalaVersion     := "2.12.18"
ThisBuild / version          := "0.1.0-SNAPSHOT"
ThisBuild / organization     := "com.example"
ThisBuild / organizationName := "example"

lazy val root = (project in file("."))
  .settings(
    name := "HelloWorld",
    libraryDependencies += munit % Test
  )

SBT RUN 실행 시 "Hello" 확인이 가능하다.

⚙️ SBT 템플릿 종류

템플릿 이름설명
scala/scala-seed.g8기본적인 Scala 프로젝트를 시작하기 위한 템플릿
scala/scala3.g8Scala 3 버전을 사용하는 프로젝트를 위한 템플릿
scala/scalatest-example.g8ScalaTest를 활용한 테스트 예제를 포함한 템플릿
akka/akka-quickstart-scala.g8Akka를 활용한 Scala 프로젝트의 빠른 시작을 위한 템플릿
sbt/sbt-autoplugin.g8sbt 0.13.5+ 버전용 AutoPlugin을 생성하기 위한 템플릿
lewismj/sbt-template.g8멀티 모듈 프로젝트를 위한 sbt 템플릿으로, 애플리케이션과 모듈을 포함

SCALA Main 소스 작성

vi src/main/scala/example/Hello.scala

-파일 내용 수정

package example

object Hello extends Greeting with App {
  println(greeting)
}

trait Greeting {
  lazy val greeting: String = "Hello, Spark!"
}

SBT RUN 실행 시 "Hello, Spark!" 확인이 가능하다.

단위 테스트

실행 결과값을 단위 테스트 할 수 있다.

vi src/test/scala/example/HelloSpec.scala
package example

class HelloSpec extends munit.FunSuite {
  test("say hello") {
    assertEquals(Hello.greeting, "Hello, Spark!")
  }
}

sbt test 명령 실행을 통해 테스트 결과를 확인한다.

example.HelloSpec:
  + say hello 0.027s
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
[success] Total time: 3 s, completed Mar 25, 2025, 11:42:26 AM

스파크 서버 실행

Spark 서버는 도커를 사용했다. 도커로 스파크 서버를 실행한다. (컨테이너 내부의 /workspace 폴더와 현재 작업 폴더 Mount)

docker run -d \
  --name spark-master \
  -p 8080:8080 \
  -p 7077:7077 \
  -p 4040:4040 \
  -v $(pwd):/workspace \
  bitnami/spark:latest
  • 스파크 서버 확인
ubuntu@DESKTOP-SCOK45O:~/myspark/helloworld$ docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED       STATUS       PORTS
                                      NAMES
696db11c4d6e   bitnami/spark:latest   "/opt/bitnami/script…"   3 hours ago   Up 3 hours   0.0.0.0:4040->4040/tcp, [::]:4040->4040/tcp, 0.0.0.0:7077->7077/tcp, [::]:7077->7077/tcp, 0.0.0.0:8080->8080/tcp, [::]:8080->8080/tcp   spark-master

스파크에서 HelloWorld 애플리케이션 실행

패키징

  • jar 파일로 패키징한다.
sbt clean package
  • 빌드된 jar가 원하는 클래스를 포함하는 지 확인한다.
ubuntu@DESKTOP-SCOK45O:~/myspark/helloworld$ jar tf target/scala-2.12/helloworld_2.12-0.1.0-SNAPSHOT.jar | grep Hello
example/Hello$.class
example/Hello$delayedInit$body.class
example/Hello.class

spark-submt 실행

도커에서 실행 중인 스파크 서버에게 패키징 된 HelloWorld 애플리케이션을 실행한다. Hello, Spark! 라고 결과가 나옴을 확인할 수 있다.

ubuntu@DESKTOP-SCOK45O:~/myspark/helloworld$ docker exec -it 383fd62c157d spark-submit --master local[*] /workspace/helloworld/target/scala-2.12/helloworld_2.12-0.1.0-SNAPSHOT.jar
25/03/25 02:51:04 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Hello, Spark!
25/03/25 02:51:04 INFO ShutdownHookManager: Shutdown hook called
25/03/25 02:51:04 INFO ShutdownHookManager: Deleting directory /tmp/spark-ffed1560-db93-4520-b339-ef35dd44cc21

0개의 댓글