단독 실행 가능한 기본 적인 애플리케이션을 구축하고 스파크 플랫폼으로 옮겨 실행하는 과정을 보여준다.
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 버전 |
|---|---|
| 3.5.x | 2.12, 2.13 |
| 3.4.x | 2.12, 2.13 |
| 3.3.x | 2.12 |
| 3.2.x | 2.12 |
| 3.1.x | 2.12 |
| 3.0.x | 2.12 |
| Scala 버전 | 권장 sbt 버전 |
|---|---|
| 2.13.x | 1.5.5 이상 |
| 2.12.x | 1.3.0 이상 |
| 2.11.x | 1.2.0 이하 |
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
: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" 확인이 가능하다.
| 템플릿 이름 | 설명 |
|---|---|
| scala/scala-seed.g8 | 기본적인 Scala 프로젝트를 시작하기 위한 템플릿 |
| scala/scala3.g8 | Scala 3 버전을 사용하는 프로젝트를 위한 템플릿 |
| scala/scalatest-example.g8 | ScalaTest를 활용한 테스트 예제를 포함한 템플릿 |
| akka/akka-quickstart-scala.g8 | Akka를 활용한 Scala 프로젝트의 빠른 시작을 위한 템플릿 |
| sbt/sbt-autoplugin.g8 | sbt 0.13.5+ 버전용 AutoPlugin을 생성하기 위한 템플릿 |
| lewismj/sbt-template.g8 | 멀티 모듈 프로젝트를 위한 sbt 템플릿으로, 애플리케이션과 모듈을 포함 |
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
sbt clean package
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
도커에서 실행 중인 스파크 서버에게 패키징 된 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