책을 공부하며 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 |