1. Intro
- spark을 쓰기 위해서 EMR 클러스터를 띄우고 운영하는 것은 어려운 일이다.
- EMR 클러스터가 각종 이유로 장애에 빠질 수 있기 때문이다.
- 또한 효율적으로 운영하기도 힘들다.
- 아마존에는 lambda 처럼 serverless spark 서비스가 존재한다.
- aws glue 라는 서비스인데 EMR 없이 spark을 사용할 수 있다.
- serverless spark을 쓰기위한 방법을 알아보자!
1-1 Glue spark job 장점
- 복잡한 EMR 클러스터를 관리할 필요가 없다!
- scale out이 매우 쉽다.
1-2 Glue spark job 단점
- 설정에 있어 상당히 제한적이다.
- executor 메모리, core 등 설정은 glue deafult를 따라야한다.
- 디버깅이 힘들다
- 람다가 ec2보다 디버깅이 힘든이유와 같다,,,
- 비싸다
- lambda가 ec2보다 비싸듯이 EMR보다 glue가 비싸다
1-3 어떨때 Glue를 쓸까?
- emr 클러스터가 크게 필요없고, emr 관리할 전문가가 없을때
- spark 잡 수가 많지 않을때
- spark을 가끔 간헐적으로 돌리고 싶을때
1-4 어떨때 EMR을 쓸까?
- emr 클러스터 사용 대비 glue spark 비용으로 인한 추가 비용이, emr 클러스터 전문가를 채용 비용보다 훨씬 높게 나올때
- spark 잡의 복잡한 설정이 필요할때
2. Serverless Spark 소개
- serverless glue spark은 glue job이라는 서비스를 통해 이용할 수 있다.
- Add Job을 클릭후 pyspark을 선택후 glue3.0 버전을 선택하여 이용할 수 있다.
- 왠만한 설정들은 거의 직관적이라 잘 설정가능하고 검색이 쉽다.
- 잡 설정 화면
- 아래와 같이 glue 코드를 RUN job 버튼을 통해 돌리면 돌아가게 된다!
- 아래와 같은 코드로 스팍세션을 가져올 수 있고 작업을 할 수 있게 된다.
spark = (SparkSession.builder
.enableHiveSupport() \
.getOrCreate())
return spark
- run job을 통해 돌아간 결과의 로그나 돌아가고 있는 상황도 실시간으로 UI를 통해 확인 할 수 있다.
3. Glue spark 까다로운 점
-
package dependency
- 위 처럼 간단하게 glue 스팍을 실행해보고 spark session을 통해 s3에 있는 예제를 돌리는 것 까지는 별 문제가 없다.
- glue spark을 처음 쓰게 될 때 제일 짜증나는 것은 바로 파이썬 패키지 즉 dependency 관리이다.
- 아무런 설정 없이 쓰게 되면 glue spark에 설치 되어있는 기본 패키지 밖에 못 쓰기 때문이다.
-
subnet, security group 설정
- vpc안에 있는 rdb, redis, ec2 등 각종 서버에 접속하고 싶을 수 있다.
- 이때 connection이라는 것을 설정해줘야 하는데 처음하면 어려울 수 있다.
4. Glue spark 패키지 관리
4-1 패키지 설정 방법 기본
- glue 스팍에서 패키지 인스톨 방법은 크게 2가지 방법이 있다.
- Security configuration, script libraries, and job parameters (optional)메뉴 활용
- 해당 메뉴 탭에서 위 처럼 library path를 넣을 수 있도록 해놨다.
- 위 경로에 파이썬 패키지 압축파일을 넣으면 된다.
- 이 방법 은 pure python만 된다는 아주 큰 단점이 있다.
- --additional-python-modules
- additional-python-modules 라는 파라메터로 필요한 패키지 목록을 넘기면 worker가 뜨기전에 pip3 설치를 한번 해주고 띄운다.
- 아래처럼 job paraemters 항목에서 설정해주면 된다.
- 1번 방법은 pure python이라는 매우 제한된 경우만 가능하며 나는 tensorflowm, numpy등 다양한 c-extention을 필요로하는 패키지가 필요했다. 따라서 2번방법을 선택했다.
4-2 패키지 설정 방법 응용
- pip3 install 을 glue job 실행마다 매번 해줘야 한다. 조금이라도 더 빠르게 이 과정을 넘길 수 없을까?
- pip 서버에 없는 custom 모듈 import는 어떻게 할 수 있을까?
.whl 파일 넘기기
- glue 가 돌아가는 환경인 amazonlinux 도커 컨테이너를 기반으로 한다.
- 해당 컨테이너에서 필요한 우분투 패키지를 설치한다(git, pip등)
- requriments.txt경로를 바인딩하여 필요한 패키지를 pip install -w 옵셥을 통해 빌드하여 whl 파일 리스트를 얻는다.
- 이 리스트를 s3 경로로 올린다.
- boto3 glue api를 통해 glue job의 파라메터에 다음과 같이 값을 추가했다.
- "s3에 있는 whl 패키지 리스트"를 value로 "--additional-python-modules"를 key로 설정
whl 파일을 통해 isntall 을 할 경우 pip install 시간이 크게는 2배까지 빨라진다. 이는 곧 이용시간으로 과금하는 glue의 비용절약이 된다.
setup.py 설정
- import 할때 프로젝트 내부에 있는 custom 모듈을 넘겨야할 수 있다.
- 이러한 경우 때문에 프로젝트에 setup.py를 만들고 해당 repo의 일부를 패키지화 했다.
- requriments.txt 에는
git+ssh://github.com/seonghwan/repo1@master
와 같이 추가해줬다.
- 이런식으로 하면 해당 repo의 whl파일도 같이 만들어져서 import를 할 수 있게 된다.
5. Connection
- 이제 VPC안에 있는 리소스에 접근하기 위한 설정을 알아보자.
- 내트워크 설정을 위해서는 connection이라는 것을 만들어주고 이를 추가하면 된다.
- 이때 설정창에서 JDBC니 뭐니 하면서 사람 정말 헷갈리게 만들게 된다. 검색해봐도 뭔가 이상하다..
- DB 설정밖에 못하나..?
- 서버 접속은 어떻게하지...?
- redis는..?
- 등등..
- 현재 목적에서는 이 db 관련 설정은 별로 안 중요하고, VPC, subnet, security group 만 잘 설정해주면 된다.
- 주의할 점은 glue는 public ip를 만들어주지 않는다. 따라서 subnet 설정에 따라 외부 접속이 안 될수 있으니 명심하자.
- connection을 만들었으면 glue job 설정에서 아래 처럼 connection을 붙여주면 된다.
- 이렇게 connection을 붙여주면 설정에 따라 security 그룹내 리소스에 잘 접속할 수 있게된다!! ㅎ
6. 결론
- aws 서비스중 하나인 glue가 간단한 serverless spark 작업을 돌릴 수 있다는 것을 알아봤다.
- glue를 세팅할때 주의할 점인 connection과 package설정을 어떻게 할 수 있는지 알아봤다!