프로그래밍/Spark

pyspark mysql 연동 (feat.docker)

장경훈 2022. 11. 21. 09:59

책을 공부하며 spark와 mysql을 연동시키는 방법에 대해서 실습하려고 했다. 하지만 내 mac에 라이브러리, 버전 등이 너무 꼬여버려서 차라리 이럴 거면 docker로 구축해야겠다고 생각해서 docker로 구현한 것을 정리해 보았다.

 

1. docker- compsoe.yml 작성 

version: '3'

services:
  spark:
    image: docker.io/bitnami/spark:3.3
    environment:
      - SPARK_MODE=master
      - SPARK_RPC_AUTHENTICATION_ENABLED=no
      - SPARK_RPC_ENCRYPTION_ENABLED=no
      - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
      - SPARK_SSL_ENABLED=no
    ports:
      - '8080:8080'
    volumes: #mysql과 통신하기 위한 드라이버, 테스트를 위한 python script 볼륨 마운트
      - ./mysql-connector-j-8.0.31.jar:/opt/bitnami/spark/jars/mysql-connector-j-8.0.31.jar
      - ./script:/opt/bitnami/spark/script
    networks:
      default_bridge: #고정 ip 할당
        ipv4_address: 172.19.0.2
  spark-worker:
    image: docker.io/bitnami/spark:3.3
    environment:
      - SPARK_MODE=worker
      - SPARK_MASTER_URL=spark://spark:7077
      - SPARK_WORKER_MEMORY=1G
      - SPARK_WORKER_CORES=1
      - SPARK_RPC_AUTHENTICATION_ENABLED=no
      - SPARK_RPC_ENCRYPTION_ENABLED=no
      - SPARK_LOCAL_STORAGE_ENCRYPTION_ENABLED=no
      - SPARK_SSL_ENABLED=no
    networks:
      default_bridge: #고정 ip 할당
        ipv4_address: 172.19.0.3
  mysql: #mysql 컨테이너 설정
    image: mysql:8.0.31
    container_name: mysql
    stdin_open: true
    ports:
      - 3306:3306
    environment: #root의 비밀번호를 root로 설정
      MYSQL_ROOT_PASSWORD: root
    tty: true
    networks: #고정 ip 할당
      default_bridge:
        ipv4_address: 172.19.0.4

networks: #고정 ip 할당을 위한 서브넷마스크 설정 
  default_bridge:
    driver: bridge
    ipam:
      config:
        - subnet: 172.19.0.0/24

기본적으로 spark에 대한 docker-compose는 아래의 레포를 사용했다. 

https://github.com/bitnami/containers/blob/main/bitnami/spark/docker-compose.yml

여기에 mysql에 대한 부분을 추가했으며 spark와 mysql이 서로 통신을 원활하게 할 수 있도록 고정 ip를 할당시켰다. 또한 spark에서 mysql과 통신하기 위해서는 driver가 필요하기 때문에 볼륨에 마운트 해서 저장시켰다.

 

2. mysql connection 드라이버 다운 

https://dev.mysql.com/downloads/connector/j/

앞서 말한 통신을 하기 위해 필요한 드라이버를 다운받을 수 있는 링크이다. 여기서 운영체제에 맞는 드라이버를 다운로드한다. 혹시나 이 글을 참고할 사람이 있을 수 있으니 디렉토리 구조는 다음과 같다.

  • script
    • spark_test.py
  • docker-compose.yml
  • mysql-connector-j-8.0.31.jar

앞서 docker compose 마운트 한 파일들이며 현재는 연동에 대한 테스트만 한 것임으로 따로 디렉터리를 정리하지는 않았다.

 

3. 연동 테스트 파일 작성(feat. python)

from pyspark.sql import SparkSession

spark=SparkSession\ #SparkSession을 mysql 드라이버 경로를 지정한 후 생성
    .builder\
    .config("spark.jars","/opt/bitnami/spark/jars/mysql-connector-j-8.0.31.jar")\
    .master("local")\
    .appName("mysql_test")\
    .getOrCreate()


mysql_table=spark.read.format("jdbc")\ #df생성
            .options(url="jdbc:mysql://172.19.0.4:3306/spark_test",
                    driver="com.mysql.jdbc.Driver", 
                    dbtable="test",
                    user="root",
                    password="root").load()

#저장된 df출력
mysql_table.show()

여기서 url 부분의 spark_test는 임시로 만든 스키마며 dbtable 또한 임시로 만든 것이다. 혹시 이 script를 사용한다면 각자의 환경에 맞게 수정해줄 필요가 있다.

#test파일 실행
spark-submit spark_test.py

이제 정상적으로 연동이 되었는지 확인만 하면 끝이다. 컨테이너에 접속한 뒤 script가 있는 폴더에서 위의 명령어를 실행시켜보자 

4. 연동 결과

정상적으로 연동이 되어서 출력되는 모습을 볼 수 있다. 나는 앞서서 mysql에 테스트 데이터를 한 개 생성했었다. 처음에는 생각보다 간단할 줄 알았는데 내 mac 환경이 homebrew, anaconda 등이 꼬여있어서 시간이 오래 걸렸었다.. 그냥 처음부터 docker로 구축하는 게 맞았던 것 같다. 역시 docker가 이런 부분에서는 강점이 있는 것 같다

'프로그래밍 > Spark' 카테고리의 다른 글

[spark] 캐싱, 영속화, 조인  (0) 2022.11.23
[Spark] 스파크 최적화 및 튜닝  (0) 2022.11.22
[Spark] sql + 데이터프레임 읽고 쓰기  (0) 2022.11.17
Spark 정형화 api  (0) 2022.11.15
Spark 기본 개념 및 용어정리  (0) 2022.11.14