-
[Spark] Spark Cluster 를 구축하기 ( Docker )Spark 2024. 5. 17. 22:31728x90반응형
- 목차
들어가며.
이번 글에서는 Spark Cluster 를 구현하는 방법에 대해서 알아보려고 합니다.
기본적으로 Docker Container 를 활용하여 Spark Cluster 를 구현하며,
Spark Cluster 를 실행하기 위한 Dockerfile 과 Docker Compose 등의 상세한 내용들을 다룰 예정입니다.
Spark Cluster 구축하기.
Dockerfile 구성하기.
가능한 Docker Hub 에 존재하는 Spark Docker Image 를 활용하려고 검색해보았지만, 개인적으로 마음에 드는 이미지가 존재하지 않아서 아래와 같이 ubuntu Base Image 로부터 Docker Image 를 생성합니다.
아래 Dockerfile 의 내용은 Ubuntu Base Image 와 Hadoop, Spark 바이너리 파일을 설치하여 이미지를 구성합니다.
해당 Dockerfile 의 핵심적인 내용으로 java11, hadoop3.3.6, spark3.5.2 버전이 설치됩니다.
그리고 SPARK_NO_DAEMONIZE 를 True 로 설정하여, Foreground 모드로 동작할 수 있도록 환경변수를 세팅합니다.
cat <<EOF> /tmp/spark-dockerfile FROM ubuntu:18.04 RUN apt-get update RUN apt-get -y install wget ssh curl openjdk-11-jdk python3-pip RUN pip3 install pyspark WORKDIR /opt/hadoop RUN wget https://dlcdn.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz RUN tar -zxvf hadoop-3.3.6.tar.gz RUN rm hadoop-3.3.6.tar.gz WORKDIR /opt/spark RUN wget https://dlcdn.apache.org/spark/spark-3.5.2/spark-3.5.2-bin-hadoop3.tgz RUN tar -zxvf spark-3.5.2-bin-hadoop3.tgz RUN rm spark-3.5.2-bin-hadoop3.tgz ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 ENV HADOOP_HOME=/opt/hadoop/hadoop-3.3.6 ENV SPARK_HOME=/opt/spark/spark-3.5.2-bin-hadoop3 ENV PYSPARK_PYTHON=/usr/bin/python3 ENV PATH="$PATH:/opt/spark/spark-3.5.2-bin-hadoop3/sbin" ENV SPARK_NO_DAEMONIZE=true EOF
docker build --platform=linux/amd64 -t my-spark:1.0 -f /tmp/spark-dockerfile .
Spark Master 실행하기.
생성된 Spark Image 를 기반으로 Spark Master 를 Docker Container 로 생성하려고 합니다.
아래 이미지와 같이 Spark Cluster 를 Master - Worker 의 구조를 취합니다.
그래서 저는 Spark Master 를 Docker Container 로 생성해보겠습니다.
아래의 Docker Command 는 Spark master 를 실행시키기 위한 명령어입니다.
Port 8080번을 통해서 Spark 의 Web UI Port 를 활성화시킬 수 있고,
Port 7077번을 통해서 Master 와 Worker 그리고 Client 가 소통할 수 있습니다.
docker run -d \ --name spark-master \ --platform=linux/amd64 \ -p 8080:8080 -p 7077:7077 \ my-spark:1.0 bash -c start-master.sh
실행된 Spark Master Docker Container 를 아래의 이미지처럼 http://localhost:8080 를 통해서 Web UI 를 확인할 수 있습니다.
지금까지는 Spark Master 만이 실행되고 있기 때문에 별도의 Worker 와 Application 을 확인할 수 없습니다.
Spark Worker 실행하기.
Spark Worker 의 실행을 위한 Docker Command 는 아래와 같습니다.
start-worker.sh 쉘스크립트를 통해서 Spark Worker 를 실행하며, Spark Master 의 URI 를 입력해주어야합니다.
Docker Container 들 사이의 통신을 위해서 host.docker.internal 를 Hostname 으로 사용합니다.
docker run -d \ --name spark-worker1 \ --platform=linux/amd64 \ my-spark:1.0 \ start-worker.sh spark://host.docker.internal:7077 --cores 5
Spark Worker Container 가 정상적으로 실해된다면, 아래의 이미지처럼 Spark Master 의 Web UI 를 통해서 추가된 Worker 를 확인할 수 있습니다.
Docker Compose 로 구현하기.
아래는 1개의 Master 와 2개의 Worker 를 실행하는 Docker Compose 예시입니다.
cat <<EOF> /tmp/docker-compose.yaml services: master: container_name: master platform: linux/amd64 image: my-spark:1.0 ports: - "8080:8080" - "7077:7077" command: start-master.sh worker-1: container_name: worker-1 platform: linux/amd64 image: my-spark:1.0 depends_on: - master command: start-worker.sh spark://master:7077 --cores 1 worker-2: container_name: worker-2 platform: linux/amd64 image: my-spark:1.0 depends_on: - master command: start-worker.sh spark://master:7077 --cores 1 EOF docker-compose -p spark-cluster -f /tmp/docker-compose.yaml up -d
위 Docker Compose 를 실행하게 되면, 아래와 같이 Docker Container 들이 실행됩니다.
그리고 Spark Master 의 Web UI 를 통해서 연결된 Workers 들을 확인할 수 있죠.
Spark Application 제출하기.
아래와 같이 간단한 PySpark 코드를 작성합니다.
from pyspark import SparkConf, SparkContext conf = SparkConf().setAppName("test-parallelize") sc = SparkContext(conf=conf) local_list = list(range(10)) print(f'local_list: {local_list}') rdd = sc.parallelize(local_list).map(lambda x: x * 2) output = rdd.collect() print('\n') print(f'rdd : {output}') sc.stop()
그리고 아래와 같은 spark-submit Command 를 통해서 Spark Application 을 실행할 수 있습니다.
sudo $SPARK_HOME/bin/spark-submit \ ./test_parallelize.py \ --master spark://localhost:7077 \ --spark.driver.bindAddress localhost \ --executor-cores 1
반응형'Spark' 카테고리의 다른 글
[Spark] Window 알아보기 ( lag, lead, sum ) (0) 2024.05.15 [Spark] Spark 로 Web File Reader 구현하기 ( SparkFiles ) (0) 2024.03.18 [Spark] Row 알아보기 (0) 2024.03.03 [Spark] approxCountDistinct 알아보기 (0) 2024.02.22 [Spark] Logical Plan 알아보기 1 (Catalyst Optimizer) (2) 2024.01.28