Spark 개발 환경 구축하기 - Scala, IntelliJ, SBT
Spark 애플리케이션을 개발에는 크게 Scala 또는 Python을 사용할 수 있다. 기존에 자바로 개발을 주로 해왔던 개발자라면 Scala를 선호할텐데 개발 환경 세팅을 할때 참조할만한 자료가 많지 않아 직접 프로젝트 세팅을 하며 정리해봤다.
시작하기에 앞서 세 가지 선결 사항이 있다.
- Spark 설치, 환경변수 설정
- Scala 설치
- IntelliJ Scala plugin 설치
설치 방법은 구글에서 쉽게 찾을 수 있다. 본 게시물 최하단에도 참고 링크를 걸어두었다.
1. 프로젝트 생성
이제 Scala, Spark, IntelliJ Scala plugin 설치는 모두 되어있다고 가정하고 IntelliJ 새프로젝트를 생성해보자.
build tool을 선택하면 되는데 sbt가 recommended라고 되어있다. 찾아보니 Task 작성시 Scala 언어를 지원한다는데 아무래도 Scala와의 호환성이 좋기 때문이 아닐까싶다. sbt 자체도 Scala로 작성되었다. 아무튼 Next를 누르고 프로젝트 이름을 정한뒤 Finish를 눌러 프로젝트를 생성해준다.
2. SBT Library dependency 설정
build.sbt 파일을 열어보면 처음엔 이런 상태이다.
name := "MySparkApp" //프로젝트명
version := "0.1"
scalaVersion := "2.13.6"
이제 spark 의존성을 추가하면 된다. spark-core, spark-sql 두 가지를 추가한다.
name := "MySparkApp" //프로젝트명
version := "0.1"
scalaVersion := "2.13.6"
val sparkVersion = "3.1.2" //현재 설치 버전
libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion
sparkVersion은 현재 로컬에 설치된 버전을 기재해준다. 오른쪽 상단에 뜨는 reload 버튼을 눌러보자.
그러면 아래와 같이 오류가 뜨는 경우가 있다.
이유는 Spark 3.1.2 버전에서 Scala 2.13.6 버전을 지원하지 않기 때문이다. 즉, 버전 호환성이 맞지 않는다.
Maven Repository에서 찾아보면..
Scala 2.12 버전을 호환한다. build.sbt에서 Scala 버전을 2.12로 변경한다.
name := "MySparkApp"
version := "0.1"
scalaVersion := "2.12.0" //버전 변경
val sparkVersion = "3.1.2"
libraryDependencies += "org.apache.spark" %% "spark-core" % sparkVersion
libraryDependencies += "org.apache.spark" %% "spark-sql" % sparkVersion
reload 해보면..
3. Spark App 예제 실행
이제 main/scala에서 우클릭을 해 Scala 파일을 생성하면 되는데, 아래처럼 Scala Class가 메뉴에 뜨지 않을 수 있다.
그러면 그냥 .scala 확장자의 File로 만들어도 된다. 설정을 해주고 싶으면 프로젝트 우클릭 - Add Framework - 좌측에서 Scala 선택 - create를 눌러 library를 설치해주면 된다. 포스팅 하단에 참고 링크를 걸어두었다.
애플리케이션을 실행해야 하므로 object 파일로 만들어주면 된다.
다음으로 테스트를 위해 main 하위에 resources라는 디렉터리를 만들고 그 안에 log.json라는 이름으로 간단한 예제 파일을 하나 작성한다. 간단한 형태의 로그 파일이다.
{"id":"2688425498","type":"buy","created_at":"2013-08-13T22:58:08Z"}
{"id":"2688425496","type":"view","created_at":"2013-08-13T22:59:08Z"}
{"id":"2688425492","type":"view","created_at":"2013-08-13T23:01:08Z"}
{"id":"2688425491","type":"buy","created_at":"2013-08-13T22:02:08Z"}
{"id":"2688425493","type":"view","created_at":"2013-08-13T22:03:08Z"}
{"id":"2688425494","type":"view","created_at":"2013-08-13T22:06:08Z"}
{"id":"2688425495","type":"view","created_at":"2013-08-13T22:08:08Z"}
로그의 개수가 몇 개인지를 count 하는 예제를 작성해보자. 앞서 생성한 Scala 파일에 아래와 같은 코드를 작성한다.
import org.apache.spark.sql.SparkSession
object App {
def main(args : Array[String]): Unit = {
val spark = SparkSession.builder()
.appName("Log counter")
.master("local[*]")
.getOrCreate()
val sc = spark.sparkContext
val log = "src/main/resources/log.json"
val ghLog = spark.read.json(log)
println("all logs: " + ghLog.count)
}
}
바로 main 메서드의 좌측 실행 버튼을 눌러서 실행해보면 되는데, Compile에 실패하는 경우가 있다. File - Project Structure에서 JDK 버전을 확인해보자. Scala 2.12 기준으로 아직 JDK 11 지원이 불완전하다고 한다. 과감하게 JDK 8로 변경하자.
그리고 실행해보면..
성공이다. 로그의 개수가 잘 찍히고 있다.
- 끝 -
참고
Spark&Scala 설치 - https://parkaparka.tistory.com/2
IntelliJ Scala plugin 설치 - https://codechacha.com/ko/install-scala-in-intellij/
IntellJ Scala Library 설치 - https://krksap.tistory.com/584?category=479959
[Spark] sbt를 사용한 간단한 Jar 파일 빌드 - https://wooono.tistory.com/56