ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spark] Spark Cluster 를 구축하기 ( Docker )
    Spark 2024. 5. 17. 22:31
    728x90
    반응형

     

    - 목차

     

    들어가며.

    이번 글에서는 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 로 생성해보겠습니다.

     

    https://medium.com/analytics-vidhya/creating-apache-spark-standalone-cluster-with-on-windows-95e66e00a2d8

     

     

    아래의 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

     

     

    반응형
Designed by Tistory.