TIL (2024-07-29 ~ 2024-08-02)
2024-07-29 (월)
오늘 한 일
ELT보다 웹 서비스 제작을 우선적으로 지원하여 제작하기로 결정
현재 프론트 디자인은 완료되었고, Request/Response 작업은 다른 팀원 분이 진행
VPC, RDS 구축이 이루어지면 RDS와 Server를 연결하는 작업 진행
(RDS 구축 이후 웹 서비스 제작 이전에 S3 -> RDS 벌크 업데이트 테스트부터 해야 함)
웹 제작 지원 (Frontend)
메인 페이지와 보증금, 월세를 입력받는 페이지 디자인 (React)
메인 페이지
보증금, 월세 입력 페이지
웹 제작 지원 (Server)을 위한 작성된 코드 리딩
Server 쪽에서 지원할 사항은 RDS 연결과 프론트 - 백엔드 디버깅
지원을 위한 django 웹 서버 코드 리딩
RDS와 연결하는 방법 탐색 + .gitignore 적용 (참고 링크 )
Server - RDS 연결 과정 : 생각보다 간단함
Settings.py에 Database에 Mysql Connection 추가
적용을 위한 python manage.py migrate
내일 할 일
웹 제작 지원 (Server)을 위해 팀원에게 작성된 코드 리뷰 듣기
EC2, RDS 구축이 완료될 경우
S3 -> RDS : 벌크 업데이트를 진행하는 DAG 테스트 -> 완료 시 github PR
웹 서버와 RDS 연결 진행
2024-07-30 (화)
오늘 한 일
코어 타임이 시작되고 얼마 안돼서 EC2와 RDS 구축 완료
S3 -> RDS 벌크 업데이트를 진행하는 DAG Test
웹 제작 지원 (Server) : django와 RDS Connection
S3 -> RDS 벌크 업데이트를 진행하는 DAG Test
이전에 parquet으로 unload한 코드를 RDS 적재를 위해 csv로 변경
Private Subnet에 존재하는 RDS에 접근하려면 EC2에 접속해야 함
클라우드를 담당하는 팀원 분에게 부탁해서 S3 -> RDS Test 부탁
끝날 때 쯤 테스트를 위한 네트워크가 구성돼서 내일 다시 확인 진행
웹 제작 지원 (Server) : Django Database에 RDS 연결
Server에 .gitignore 파일 추가
캐시 파일(*.pyc)과 민감한 정보가 포함된 settings.py 추가
EC2와 RDS 연결
EC2에서 Django 설치 (참고 링크 ) : python3-pip 및 Django 실행을 위한 가상 환경 구축
장고 환경 구축 (참고 링크 ) : EC2 - RDS 연결
EC2에서 git clone 에러 (참고 링크 )
Github의 Personal Access Tokens 발급으로 해결
sudo apt-get python3-pip 실행 중 Package 'python3-pip' has no installation candidate 에러 (참고 링크 )
sudo apt-get update 실행으로 해결
Django 실행을 위한 mysqlclient, drf_yasg 설치 중 Dependency 에러 (참고 링크 )
sudo apt-get install python3-dev default-libmysqlclient-dev build-essential pkg-config
sudo apt install libffi-dev
pip install mysqlclient
ELT 작업을 위한 시각화 구체화
각 시각화 별 필요한 컬럼과 내용, 목적 정리
목적을 정의해두지 않으면 의미가 없을 것이라 생각함
시각화 구체화
내일 할 일
시각화를 진행할 테이블 생성 쿼리 작성
중개업자는 데이터가 없어 쿼리 작성이 어려울 수도 있음
쿼리 작성이 마무리되면, DAG로 옮기기
웹을 전담하고 있는 분이 도움이 필요하기 전까지 ELT 작업 진행
2024-07-31 (수)
오늘 한 일
S3 -> RDS csv 파일 적재를 위해 S3ToMySqlOperator 사용
Operator 사용 중 LOAD DATA LOCAL INFILE 에러 (참고 링크 )
해결하기 위해서는 MySql 서버와 클라이언트 모두 local_infile이 True로 설정돼 있어야 함
시도 1 (실패) : Airflow Connections의 Extra에 {'local_infile' : 1} 추가
시도 2 (실패) : Operator의 extra_options에 {'local_infile' : 1} 추가
소스 코드를 확인해보니 __init__에 mysql_local_infile 변수가 존재하는 것을 확인 (참고 링크 )
mysql_local_infile = True로 해줬지만, Invalid arguments 에러 발생
버전이 달라서 그런지 모르겠지만, 소스 코드가 공식 문서의 코드와 다른 것을 인지
결국 해결하지 못하고 다른 방법을 탐색 -> S3Hook, MySqlHook 사용
애초에 S3ToMySqlOperator가 S3Hook, MySqlHook으로 이루어져 있음
S3ToMySqlOperator의 execute 부분을 가져와 사용 -> RDS에 정상적으로 접근 확인
extra_options를 추가하지 않으면, 하나의 컬럼으로 적재됨 (참고 링크 )
extra_options를 활용한 구분자와 열 구분, 헤더 제거 필요
extra_options를 딕셔너리 형태로 넣을 경우 에러 발생
MySqlHook의 bulk_load_custom 함수의 코드를 가져와 쿼리에 option을 직접 입력 -> 정상 작동 확인
title의 존재하는 ','를 구분자로 인지하는 오류는 REPLACE로 '.'으로 치환하여 진행
LOAD 이전에 DELETE 문을 활용하여 FULL REFRESH 방식으로 진행
mysql_local_infile 매개변수 에러
하나의 컬럼에 적재된 테이블
MySqlHook의 bulk_load_custom의 LOAD Query
ELT 테이블 생성
생성 완료
매물별 보증금, 월세 + 관리비 테이블
지역별 편의시설이 모두 존재하는 매물 개수 테이블
중개소별 매물 개수
층수별 매물 개수
생성해야할 테이블
인증된 중개업자와 인증이 안된 중개업자의 수 테이블
내일 할 일
팀원 분과 데이터 관련 이야기 진행
서울 데이터 필터링 : Redshift에서 할 것인지 서비스에서 할 것인지
안전 여부 판단 : Redshift에서 할 것인지 서비스에서 할 것인지
다방 데이터 파일 위치 조정
고려했던 ELT 테이블 생성 후 대시보드 툴 선택, 시각화
인증된 중개업자와 인증이 안된 중개업자의 수 테이블 생성
Grafana, Preset 등의 대시보드 툴 중 적합한 것을 선택
생성한 테이블을 활용한 대시보드 제작
2024-08-01 (목)
오늘 한 일
팀원 분과 데이터 관련 이야기 진행 완료
서울 데이터 필터링, 안전 여부 판단은 모두 서비스 단에서 진행
다방 데이터 파일은 날짜별 디렉터리에 저장
추가로 외부 테이블을 위해 하나의 디렉터리에 중첩되도록 저장 (파일 하나 유지)
분석 테이블 생성을 위해 transformed 스키마에 property 테이블 생성
서울시의 데이터만으로 분석을 진행하기 위해 raw_data 필터링
분석에 사용할 데이터만 가져와 비용 절감
DROP TABLE IF EXISTS transformed.property;
CREATE TABLE transformed.property AS (
SELECT room_id, floor, area,
deposit, rent, maintenance_fee,
CASE
WHEN address LIKE '%강남구%' THEN '강남구'
WHEN address LIKE '%강동구%' THEN '강동구'
WHEN address LIKE '%강북구%' THEN '강북구'
WHEN address LIKE '%강서구%' THEN '강서구'
WHEN address LIKE '%관악구%' THEN '관악구'
WHEN address LIKE '%광진구%' THEN '광진구'
WHEN address LIKE '%구로구%' THEN '구로구'
WHEN address LIKE '%금천구%' THEN '금천구'
WHEN address LIKE '%노원구%' THEN '노원구'
WHEN address LIKE '%도봉구%' THEN '도봉구'
WHEN address LIKE '%동대문구%' THEN '동대문구'
WHEN address LIKE '%동작구%' THEN '동작구'
WHEN address LIKE '%마포구%' THEN '마포구'
WHEN address LIKE '%서대문구%' THEN '서대문구'
WHEN address LIKE '%서초구%' THEN '서초구'
WHEN address LIKE '%성동구%' THEN '성동구'
WHEN address LIKE '%성북구%' THEN '성북구'
WHEN address LIKE '%송파구%' THEN '송파구'
WHEN address LIKE '%양천구%' THEN '양천구'
WHEN address LIKE '%영등포구%' THEN '영등포구'
WHEN address LIKE '%용산구%' THEN '용산구'
WHEN address LIKE '%은평구%' THEN '은평구'
WHEN address LIKE '%종로구%' THEN '종로구'
WHEN address LIKE '%중구%' THEN '중구'
WHEN address LIKE '%중랑구%' THEN '중랑구'
ELSE '기타'
END AS district,
latitude, longitude, registration_number,
agency_name, agent_name, subway_count, store_count,
cafe_count, market_count, restaurant_count, hospital_count
FROM raw_data.property
WHERE district NOT LIKE '기타'
);
ELT 테이블 생성 완료
고려했던 5개의 테이블 생성 완료 -> 쿼리를 적으면 너무 길어질 것 같아 생략
생각보다 분석 내용이 적은 것 같아 추가할 테이블을 더 생각해 볼 것
대시보드 툴 선택 완료
Metabase라는 시각화 툴로 진행하기로 결정
Grafana VS Superset (참고 링크 ) : 일반적으로 Grafana는 모니터링, Superset은 BI에 사용
Metabase, Superset, Redash, Grafana (참고 링크 ) : 속도가 빠르고 가벼운 Metabase 선택
Metabase 사용법 (참고 링크 ) : 설치 방법 및 사용법
가능하면 Preset을 사용하려고 했지만, 지도 시각화에서 오류가 발생해 변경
Metabase를 활용한 시각화 진행
Docker 환경에서 진행되므로 EC2 환경에 설치하면 다시 시각화해야 함
환경이 구축될 때까지 테이블을 구상하는 방향으로 진행하면 좋을 듯
Metabase 시각화 일부
내일 할 일
ELT 테이블 구상하기 : 지금 테이블만 사용하면, 분석 내용이 적은 것 같아 추가할 테이블을 구상
어느 정도 구상되면 쿼리를 작성
transformed.property 및 각 analytics의 테이블 생성 쿼리를 실행하는 DAG 작성
이 경우 merge_table DAG가 끝나면 실행하도록 Sensor를 사용해도 좋을 것 같음
현재 다방의 데이터 타입 변환에서 문제가 생김
오늘 내로 해결되지 않으면, 내일 AWS Glue를 활용해 스키마를 변형하는 방법 시도해 보기
(데이터 타입 변환 문제는 해결돼서 이 부분은 고려하지 않아도 될 듯)
Metabase EC2 구축이 완료되면, 생성한 테이블을 활용한 시각화 진행
2024-08-02 (금)
오늘 한 일
추가적인 ELT 테이블 구상을 진행했지만, 의미 있는 것은 찾기 힘듦
가격과 다른 컬럼의 조합으로 인사이트를 도출하는 것이 최선이라 판단
대시보드 시각화 추가 작업
아직 EC2에 Metabase 구축이 이루어지지 않아 로컬에서 추가적인 시각화 진행
평균 월세 + 관리비, 보증금 그래프 : 월세를 기준으로 오름차순으로 확인 가능
Heatmap 형태의 지도 : 평균 월세 + 관리비에 따른 Grid Map 생성
막대 그래프
Grid Map
create_transformed_and_analytics_table DAG 작성
transformed.property 생성 및 5개의 분석 테이블 생성 쿼리를 DAG로 작성
transformed.property가 생성된 이후 이 테이블을 활용해 분석 테이블이 생성됨
각 테이블 생성을 Task로 나눠 어느 테이블 생성이 실패했는지 확인 가능
Task 실행 순서
load_merge_table_to_redshift_and_rds DAG에 Trigger Task 추가
TriggerDagRunOperator를 사용해 create_transformed_and_analytics_tables DAG Trigger
병합 테이블 제작이 완료되면, 분석 테이블이 만들어지는 작업이 시작됨
각 Task의 실행 순서를 효율적인 실행이 이뤄지도록 조작
Task 실행 순서
내일(다음 주 월) 할 일
가진 데이터를 활용한 테이블 & 시각화 추가 내용 고려
구글링을 통해 매물 데이터로 추가 생성할 테이블 찾아보기 -> 한 번 더 찾아보자..
가격이나 매물 개수 등의 수치로 인사이트 도출 가능
Metabase EC2가 구축되면, 시각화 내용 옮기기
이번 주에 진행한 일, 다음 주에 진행할 일
이번 주에 진행한 일
웹 제작 지원
Front : 메인 페이지와 보증금, 월세를 입력받는 페이지 디자인 (React)
Server : Django와 RDS 연결 작업 진행
ELT 작업 및 시각화
구상한 5개의 테이블을 구상하고 쿼리로 작성
분석 테이블을 DAG로 작성하여 자동화
Metabase를 활용하여 대시보드 시각화
load_merge_table_to_redshift_and_rds DAG
S3 -> RDS 벌크 업데이트 Airflow Task 오류 해결 및 DAG 적용
Trigger를 활용해 Redshift에 데이터가 적재되면 분석 테이블 생성 DAG Trigger
실행 순서도 조작하여 효율적으로 Task 실행
create_transformed_and_analytics_table DAG
transformed.property 생성 및 5개의 분석 테이블 생성 쿼리를 DAG로 작성
transformed.property가 생성된 이후 이 테이블을 활용해 분석 테이블이 생성됨
각 테이블 생성을 Task로 나눠 어느 테이블 생성이 실패했는지 확인 가능
다음 주에 진행할 일
가진 데이터를 활용한 테이블 & 시각화 추가 내용 고려
현재 시각화 자료가 생각보다 많지 않음
구글링을 통해 매물 데이터로 추가 생성할 테이블 찾아보기
Metabase EC2가 구축되면, 시각화 내용 옮기기
추가로 진행할 내용이 생각나지 않는다..
하루 이틀이면, 위의 내용은 다 할 것이라 생각
추가로 할 것이 없다면, 다른 팀원의 작업을 도와 프로젝트 완성 진행