본문 바로가기

Date Enginnering/Spark

Jupyter에서 Spark 사용하기 w.Python

이전 포스팅에 이어서 이번에는 Jupyter에서 간단하게 Spark를 사용해보고 Spark history server에 어떻게 기록되는지 알아보겠습니다.

1. Create Spark Session

우선 Jupyter에 접속해 테스트에 사용할 임의의 폴더를 만들고 Jupyter Notebook 파일을 생성하겠습니다.

Spark Test용 Jupyter Notebook 생성

Notebook을 누르면 화면이 바뀌면서 팝업 창으로 커널을 선택하라고 나오게 되고 이때 Docker에 설치된 Python을 선택합니다.

오른쪽 상단에 선택한 언어의 이미지가 보이게됩니다.

 

이제 아래 예시 코드를 cell에 입력한 뒤 실행을 해주면 Spark Session이 생성됩니다.

from pyspark.sql from SparkSession

spark = SparkSession.builder.appName("{spark_history_server에서 보일 이름}").config("spark.eventLog.dir", "{PATH}").config("spark.eventLog.enabled", "true").getOrCreate()

 

사용하는 함수와 옵션은 다음과 같습니다.

1. appName - Spark History Server에 나타나는 이름으로 원하시는 이름을 적어주시면 됩니다.

2. spark.eventLog.dir - Spark Session을 저장하는 경로를 입력합니다. 이전에 생성했던 spark_default.conf의 경로를 입력하시면 됩니다.

3. spark.eventLog.enabled - Spark 이벤트 로깅을 활성해주는 옵션이기 때문에 "true"로 설정해주어야 Spark History Server에서 읽을 수가 있습니다.

4. getOrCreate() - 해당 session이 있으면 불러오고 없으면 생성하는 함수입니다.

 

Spark Session이 정상적으로 생성되었는지 확인하기 위해서 잠깐 터미널을 켜서 실행중인 Docker Container에 접속해서 이전에 설정했던 SPARK_HOME으로 이동합니다.

cd ${SPARK_HOME}
ls
## 이동 후 ls 명령어를 입력했을 때 보이는 logs 폴더로 이동합니다. ##
cd logs

 

logs 폴더에서 ls 입력 후 local-1703595132136.inprogress처럼 뒤에 .inprogress가 붙은 파일이 있다면 Spark Session이 정상적으로 생성된 것입니다.

.inprogress란?
생성된 Spark Session의 완전히 종료되기 전까지의 작업 Log를 기록하는 상태를 말합니다.

 

 

만약 내가 Jupyter에서 생성한 Spark Session이 logs 폴더에 있는 파일과 동일한지 궁금하다면 아래와 같은 코드를 Jupyter에 입력한 다음 실행했을 때 나오는 'spark.app.submitTime'.inprogress의 앞 숫자와 같은지를 확인하면 됩니다.

spark.sparkContext.getConf().getAll()

2. Spark 사용하기

지금은 Spark를 하나하나 설명하는 것보다 우리가 사용한 Spark 명령들이 어떻게 History-Server에서 보이는 지 확인하는 것에 좀 더 초점을 맞췄기 때문에 간단하게 넘어가겠습니다.

path = "/spark-warehouse/airports.csv"
df = spark.read.option("header", "true").csv(path)  ## 첫 행을 column으로 사용하기 위함.
df.printSchema()
df.limit(5).show()
df.first()
df.count()

spark.stop()  ## Spark Session 완전히 종료

 

저는 위처럼 코드를 실행한 뒤 .stop()를 사용해 Spark Session을 완전히 종료시켜주었습니다. 다시 logs 폴더에서 ls를 입력하면 아까와는 다르게 .inprogress가 사라진 것을 확인할 수 있습니다.

 

그럼 이제 History-Server에서 어떻게 나와있는지 확인해보겠습니다.

 

위 이미지처럼 아까 실행했던 Spark Session이 보입니다. 그런데 App Name이 test1으로 동일한 것으로 보이는데 그 이유는 완전히 종료된 Session의 이름은 재사용이 가능하기 때문입니다. 하지만 만약에 현재 test1이라는 Session이 동작 중이라면 동일한 이름의 Session은 생성할 수 없습니다.

이번에는 Test이기 때문에 App Name에 큰 신경을 쓰지는 않았지만, 실제로 운영할 때는 App Name에도 유의하며 사용해야 할 것 같습니다.

 

그럼 이제 local-1703595132136 Session에 들어가 직접 사용한 Log를 확인해보겠습니다.

 

총 5개의 Job이 실행되었고, 제가 실행했던 순서대로 나열되어 있음을 확인할 수 있습니다.

4번째 Job은 오른쪽에 skipped되었다고 나오는데 3번째 Job와 동일한 동작을 했음을 추측해볼 수 있을 것 같습니다.

마무리

이번에 Spark 글을 작성하면서 Spark를 활용하는 방법에 대해서 조금 고민해보았습니다. 흔히 우리는 Spark는 빅데이터를 다룰 때 사용한다고 알고 있는데 아마도 대용량의 데이터를 DW에서 DM로 이동할 때 Transform하는 과정에서 사용하지 않을까 싶었습니다.

 

이 생각이 들면서 한 가지 궁금한 점이 생겼습니다.

'그럼 Python과 Spark가 정말로 퍼포먼스의 차이가 나는 데이터의 용량은 어느 정도 일까? 최근 Mojo라는 Python보다 속도가 빠른 언어도 나왔는데 Spark와는 어느 정도의 차이를 보일까?'

물론 직접적인 비교는 어렵겠지만 한 번 테스트해본다면 재밌지 않을까 싶습니다.

Thank for Reading!
감사합니다.

'Date Enginnering > Spark' 카테고리의 다른 글

Docker로 Spark 환경 구축하기  (0) 2023.12.12