제플린 Zeppelin

[Zeppelin] 제플린(Zeppelin)에서 스파크(Spark) 연동하고 Pyspark 실행하기

sseozytank 2024. 4. 18.

제플린을 쓰면 분석 내용을 공유하기도 편하고 시각화가 내장되어 있어서 GUI로 시각화하기도 엄청 편하다. 이래저래 활용하면 효율적일 것 같아 제플린 셋팅을 진행하고 있다. 요즘 빅데이터 분석 환경 구축 때문에 퇴근하고도 계속 글쓰고 공부하는데 어렵지만 하면 할수록 퍼즐이 하나하나 맞춰지는 것 같아서 너무 뿌듯하다. 사실 실무에선 우리 데이터 엔지니어님께서 깔아주신 판에서 분석만 해도 되지만... 내가 시니어가 된다면 직접 분석 환경을 셋팅할 일이 생길 수도 있을 것이고, 적어도 내가 쓰는 툴이 어떻게 구성되고 어떻 원리로 동작하는지 정도는 자아를 갖고있어야 한다고 생각한다. 

 

오늘은 ubuntu에서 깔아둔 스파크를 제플린에서 바로 세션 연결을 해보고 Pyspark 테스트 코드까지 쳐보자. 이것도 엄청엄청 쉽다 ! 라고 말할순 있겠지만 나는 너무 어려웠다.... 에러가 계속 발생했는데 버전 호환 문제 인 것 같은데 명확하게 버전 문제야! 라고 하는 문서를 못찾아서 실제로 아예 안맞는 버전이랑, 공식 Docs 에서 제안한 호환되는 버전끼리 계속 테스트해봤기 때문.. 여러분은 이거보고 삽질하지 마시고 편하게 하세용

츄파츕스입니다

 

0.제플린과 스파크의 버전 호환 

그렇다면, 제플린과 스파크는 어떤 버전끼리 호환될까? 

 

1.최신 버전이 아닌 이전 제플린 버전들에 대한 호환성은 아래 공식 Docs에서 찾을 수 있다. 

 

Supported Interpreters

1.5.x, 1.6.x, 2.0.x, 2.1.x, 2.2.x, 2.3.x, 2.4.0 1.5.x, 1.6.x, 2.0.x, 2.1.x, 2.2.x, 2.3.1 1.4.x, 1.5.x, 1.6.x, 2.0.x, 2.1.x, 2.2.0 1.4.x, 1.5.x, 1.6.x, 2.0.x 2.1.0 1.4.x, 1.5.x, 1.6.x, 2.0.x 2.1.0 1.1.x, 1.2.x, 1.3.x, 1.4.x, 1.5.x, 1.6.x, 2.0.0 1.1.x, 1.2.x

zeppelin.apache.org

 

 

 

2.가장 최신 버전에 대한 호환성은 최신 릴리즈 노트를 확인하면 됨. 

 

Download

<!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or ag

zeppelin.apache.org

 

이 사이에 있는 버전은 왜인지 찾을 수가 없어서 (아시는 분이 있다면 댓글로 알려주세요!) 나는 일단 명시되어있는 버전으로 진행했다. 저기에 적혀진 대로 버전을 맞추지 않았을 때는 모두 org.apache.zeppelin.interpreter.InterpreterException: org.apache.zeppelin.interpreter.InterpreterException: Fail to open SparkInterpreter 에러가 발생했었다. 똑같은 방식으로 공식 Docs의 버전대로 맞춰서 연결했을 땐 잘 되었으니 버전 문제.. 맞겠지?

 

 

1.Zeppelin 및 Saprk 다운로드 

앞서 여러 글을 통해 Spark 다운받고 셋팅하는 방법들을 적어놨는데, 버전 호환이 잘 안돼서 다운로드 방법을 한번 더 적어놓았다. 이번 포스팅에서는 최신 릴리즈 노트에 적힌 대로 zeppelin 0.11.0과 spark 3.5.0으로 진행할 것이다. 

 

1.Zeppelin 다운로드 

wget https://dlcdn.apache.org/zeppelin/zeppelin-0.11.0/zeppelin-0.11.0-bin-all.tgz
tar -zxvf zeppelin-0.11.0-bin-all.tgz

 

 

2.Spark 다운로드 

wget https://archive.apache.org/dist/spark/spark-3.5.0/spark-3.5.0-bin-hadoop3.tgz
spark-3.5.0-bin-hadoop3.tgz

 

*제플린 원격 접속 허용은 여기 참고! 

 

[Zeppelin] 제플린(Zeppelin) 원격 접속 허용

Zeppelin 원격 접속이 가능하게 설정 제플린을 다운 받고 실행해주면, zeppelin이 바로 켜지긴 하는데 local에서만 접속할 수 있다. 나는 VM에서 실행 시킨걸 윈도우에서 열어야하기 때문에 원격 접속

sseozytank.tistory.com

 

2.Zeppelin / Spark 환경변수 설정

*참고) 환경 변수는 왜 설정할까?

 

환경변수를 설정하는 이유

Java나 Tomcat 등 여러 프로그램을 설치할 때 환경변수를 설정하는 것을 보았을 것이다. 그렇다면 왜 환경변수를 설정하는 것일까? 그 이유를 알아보도록 하자. 바탕화면에 testdir이라는 폴더가 있

www.lifencoding.com

vi ~/.bashrc
export SPARK_HOME=~/spark-3.5.0-bin-hadoop3
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
export ZEPPELIN_HOME=~/zeppelin-0.11.0-bin-all
export PATH=$ZEPPELIN_HOME/bin:$PATH
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin/:$PATH

 

추가해주고 저장하고 나온다. (esc -> :wq!) 나는 처음에 이렇게만 했었는데,

 

Fail to open PythonInterpreter 

오류 처리를 아래 쓸까 고민하다가, 한번에 적용하고 가야 따라하시는 분들이 편할 것 같아 여기서 언급하고 간다. 

처음에 해당 환경변수만 설정해줬더니, Python을 찾기 못해 실제 Pyspark 실행 시 org.apache.zeppelin.interpreter.InterpreterException: org.apache.zeppelin.interpreter.InterpreterException: Fail to Open PythonInterpreter 오류가 발생했다. 따라서 해당 설정도 추가해준다. 

which is python3 #python 인 사람은 python으로

#output
/usr/bin/python3

 

이 경로를 활용하여 

#이미 spark-env.sh가 있으신 분은 해당 과정 생략
cp ~/spark-3.5.0-bin-hadoop3/conf/spark-env.sh.template ~/spark-3.5.0-bin-hadoop3/conf/spark-env.sh
vim ~/spark-3.5.0-bin-hadoop3/conf/spark-env.sh
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=/usr/bin/python3

 

추가해주면 환경변수 설정은 끝. 그럼 이제 실행해보자!

3.zeppelin 및 spark 실행

1.Zeppelin 실행

cd zeppelin-0.11.0-bin-all/bin
zeppelin-daemon.sh start

 

2.Spark 실행

cd spark-3.5.0-bin-hadoop3/sbin
start-all.sh

 

*Master랑 Workers만 실행하면, spark가 제대로 연동되어도 무한 루프에 빠졌다. 그러므로 all로 실행해주자. 그럼 spark-submit 이랑 CoarseGrainedExecutorBackend도 같이 실행된다  (아래 챗지피티 답변 내용 참고) 

  • SparkSubmit: 사용자는 SparkSubmit을 사용하여 애플리케이션을 클러스터에 제출하고 필요한 설정을 지정할 수 있습니다. 이 도구를 사용하지 않으면 애플리케이션이 클러스터에 제출되지 않으며, 실행되지 않습니다.
  • CoarseGrainedExecutorBackend: 이는 각 클러스터 노드에서 실행되는 Spark 작업을 처리합니다. CoarseGrainedExecutorBackend가 없으면 클러스터에서 작업을 실행할 수 없으며, 따라서 Spark 애플리케이션이 실행되지 않습니다.

연결 후, Zeppelin (ip:port) / Spark(ip:port)로 Web에 접속해주자.

나의 경우 Spark port가 8080이어서 Zeppelin을 8888로 수정해주었으니 제플린에 들어가고 싶으면 xxx.xx.x.xx:8888을 주소창에 치면 된다! 여기서 세팅 하나만 더해주고 간다. 

 

4.zeppelin spark interpreter 설정 

스파크 마스터 주소를 설정해주지 않으면 스파크를 못잡기 때문에 ,인터프리터에서 스파크 마스터를 알려줘야한다! 

오른쪽 상단에서 세모 누른 후 인터프리터 클릭

 

검색창에 spark를 검색하면 바로 뜬다.

 

이후 오른쪽 상단 edit 클릭

 

 

 

 

들어가서 이 두부분을 수정해주면 된다. SPARK_HOME은 자동으로 잡히는거 같은데 기억이 안나서..; 안잡히면 그냥 저렇게 적어주고, spark.master에는 spark://ip:7077을 적어주면 된다. 아래쪽에서 save 하고 위에 edit 눌렀던 그부분에서 restart 클릭! 그리고 샘플 코드를 입력해보자 

%spark.pyspark

import urllib.request

# 데이터 다운로드 및 저장
url = "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv"
local_path = "/tmp/titanic.csv"
urllib.request.urlretrieve(url, local_path)

# 필요한 라이브러리 임포트
from pyspark.sql import SparkSession

# SparkSession 생성
spark = SparkSession.builder \
    .appName("Titanic Data Analysis") \
    .getOrCreate()

# 로컬 파일 시스템에 저장된 데이터 불러오기 (CSV 파일)
df = spark.read.csv(local_path, header=True, inferSchema=True)

# 데이터 프레임 보여주기
df.show()

 

오른쪽 상단에 떠있는 SPARK JOB에서 실행 세부 정보도 확인할 수 있다! 끝! 

 

 

댓글