이전에 EC2와 crontab을 사용해서 API의 데이터를 S3에 적재하는 작업을 진행하였다. 이번에는 EC2와 crontab을 사용해서 S3의 csv 파일을 Snowflake 테이블로 저장하는 작업을 진행할 것이다.
수정사항
scraping.py
API의 Schema에는 matchResult가 0, 1, 2만 존재했지만, 실제로 확인했을 때 4가 존재하였고, 이 경우 데이터가 올바르게 저장되지 않았다. 그래서 matchResult가 4인 경우 데이터 저장을 하지 않도록 수정하였다.
이전 코드
def append_match_data_to_csv(self, match_detail, shoot, pass_, defence):
match_id = self.get_match_id()
for id in match_id:
url = f'https://open.api.nexon.com/fconline/v1/match-detail?matchid={id}'
response = requests.get(url, headers=self.headers)
if 'matchInfo' in json.loads(response.text):
for match_info in json.loads(response.text)['matchInfo']:
match_info['matchDetail']['matchId'] = id
match_info['shoot']['matchId'] = id
match_info['pass']['matchId'] = id
match_info['defence']['matchId'] = id
match_detail = match_detail._append(match_info['matchDetail'], ignore_index=True)
shoot = shoot._append(match_info['shoot'], ignore_index=True)
pass_ = pass_._append(match_info['pass'], ignore_index=True)
defence = defence._append(match_info['defence'], ignore_index=True)
match_detail['matchResult'] = match_detail['matchResult'].replace({'패': 'lose', '승': 'win', '무': 'draw'})
return match_detail, shoot, pass_, defence
변경한 코드
def append_match_data_to_csv(self, match_detail, shoot, pass_, defence):
match_id = self.get_match_id()
for id in match_id:
url = f'https://open.api.nexon.com/fconline/v1/match-detail?matchid={id}'
response = requests.get(url, headers=self.headers)
if 'matchInfo' in json.loads(response.text):
for match_info in json.loads(response.text)['matchInfo']:
if match_info['matchDetail']['matchEndType'] != 4:
match_info['matchDetail']['matchId'] = id
match_info['shoot']['matchId'] = id
match_info['pass']['matchId'] = id
match_info['defence']['matchId'] = id
match_detail = match_detail._append(match_info['matchDetail'], ignore_index=True)
shoot = shoot._append(match_info['shoot'], ignore_index=True)
pass_ = pass_._append(match_info['pass'], ignore_index=True)
defence = defence._append(match_info['defence'], ignore_index=True)
match_detail['matchResult'] = match_detail['matchResult'].replace({'패': 'lose', '승': 'win', '무': 'draw'})
return match_detail, shoot, pass_, defence
crontab 명령어
환경변수를 .bashrc 파일에 적은 뒤 crontab을 실행했을 때, 데이터 수집이 진행되지 않았다. 확인 결과 crontab은 셸 환경을 로드하지 않아 .bashrc 또는 .profile의 환경 변수를 crontab에서 직접 사용할 수 없다고 한다. 그래서 crontab 명령어에 .bashrc 경로를 추가해 직접 참고할 수 있도록 수정하였다.
이전 명령어
5 * * * * /usr/bin/python3 /home/ec2-user/FC-Online-Match-Dashboard/scraping.py >> /home/ec2-user/FC-Online-Match-Dashboard/cron.log 2>&1
변경한 명령어
5 * * * * . $HOME/.bashrc; /usr/bin/python3 /home/ec2-user/FC-Online-Match-Dashboard/scraping.py >> /home/ec2-user/FC-Online-Match-Dashboard/cron.log 2>&1
crontab을 활용한 snowflake 데이터 적재 자동화
AWS EC2 설정
환경 변수 설정
이전에 적어뒀던 환경 변수와 함께 다음의 환경 변수를 추가해 주었다. 여기서 EC2 Key는 aws configure로 EC2에 등록했던 IAM Key이다. 그리고 Snowflake 정보는 python에서 snowflake.connector로 연결하기 위해 필요한 정보이다.
export EC2_ACCESS_KEY=~
export EC2_SECRET_KEY=~
export SNOWFLAKE_USER=~
export SNOWFLAKE_PASSWORD=~
export SNOWFLAKE_ACCOUNT=~
export SNOWFLAKE_WAREHOUSE=~
export SNOWFLAKE_DATABASE=~
export SNOWFLAKE_SCHEMA=~
python 코드
snowflake의 worksheets에서 활용했던 raw_data 테이블 생성, 벌크 업데이트(COPY), Analytics 테이블 생성 SQL 코드를 Python에서 실행하도록 작성하였다. 코드가 길기 때문에 github 링크를 통해 확인하면 된다.
crontab 서비스
crontab 명령어
crontab -e에 이전에 작성했던 것 아래에 해당 명령어를 적어 두 명령어가 모두 실행될 수 있도록 작성하였다. 매 시 5분에 스크래핑을 진행하고, 매 시 10분에 COPY를 진행할 것이다.
5 * * * * . $HOME/.bashrc; /usr/bin/python3 /home/ec2-user/FC-Online-Match-Dashboard/scraping.py >> /home/ec2-user/FC-Online-Match-Dashboard/cron.log 2>&1
10 * * * * . $HOME/.bashrc; /usr/bin/python3 /home/ec2-user/FC-Online-Match-Dashboard/COPY.py >> /home/ec2-user/FC-Online-Match-Dashboard/cron.log 2>&1
결과
S3 버킷에는 빈 상태이고 Snowflake는 테이블이 없는 상태에서 crontab이 진행됐을 때, 다음과 같이 파일이 생기고, 테이블이 생성된 것을 확인할 수 있었다.
다음에는 Preset Dashboard를 제작하고, Snowflake의 Analytics 테이블 데이터를 일정 시간마다 가져오도록 할 것이다.
'프로젝트 단위 공부 > [개인 프로젝트] FC Online 공식 경기 분석' 카테고리의 다른 글
[개인 프로젝트] FC Online 공식 경기 분석 (9) - 결과 분석 (2) | 2024.06.05 |
---|---|
[개인 프로젝트] FC Online 공식 경기 분석 (8) - Preset Dashboard, 자동화 (0) | 2024.06.03 |
[개인 프로젝트] FC Online 공식 경기 분석 (6) - EC2 / crontab 자동화 1 (0) | 2024.06.01 |
[개인 프로젝트] FC Online 공식 경기 분석 (5) - Snowflake analytics 테이블 생성 (0) | 2024.05.30 |
[개인 프로젝트] FC Online 공식 경기 분석 (4) - Snowflake 기본 설정 및 COPY (0) | 2024.05.29 |