데이터 엔지니어링 정복/Python
[FastAPI] FastAPI로 PySpark 사용하기
noohhee
2025. 5. 20. 16:40
728x90
반응형
1. 설치
https://wikidocs.net/book/8531
위 참고 책을 참고하면 가상환경에 FastAPI사용하는데 가상환경을 사용하면 스파크 사용시 가상환경 파이썬을 배포해줘야하니
일단 편의상 가상환경을 사용하지 않고 바로 서버에 설치하고 사용해본다.
먼저 Fastapi와 uvicorn 파이썬 패키지를 웹서버 띄울 서버에 설치해준다.
여기선 gn001서버에 설치한다.
FastAPI는 비동기 처리를 지원하여 높은 성능을 제공하고, 타입 검사 및 자동화된 API 문서 생성을 통해 개발자가 빠르게 효율적인 RESTful API를 구축할 수 있도록 돕습니다. Uvicorn은 경량의 웹 서버로, FastAPI와 같은 비동기 웹 프레임워크에서 높은 성능의 API를 실행하고 배포할 수 있도록 해줍니다. |
추후에 spark3-submit으로 실행해야하는데 현재 spark3에서 사용하는 기본 일단 미니콘다 3.7이다.
근데 프로젝트에서 주로 사용하고 있는 파이썬은 3.8이므로 일단 pip38로 설치해준다.
[root@myserver00 ~]# pip38 install fastapi uvicorn |
2. FastAPI 사용을 위한 코드개발
아래와 같이 python스크립트에서 fast api 사용을 위한 객체를 만들고,
/get을 호출하는 Api 요청이 있을 경우 spark job을 실행해서 해당 결과를 반환해주도록 만든다.
[root@myserver00 ~]# su - myuser [myuser@myserver00 ~]$ mkdir fastapi [myuser@myserver00 ~]$ cd fastapi/ #아래 uvicorn .run 코드에서 현재 서버의 IP와 방화벽이 뚫려있는 포트를 사용한다.(여기서는 8080을 사용했다.) [myuser@myserver00 fastapi]$ vim main.py [myuser@myserver00 fastapi]$ chmod +x main.py #FastAPI 사용을 위해 Uvicorn 웹서버 백그라운드에서 실행한다. #이때 Spark3-submit을 사용해줘야 하고, 위에서 pip38 패키지를 설치해서 spark가 사용하는 Python도 동일하게 맞춰줘야 한다. [myuser@myserver00 fastapi]$ nohup spark3-submit \ --master yarn \ --deploy-mode client \ --driver-cores 4 \ --driver-memory 8G \ --conf spark.pyspark.python=/usr/local/bin/python38 \ --conf spark.pyspark.driver.python=/usr/local/bin/python38 \ --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=/usr/local/bin/python38 \ --conf spark.yarn.appMasterEnv.PYSPARK_DRIVER_PYTHON=/usr/local/bin/python38 \ /home/myuser/fastapi/main.py 2>&1 & #엔터치면 nohup.out 파일에 로그가 계속 쓰여진다. [myuser@myserver00 fastapi]$ 엔터 [myuser@myserver00 fastapi]$ tail -f nohub.out #이제 터미널 하나 더 켜서 curl명령어로 api호출해본다. #아래 테이블을 조회해본다. [myuser@myserver00 ~]$ curl -s "http://10.10.10.10:8080/data?db_name=test_db&table_name=test_tbl" | jq "{\"column1\":\"data1\",\"column2\":\"data2\"}", #위와 같이 정상적으로 조회가 된다. #API 호출이 되면 Spark코드가 실행되는 구조이므로 스파크가 데이터를 처리하는데 시간이 걸린다. #위 코드의 경우 약 15초 정도 기다리면 결과를 리턴받을 수 있다. |
3. 실행하기
3.1. 실행준비
아래와 같이 실행의 편의성과 로그를 확인하기 위해 디렉터리를 나누고 실행해주는 스크립트와 작동을 멈춰주는 스크립트를 만들어준다.
[myuser@myserver00 ~]$ cd /home/myuser/fastapi/ [myuser@myserver00 fastapi]$ mkdir log; mkdir scripts [myuser@myserver00 fastapi]$ mv main.py scripts/ [myuser@myserver00 fastapi]$ touch start.sh [myuser@myserver00 fastapi]$ touch stop.sh [myuser@myserver00 fastapi]$ vim start.sh #만약 파이썬 스크립트의 파일명이 바뀐다면(현재 main.py) stop.sh스크립트의 FILTER 변수의 값도 바뀌어야 한다. [myuser@myserver00 fastapi]$ vim stop.sh [myuser@myserver00 fastapi]$ chmod +x *.sh |
3.2. 실행하기
#FastAPI 실행 [myuser@myserver00 ~]$ /home/myuser/fastapi/start.sh #현재 실행중인 FastAPI Log확인하기 [myuser@myserver00 ~]$ tail -f /home/myuser/fastapi/log/{로그파일명}.log #YARN에서 실행중인 FastAPI Job 확인 #Application Name중에 FastAPI with Spark으로 된 것을 찾는다. #YARN Running WEB에서 해당 Application ID를 클릭하여 Spark Job의 WEB으로 접속할 수 있다. #FastAPI WEB화면 접속하기 http://myserver00:8080/docs #다른 서버 터미널 CLI에서 curl 명령어로 API Call해보기 #APi 결과를 test.txt파일로 출력시킨다. [myuser@myserver01 ~]$ curl -s "http://10.10.10.10:8080/data?db_name=test_db&table_name=test_tbl" | jq > text.txt [myuser@myserver01 ~]$ cat test.txt [ "{\"column1\":\"data1\",\"column2\":\"data2\"}", #FastAPI 종료하기 [myuser@myserver00 ~]$ /home/myuser/fastapi/stop.sh |
728x90
반응형