{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# GCP에서 Apache Spark Cluster 설치 \n", "\n", "## Reference\n", "\n", "https://zzsza.github.io/data/2018/06/09/apache-spark-cluster/\n", "\n", "## GCP 가입\n", "\n", "* [GCP 가입](https://zzsza.github.io/gcp/2018/01/01/gcp-intro/)\n", "\n", "## VM 인스턴스 생성\n", "\n", "* Compute Engine 클릭\n", "* 만들기 버튼 클릭\n", "\n", "### 인스턴스 만들기\n", "\n", "* CPU 1개, 메모리 3.75G, Ubuntu 18.04 LTS 선택\n", "\n", "## 스파크 환경 설치\n", "\n", "* SSH 클릭\n", "\n", "* keygen 등록\n", "\n", "```\n", "~$ ssh-keygen\n", "~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys \n", "~$ chmod og-wx ~/.ssh/authorized_keys\n", "```\n", "\n", "* Spark 다운로드\n", "\n", "```\n", "~$ wget http://mirror.navercorp.com/apache/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz\n", "```\n", "\n", "* 자바설치\n", "참고주소 : https://tecadmin.net/install-oracle-java-8-ubuntu-via-ppa/\n", "\n", "```\n", "~$ sudo add-apt-repository ppa:webupd8team/java\n", "~$ sudo apt-get update\n", "~$ sudo apt-get install oracle-java8-installer\n", "```\n", "\n", "* Spark 설치 및 실행\n", " + Local : 클러스터 구성없이 Spark 머신 하나로 에뮬레이션 되도록 실행.\n", "\n", "```\n", "~$ tar xvfz spark-2.3.0-bin-hadoop2.7.tgz\n", "~$ cd spark-2.3.0-bin-hadoop2.7/\n", "~/spark-2.3.0-bin-hadoop2.7$ ./bin/spark-shell\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* 마스터 주소 확인\n", "\n", "```\n", "~$ cd spark-2.3.0-bin-hadoop2.7/sbin\n", "~/spark-2.3.0-bin-hadoop2.7/sbin$ ./start-master.sh\n", "starting org.apache.spark.deploy.master.Master, logging to /home/sdrlurker2/spark-2.3.0-bin-hadoop2.7/logs/spark-sdrlurker2-org.apache.spark.deploy.master.Master-1-instance-1.out\n", "\n", "~/spark-2.3.0-bin-hadoop2.7/sbin$ grep \"spark://\" /home/sdrlurker2/spark-2.3.0-bin-hadoop2.7/logs/spark-sdrlurker2-org.apache.spark.deploy.master.Master-1-instance-1.out\n", "\n", "2018-06-18 14:33:38 INFO Master:54 - Starting Spark master at spark://instance-1.c.arctic-compass-206702.internal:7077\n", "```\n", " - 예제의 마스터주소 : spark://instance-1.c.arctic-compass-206702.internal:7077\n", " \n", "* 스파크 실행\n", "\n", "```\n", "~/spark-2.3.0-bin-hadoop2.7/sbin$ cd ../bin\n", "~/spark-2.3.0-bin-hadoop2.7/bin$ ./spark-shell --master spark://instance-1.c.arctic-compass-206702.internal:7077\n", "```\n", "\n", "* RDD 생성 및 count\n", "\n", "```\n", "scala> sc.makeRDD(List(1,2,3)).count\n", "```\n", " - 워커가 없어서 실행 안됨." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 방화벽 규칙 만들기\n", "\n", "* 방화벽 규칙 클릭\n", "\n", "* 방화벽 규칙 만들기\n", " - 이름: spark-1\n", " - 대상 : 네트워크의 모든 인스턴스\n", " - 소스 IP 범위 : 0.0.0.0/0\n", " - 프로토콜 및 포트 : 모두 허용\n", "* 만들기 클릭" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 스냅샷 만들기\n", "\n", "* 기존 instance-1을 종료하고 다음 작업을 진행합니다.\n", "\n", "* Compute Engine -> 스냅샷\n", "* 스냅샷 만들기 클릭\n", " - 소스 디스크 : instance-1 선택" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Slave VM 생성\n", "\n", "* 만들고 싶은 slave 개수만큼 다음을 반복합니다.\n", "\n", "## VM 인스턴스 생성\n", "\n", "* Compute Engine 클릭\n", "* 만들기 버튼 클릭\n", "\n", "### 인스턴스 만들기\n", "\n", "* 부팅 디스크 -> 변경 클릭 -> snapshot-1 선택\n", "* CPU 1개, 메모리 3.75G" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 클러스터에서 Worker 띄우기\n", "\n", "## Slave 컴퓨터에 접속해서 각각 띄우기\n", "\n", "```\n", "~/spark-2.3.0-bin-hadoop2.7/sbin$ ./start-slave.sh\n", "Usage: ./sbin/start-slave.sh [options] \n", "```\n", "\n", "## Master 컴퓨터에서 Worker들을 띄우기\n", "\n", "* 기존 instance-1을 시작 버튼을 눌러 켭니다.\n", "\n", "* 마스터 띄우기\n", "\n", "```\n", "~$ cd spark-2.3.0-bin-hadoop2.7/\n", "~/spark-2.3.0-bin-hadoop2.7$ cd sbin\n", "~/spark-2.3.0-bin-hadoop2.7/sbin$ ./start-master.sh\n", "starting org.apache.spark.deploy.master.Master, logging to /home/sdrlurker2/spark-2.3.0-bin-hadoop2.7/logs/spark-sdrlurker2-org.apache.spark.deploy.master.Master-1-instance-1.out\n", "```\n", "\n", "* 마스터 주소 다시 확인\n", "\n", "```\n", "~/spark-2.3.0-bin-hadoop2.7/bin$ grep \"spark://\" /home/sdrlurker2/spark-2.3.0-bin-hadoop2.7/logs/spark-sdrlurker2-org.apache.spark.deploy.master.Master-1-instance-1.out\n", "2018-06-19 05:15:04 INFO Master:54 - Starting Spark master at spark://instance-1.c.arctic-compass-206702.internal:7077\n", "~/spark-2.3.0-bin-hadoop2.7/bin$ ./spark-shell --master=spark://instance-1.c.arctic-compass-206702.internal:7077\n", "```\n", "\n", "### slaves 등록\n", "\n", "```\n", "~$ cd spark-2.3.0-bin-hadoop2.7/conf\n", "~/spark-2.3.0-bin-hadoop2.7/conf$ cp -p slaves.template slaves\n", "~/spark-2.3.0-bin-hadoop2.7/conf$ vi slaves\n", "# slaves 내부 IP 또는 외부 IP 추가.\n", "```\n", "\n", "### slaves 실행\n", "\n", "```\n", "~/spark-2.3.0-bin-hadoop2.7/sbin$ ./start-slaves.sh\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Spark Web UI 확인." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " Spark Master at spark://instance-1.c.arctic-compass-206702.internal:7077\n", " \n", " \n", "
\n", "
\n", "
\n", "

\n", " \n", " \n", " 2.3.0\n", " \n", " Spark Master at spark://instance-1.c.arctic-compass-206702.internal:7077\n", "

\n", "
\n", "
\n", "
\n", "
\n", "
    \n", "
  • URL: spark://instance-1.c.arctic-compass-206702.internal:7077
  • \n", "
  • \n", " REST URL: spark://instance-1.c.arctic-compass-206702.internal:6066\n", " (cluster mode)\n", "
  • \n", "
  • Alive Workers: 5
  • \n", "
  • Cores in use: 5 Total,\n", " 5 Used
  • \n", "
  • Memory in use:\n", " 13.0 GB Total,\n", " 5.0 GB Used
  • \n", "
  • Applications:\n", " 1 Running,\n", " 0 Completed
  • \n", "
  • Drivers:\n", " 0 Running,\n", " 0 Completed
  • \n", "
  • Status: ALIVE
  • \n", "
\n", "
\n", "
\n", "
\n", "

Workers (5)

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Worker IdAddressStateCoresMemory
\n", " \n", " worker-20180619051632-10.146.0.2-37773\n", " \n", " 10.146.0.2:37773ALIVE1 (1 Used)\n", " 2.6 GB\n", " (1024.0 MB Used)\n", "
\n", " \n", " worker-20180619051632-10.146.0.2-42601\n", " \n", " 10.146.0.2:42601ALIVE1 (1 Used)\n", " 2.6 GB\n", " (1024.0 MB Used)\n", "
\n", " \n", " worker-20180619051637-10.146.0.3-44837\n", " \n", " 10.146.0.3:44837ALIVE1 (1 Used)\n", " 2.6 GB\n", " (1024.0 MB Used)\n", "
\n", " \n", " worker-20180619051637-10.146.0.5-38961\n", " \n", " 10.146.0.5:38961ALIVE1 (1 Used)\n", " 2.6 GB\n", " (1024.0 MB Used)\n", "
\n", " \n", " worker-20180619051639-10.146.0.4-45191\n", " \n", " 10.146.0.4:45191ALIVE1 (1 Used)\n", " 2.6 GB\n", " (1024.0 MB Used)\n", "
\n", "
\n", "
\n", "
\n", "

Running Applications (1)

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Application IDNameCoresMemory per ExecutorSubmitted TimeUserStateDuration
\n", " app-20180619052812-0000\n", "
\n", " \n", " \n", " (kill)\n", "
\n", "
\n", " Spark shell\n", " \n", " 5\n", " \n", " 1024.0 MB\n", " 2018/06/19 05:28:12sdrlurker2RUNNING4.4 min
\n", "
\n", "
\n", " \n", "
\n", "
\n", "

Completed Applications (0)

\n", " \n", " \n", " \n", " \n", " \n", "
Application IDNameCoresMemory per ExecutorSubmitted TimeUserStateDuration
\n", "
\n", "
\n", " \n", "
\n", "
\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import requests\n", "r = requests.get(\"http://localhost:8080\")\n", "\n", "from IPython.display import HTML\n", "HTML(r.text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Spark Web Worker UI 확인.\n", "\n", "* 8081, 8082, ... 식으로 증가" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " Spark Worker at 10.146.0.2:42601\n", " \n", " \n", "
\n", "
\n", "
\n", "

\n", " \n", " \n", " 2.3.0\n", " \n", " Spark Worker at 10.146.0.2:42601\n", "

\n", "
\n", "
\n", "
\n", "
\n", "
    \n", "
  • ID: worker-20180619051632-10.146.0.2-42601
  • \n", "
  • \n", " Master URL: spark://instance-1.c.arctic-compass-206702.internal:7077\n", "
  • \n", "
  • Cores: 1 (1 Used)
  • \n", "
  • Memory: 2.6 GB\n", " (1024.0 MB Used)
  • \n", "
\n", "

Back to Master

\n", "
\n", "
\n", "
\n", "

Running Executors (1)

\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ExecutorIDCoresStateMemoryJob DetailsLogs
11RUNNING\n", " 1024.0 MB\n", " \n", "
    \n", "
  • ID: app-20180619052812-0000
  • \n", "
  • Name:\n", " Spark shell\n", "
  • \n", "
  • User: sdrlurker2
  • \n", "
\n", "
\n", " stdout\n", " stderr\n", "
\n", " \n", " \n", " \n", "
\n", "
\n", "
\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = requests.get(\"http://localhost:8081\")\n", "HTML(r.text)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Spark Web Console\n", "\n", "* 클러스터 모드로 Spark shell 실행\n", "```\n", "~/spark-2.3.0-bin-hadoop2.7/bin$ ./spark-shell --master=spark://instance-1.c.arctic-compass-206702.internal:7077\n", "```\n", "\n", "* 다음처럼 Spark Web Console 4040 포트로 확인 가능." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " \n", " \n", " \n", " Spark shell - Spark Jobs\n", " \n", " \n", "
\n", "
\n", " \n", "

\n", " Spark shell application UI\n", "

\n", " \n", "
\n", "
\n", "
\n", "
\n", "
\n", "

\n", " Spark Jobs\n", " \n", " (?)\n", " \n", "

\n", "
\n", "
\n", "
\n", "
    \n", "
  • \n", " User:\n", " sdrlurker2\n", "
  • \n", "
  • \n", " Total Uptime:\n", " 4.4 min\n", "
  • \n", "
  • \n", " Scheduling Mode: \n", " FIFO\n", "
  • \n", " \n", " \n", " \n", "
\n", "
\n", " \n", " \n", " Event Timeline\n", " \n", "
\n", "
\n", "
\n", " \n", " Enable zooming\n", "
\n", "
\n", "
\n", "
\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = requests.get(\"http://localhost:4040/Jobs\")\n", "HTML(r.text)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import IFrame\n", "IFrame('https://www.zepl.com/viewer/notebooks/bm90ZTovL1NEUkx1cmtlci84MjlmMTM4ZDEzZmY0Yjk0YTQ2MDQyNGFjMmZjMTcwYy9ub3RlLmpzb24', width='100%', height=600)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }