데이터분석 인프라 구축기 (4/4)

Jupyter Notebook with Spark Kernel

이번 포스팅에서는 지난번 실행한 PySpark 을 커맨드라인에서 실행하는게 아니라 Jupyter Notebook 이라는 웹 인터페이스를 이용해 실행해볼 예정이다

Jupyter Notebook을 이용하면 인터프리팅 뿐만 아니라 마크다운(Markdown)이나 웹 기반의 챠트 라이브러리 등도 사용할 수 있어서 보고서 작성이나 Playground 로써 이점을 얻을 수 있다. 또한 REPL(Read-Eval-Print-Loop)를 지원하는 다양한 언어들을 Kernel 로 사용할 수 있다.

Spark Integrated Dockerized Jupyter

https://github.com/sangwonl/docker-spark-jupyter

필요한 내용들을 위 리파지토리에 정리해두었다. 몇 가지 주요한 것들만 살펴보겠다.

  • jupyter_notebook_config.py
    주피터 노트북의 메인 설정 파일이다. 다른 설정들은 모두 디폴트 값으로 되어있고 c.NotebookApp.token 만 사용하고 있는데 이는 처음 접속하거나 세션이 만료되었을때 인증으로 사용하는 토큰이다.
  • kernels/xxxxx/kernel.json
    주피터 노트북에 통합시킬 커널에 대한 설정이다. 현재 리파지토리에는 python3(Pure Python 3), pyspark(PySpark Shell), scala(Spark Shell) 를 넣어두었다. 이 설정들을 /usr/local/share/jupyter/kernels/… 아래에 넣어두면 생성할 수 있는 노트북 목록에 노출 된다.

Dockerfile을 좀 살펴보면,

FROM sangwonl/hadoop-spark:2.1.0

sangwonl/docker-spark 이미지를 베이스로 이용하고 있다.

RUN apt-get update && apt-get install -y python3-pip locales
# locales
RUN locale-gen en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US.UTF-8
# python packages
RUN pip3 install --upgrade pip
RUN pip3 install \
notebook \
matplotlib \
plotly \
pandas \
numpy \
pymysql \
sqlalchemy \
boto

Python 버전은 3.x 로 사용하기 위해 python3-pip 를 설치하고 notebook 에서 built-in 으로 사용할 수 있도록 데이터 분석에 많이 사용되는 python 패키지를 설치한다. 그리고 Jupyter Notebook 에서 유니코드 지원을 위해 locale 설정을 해둔다.

# jupyter configuration
ADD jupyter_notebook_config.py /root/.jupyter/jupyter_notebook_config.py
# spark configuration
ADD spark-defaults.conf $SPARK_HOME/conf/spark-defaults.conf

jupyter_notebook_config.py와 spark-defaults.conf 을 적절한 위치에 넣어둔다.

# toree scala kernel
RUN pip install https://dist.apache.org/repos/dist/dev/incubator/toree/0.2.0/snapshots/dev1/toree-pip/toree-0.2.0.dev1.tar.gz
RUN jupyter toree install \
--spark_home=$SPARK_HOME \
--spark_opts='--master=yarn' \
--kernel_name=scala \
--interpreters=Scala
RUN mv /usr/local/share/jupyter/kernels/scala_scala /usr/local/share/jupyter/kernels/scala
# add kernel configurations
ADD kernels/python3/kernel.json /usr/local/share/jupyter/kernels/python3/kernel.json
ADD kernels/pyspark/kernel.json /usr/local/share/jupyter/kernels/pyspark/kernel.json
ADD kernels/scala/kernel.json /usr/local/share/jupyter/kernels/scala/kernel.json

이 부분은 주피터 커널 설정들을 추가하는 부분이다. python3와 pyspark은 단순히 kernel.json 파일들을 해당 디렉토리에 복사만 해주는데 scala 의 경우가 좀 특이하게 toree 라는 것을 이용하고 있다. Apache Toree 는 Spark 에 붙는 커널들을 여타 패키지 매너저들이 하듯이 쉽게 enable / disable 할 수 있게 제공하는 프로젝트이다.

Jupyter Notebook 실행

Dockerized hadoop cluster 가 실행 중이라고 하고(`hadoop` 이라는 docker bridge network에 떠있다라고 가정) Notebook 을 실행해보자.

$ docker run -it --network hadoop --env-file hadoop.env -p 8000:8000 sangwonl/hadoop-spark-jupyter

이제 0.0.0.0:8000 으로 접속해보면 아래처럼 토큰을 입력하라고 하는데 이때 아까 위에서 언급한 c.NotebookApp.token 의 값을 넣어주면 홈으로 진입한다.

그리고 New > PySpark 을 해서 PySpark 노트북을 띄워보자. 잘 떴다면 sc(SparkContext) 변수가 초기화되어 주입되어있다는걸 볼 수 있다.

그리고 마찬가지로 Hadoop Resource Manager 에서 pyspark-shell 이 Running 중인걸 확인할 수 있다.

Jupyter Notebook Spark Example

이전 포스팅에서 했던 Word Count 예제를 노트북에서 수행해보자.

굿.