Zeppelin, Jupyter Notebook 서버 구성하여 Cloud Hadoop에 Spark Job 제출하기
이 페이지에서는 네이버클라우드플랫폼 Server에 Zeppelin/Jupyter Notebook Server를 설치하고, 이 노트북을 이용하여 Cloud Hadoop 에 Spark를 실행하기 위한 Client Configuration을 알아봅니다. 네이버클라우드플랫폼Cloud Hadoop (Spark Type) 클러스터가 생성되어 있다고 가정합니다.
Cloud Hadoop에서 사용하는 HDP의 스택에는 Zeppelin이 이미 포함되어 있습니다. 하지만 일반적으로 리소스 분리를 위해, Zeppelin을 하둡클러스터 외부 VM 또는 Docker에 설치하는 구성을 권장합니다.
Cloud Hadoop에서 설치하는 Spark는 기본 Spark on Yarn이기 때문에 Spark Master는 yarn-client
또는 yarn-cluster
가 될 수 있습니다. 편의를 위해 여기서는 별도 linux user를 생성하지 않고 root
로 진행했습니다. 운영환경에서는 전용 user를 생성하는 것을 권장합니다.
Server 생성
네이버클라우드플랫폼 콘솔에서 Server 1개를 다음과 같은 스펙으로 생성합니다.
- 부팅 디스크 50GB
- CenOS 7.3(64-bit)
생성시 4.네트워크 접근 설정 단계에서 ACG를 Cloud Hadoop의 ACG와 동일하게 생성해야 합니다.
서버 생성 완료후에는 아래 작업을 해주어야 합니다.
1. 포트포워딩 설정
포트포워딩 을 클릭해서 터미널로 서버에 접속하기 위한 ip와 port를 설정합니다. 여기서 생성한 ip 주소는 ssh 접속을 위해서만 사용합니다.
2. 공인 IP 할당
서버 관리및 설정변경 -> 공인 IP 설정 변경 메뉴에서 공인 IP를 할당합니다. Public IP를 할당하지 않으면 로컬 브라우저에서 Zeppelin, Jupyter Server에 접속 할 수 없습니다.
2. ACG 설정 변경
로컬 브라우저에서 8080(Zeppelin), 8888(Jupyter) 포트에 접속하려면 ACG 설정을 변경해야 합니다. ACG -> ACG 설정 에서 아래와 같이 접근하는 client host ip, port를 추가합니다. ip는 my ip로 한정 할 수도 있지만, 여기서는 다른 사용자도 있다고 가정하고 0.0.0.0/0으로 두었습니다.
Pre-requisites
Zeppelin, Jupyter는 원래 Cloud Hadoop 서비스(Spark, Hadoop)에 대한 클라이언트 역할이므로 미리 설정 해줘야 할 것들이 있습니다. 직전에 생성한 Server에 접속해서 아래 내용을 수행합니다.
1. Download JDK 8
아래와 같이 jdk8을 설치합니다.
$ wget --header="Cookie:oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm
$ yum install -y jdk-8u131-linux-x64.rpm
JAVA_HOME 변수를 .bash_profile
에 설정합니다.
export JAVA_HOME=/usr/java/default
export PATH=$PATH:JAVA_HOME/bin
2. Download Hadoop Configuration
연결해서 사용하려고 하는 Cloud Hadoop의 Hadoop Client Configuration을 가져와야 합니다.
그 전에 YARN configuration에서 다음 property를 바꿔줘야 RequestHedgingRMFailoverProxyProvider
가 발생하지 않습니다.
<property>
<name>yarn.client.failover-proxy-provider</name><value>org.apache.hadoop.yarn.client.ConfiguredRMFailoverProxyProvider</value>
</property>
Ambari UI 에서 HDFS -> Service Actions -> Download Client Config를 클릭해서 Hadoop Client Configuration을 다운로드합니다. 여기서는 로컬 ~/Downloads/HDFS_CLIENT-configs.tar.gz
경로에 다운받았습니다. 마찬가지로 YARN 에서도 Download Client Config 작업을 수행합니다.
scp로 로컬에 다운받은 configuration을 Server instance에 전송합니다. 여기서 port 와 public ip는 1. 포트포워딩 설정 에서 받은 값을 넣으면 됩니다. /root 아래에 HDFS_CLIENT-configs.tar.gz
파일을 확인 할 수 있습니다.
scp -i <YOUR-PEM-KEY-PATH>.pem -P <PORT> ~/Downloads/HDFS_CLIENT-configs.tar.gz root@<SSH-IP>:/rootscp -i <YOUR-PEM-KEY-PATH>.pem -P <PORT> ~/Downloads/YARN_CLIENT-configs.tar.gz root@<SSH-IP>:/root
압축을/root/hadoop-conf
에 해제합니다.
cd ~
mkdir ~/prereqs ~/prereqs/hadoop-conf
tar -xvzf HDFS_CLIENT-configs.tar.gz -C ~/prereqs/hadoop-conf
tar -xvzf YARN_CLIENT-configs.tar.gz -C ~/prereqs/hadoop-conf
3. Get Spark
zeppelin notebook에서 Cloud Hadoop에 설치된 Spark를 사용하기 위해서는 spark client가 필요합니다. SPARK_HOME=/root/prereqs/spark 으로 설정합니다.
$ cd ~/prereqs
$ wget -P ~/prereqs https://archive.apache.org/dist/spark/spark-1.6.0/spark-1.6.0-bin-hadoop2.6.tgz
$ cd ~/prereqs && tar -xzvf spark-1.6.0-bin-hadoop2.6.tgz
$ mv ~/prereqs/spark-1.6.0-bin-hadoop2.6 ~/prereqs/spark
4. spark-client Configuration
$SPARK_HOME/conf
아래에 있는 다음 파일들을 수정합니다.
$ cd $SPARK_HOME/conf
$ mv spark-defaults.conf.template spark-defaults.conf
$ mv spark-env.sh.template spark-env.sh
spark-defaults.conf
현재 Cloud Hadoop의 HDP 스택 버전은 2.6.5.0–292 입니다. Ambari UI -> Admin -> Versions -> Current -> Show Details에서 확인 할 수 있습니다.
spark.driver.extraJavaOptions -Dhdp.version=2.6.5.0-292
spark.yarn.am.extraJavaOptions -Dhdp.version=2.6.5.0-292
spark-env.sh
export JAVA_HOME=/usr/java/default
export HADOOP_CONF_DIR=/root/prereqs/hadoop-conf
5. add /etc/hosts
remote host에서 클러스터에 노드의 hostname을 resolve하기 위해서는 etc/hosts
파일을 수정해야 합니다. 들어갈 내용은 클러스터에 직접 접속하면 알 수 있습니다.
Zeppelin 설치
ZEPPLINE_HOME은 /root/zeppelin
으로 설정합니다.
$ cd ~
$ wget http://mirror.navercorp.com/apache/zeppelin/zeppelin-0.8.1/zeppelin-0.8.1-bin-all.tgz
$ tar -xzvf zeppelin-0.8.1-bin-all.tgz
$ mv zeppelin-0.8.1-bin-all zeppelin
Zeppelin Configuration
Configuration 파일은 $ZEPPELIN_HOME/conf
에 존재합니다. 기타 configuration property는 Default configuration를 참고하세요.
zeppelin-env.sh
yarn-client
모드의 경우 driver와 executors사이 network latency가 application 실행 성능에 큰 영향을 끼치므로, 운영환경에서는 cluster 모드를 권장합니다. cluster 모드를 사용하려면 MASTER=yarn-cluster
로 변경해주세요.
export MASTER=yarn-client
export HADOOP_CONF_DIR=/root/prereqs/hadoop-conf
export SPARK_HOME=/root/prereqs/spark
zeppelin-site.xml
zeppelin에서 anonymous로 접속하는 것을 막습니다.
<property>
<name>zeppelin.anonymous.allowed</name>
<value>false</value>
<description>Anonymous user allowed by default</description>
</property>
shiro.ini
zeppelin 접속 계정관리를 할 수 있는 파일입니다. admin 계정이 처음에는 disable되어 있기 때문에, 활성화 시켜줍니다. password1, admin
부분을 원하는 패스워드 , 계정이름으로 변경합니다.
[users]
# List of users with their password allowed to access Zeppelin.
# To use a different strategy (LDAP / Database / ...) check the shiro doc at http://shiro.apache.org/configuration.html#Configuration-INISections
# To enable admin user, uncomment the following line and set an appropriate password.
admin = password1, admin
user1 = password2, role1, role2
zeppelin 시작
이제 zeppelin을 시작할 수 있습니다. 아래 명령어로 zeppelin을 시작하면, http://<SERVER-PUBLIC-IP>:8080 에서 zeppelin notebook을 사용할 수 있습니다.
$ZEPPELIN_HOME/bin/zeppelin-daemon.sh start
예제로 있는 spark 노트( %spark
interpreter)를 실행 시킬 수 있습니다.
Cloud Hadoop의 Resource Manager UI에서는 아래와 같이 YARN위에서 Spark가 실행되는 것을 확인 할 수 있습니다.
Jupyter 설치
Jupyter는 python-pip명령어로 쉽게 설치 할 수 있습니다.
pip install jupyter
Jupyter 시작
jupyter 서버를 시작할 수 있습니다. root로 jupyter를 실행하는 경우 --allow-root
옵션을 붙여줘야 합니다 (권장하지 않음). port의 기본값은 8888으로 다른 --port
옵션으로 다른 값으로 지정할 수 있습니다.
jupyter notebook --ip=0.0.0.0
http://<SERVER-PUBLIC-IP>: 8888/?token=<TOKEN-ID> 에서 jupyter notebook을 사용할 수 있습니다.
Jupyter 에서 PySpark(Spark Python API)를 사용하기 위해서는 별다른 kernel을 추가할 필요가 없습니다. 기본 python kernel을 사용하면 됩니다. findspark
모듈에 SPARK_HOME
path만 정확히 입력하시면 됩니다.
마찬가지로 여기서도, Cloud Hadoop의 Resource Manager UI에서는 아래와 같이 YARN위에서 Spark가 실행되는 것을 확인 할 수 있습니다
마무리
네이버클라우드플랫폼 Server에 Zeppelin, Jupyter Notebook Server를 설치하고 Cloud Hadoop과 연동하여 Spark를 사용 - Zeppelin 에서 Spark (Scala), Jupyter에서 PySpark -하는 방법을 알아보았습니다. 노트북이 하둡 클러스터의 자원을 소모하지 않게 하기 위해서는 이렇게 노트북 서버를 external instance로 구성 하는 것이 좋습니다.