data engineering

spark + scala 세팅.

qkqhxla1 2021. 5. 8. 22:18

spark를 공부하면서 scala라는 언어 자체를 깊게 파지는 않더라도 알아둘 필요가 있어서 정리해놓는다. 내 기준으로 이해하기 쉽게 정리해놓은거라서 다른 사람들은 환경이 다를 수 있음. 환경은 spark 3.0.1 + scala 2.12로 하려고 한다.

사실 저번글 qkqhxla1.tistory.com/1143?category=698045 에서 스파크 스트리밍을 가볍게 만지면서 pyspark로 가벼운 예제 코드도 아래에 더 추가하려고 삽질했었다. 그런데 글 끝에 적었듯이 스파크 스트리밍은 아직 pyspark가 지원 안하는게 많다. 예로 mongo로 스트리밍으로 쓰는것도 scala만 지원한다. 데이터 처리를 진짜 끝까지 하려면 스칼라가 그래도 필요하다는 생각에 공부겸 + 업무와 연관해서 조금씩 정리하려고 한다.

처음에는 스칼라 튜토리얼 등에서 스칼라라는 언어 자체를 공부하며 익히려고 했는데 튜토리얼은 순수 스칼라고, 내가 하려고 하는건 스파크 + 스칼라라서 스칼라를 돌리려면 jar로 만든다음, 그 jar를 spark-submit에서 실행하는 방식으로 해야 했다. 내가 돌려봐서 흐름을 이해하고자 하는건 간단한 스파크 튜토리얼의 스칼라 예시이다.
spark.apache.org/docs/3.0.1/quick-start.html


현재 intelli j가 있어서 이거로 스칼라 프로젝트를 만들었다.

4가지중 하나로 만들수 있는데 삽질 끝에 첫번째 sbt로 만드는게 맞다는걸 깨달았다. sbt가 뭔지 찾아보니 스칼라와 자바를 대상으로 빌드해주는 툴이라고 한다. www.scala-sbt.org/

자바는 기본으로 깔려있다고 가정하고, 나는 만들때 스칼라 최신버전이 현재 2.13이지만 2.12의 가장 끝버전으로 맞추고 만들었었다. 이유는 현재 내가 사용하는 스파크 3.0.1의 스칼라 패키지 최신버전이 2.12까지만 제공되었기 때문이다. 이건 나중에 돌려보면서 에러나는 부분이 발생하면 보고 고치던가 하자.

이후 프로젝트의 구조는 나같은경우 아래와 같다. spark-3.0.1-bin-hadoop3.2는 내가 쓰기 편하게 전체 복사해서 그냥 프로젝트 내부에 박아넣었다. build.sbt파일을 내가 만든대로 설정해주고, 맨 아래의 libraryDependencies라인만 추가해준다.

scala-sbt-test/src/main/scala/SimpleApp.scala는 아래와 같다. 공식홈페이지의 예제와 똑같다.

/* SimpleApp.scala */
import org.apache.spark.sql.SparkSession

object SimpleApp {
  def main(args: Array[String]) {
    val logFile = "./spark-3.0.1-bin-hadoop3.2/README.md" // Should be some file on your system
    val spark = SparkSession.builder.appName("Simple Application").getOrCreate()
    val logData = spark.read.textFile(logFile).cache()
    val numAs = logData.filter(line => line.contains("a")).count()
    val numBs = logData.filter(line => line.contains("b")).count()
    println(s"Lines with a: $numAs, Lines with b: $numBs")
    spark.stop()
  }
}

logFile의 위치를 ./으로 시작하게 해놨는데, 내가 빌드를 스칼라 프로젝트의 루트에서 빌드할거라 저리 해놨다. intelli j에는 스칼라 프로젝트를 sbt로 만들었을시 sbt shell이 자동으로 생긴다.(아닐 경우 sbt를 설치해서 직접 빌드)
sbt shell에서 package를 입력하면 소스가 실행가능한 jar로 만들어진다.
위의 scala-sbt-test/target/scala-2.12/scala-sbt-test_2.12-0.1.jar 는 package를 입력후 생긴 jar이다. 이걸 스파크에서 실행하면 된다. 위 소스코드에 logFile의 위치를 ./로 적었으니 그걸 감안해서 프로젝트의 루트에서 실행시킨다.

./spark-3.0.1-bin-hadoop3.2/bin/spark-submit --class "SimpleApp" --master local[4] target/scala-2.12/scala-sbt-test_2.12-0.1.jar

튜토리얼에 있는 예상결과 Lines with a: 64, Lines with b: 32가 잘 나옴을 확인할 수 있다.

내가 SimpleApp이라는 이름으로 클래스를 만들어서 --class인자를 SimpleApp으로 줬고, 만약 이후 추가 클래스가 생길 경우 동일하게 scala 폴더 밑에 만들고, sbt package 후 클래스 명만 바꾸어서 실행해보면 된다.