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에서 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 에러 (참고 링크)
- 아래의 명령어를 순차적으로 실행해 해결
- Server에 .gitignore 파일 추가
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 에러 발생
- 버전이 달라서 그런지 모르겠지만, 소스 코드가 공식 문서의 코드와 다른 것을 인지
- Operator 사용 중 LOAD DATA LOCAL INFILE 에러 (참고 링크)
- 결국 해결하지 못하고 다른 방법을 탐색 -> 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 방식으로 진행
- 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를 활용한 시각화 진행
- Docker 환경에서 진행되므로 EC2 환경에 설치하면 다시 시각화해야 함
- 환경이 구축될 때까지 테이블을 구상하는 방향으로 진행하면 좋을 듯
내일 할 일
- ELT 테이블 구상하기 : 지금 테이블만 사용하면, 분석 내용이 적은 것 같아 추가할 테이블을 구상
- 어느 정도 구상되면 쿼리를 작성
- transformed.property 및 각 analytics의 테이블 생성 쿼리를 실행하는 DAG 작성
- 이 경우 merge_table DAG가 끝나면 실행하도록 Sensor를 사용해도 좋을 것 같음
- 현재 다방의 데이터 타입 변환에서 문제가 생김
- 오늘 내로 해결되지 않으면, 내일 AWS Glue를 활용해 스키마를 변형하는 방법 시도해 보기
- (데이터 타입 변환 문제는 해결돼서 이 부분은 고려하지 않아도 될 듯)
- Metabase EC2 구축이 완료되면, 생성한 테이블을 활용한 시각화 진행
2024-08-02 (금)
오늘 한 일
- 추가적인 ELT 테이블 구상을 진행했지만, 의미 있는 것은 찾기 힘듦
- 가격과 다른 컬럼의 조합으로 인사이트를 도출하는 것이 최선이라 판단
- 대시보드 시각화 추가 작업
- 아직 EC2에 Metabase 구축이 이루어지지 않아 로컬에서 추가적인 시각화 진행
- 평균 월세 + 관리비, 보증금 그래프 : 월세를 기준으로 오름차순으로 확인 가능
- Heatmap 형태의 지도 : 평균 월세 + 관리비에 따른 Grid Map 생성
- create_transformed_and_analytics_table DAG 작성
- transformed.property 생성 및 5개의 분석 테이블 생성 쿼리를 DAG로 작성
- transformed.property가 생성된 이후 이 테이블을 활용해 분석 테이블이 생성됨
- 각 테이블 생성을 Task로 나눠 어느 테이블 생성이 실패했는지 확인 가능
- load_merge_table_to_redshift_and_rds DAG에 Trigger Task 추가
- TriggerDagRunOperator를 사용해 create_transformed_and_analytics_tables DAG Trigger
- 병합 테이블 제작이 완료되면, 분석 테이블이 만들어지는 작업이 시작됨
- 각 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가 구축되면, 시각화 내용 옮기기
- 추가로 진행할 내용이 생각나지 않는다..
- 하루 이틀이면, 위의 내용은 다 할 것이라 생각
- 추가로 할 것이 없다면, 다른 팀원의 작업을 도와 프로젝트 완성 진행
'[프로그래머스] 데이터 엔지니어링 데브코스 3기 > TIL(Today I Learn)' 카테고리의 다른 글
[TIL - 5주차] 데브코스 최종 프로젝트 (0) | 2024.08.16 |
---|---|
[TIL - 4주차] 데브코스 최종 프로젝트 (0) | 2024.08.05 |
[TIL - 2주차] 데브코스 최종 프로젝트 (0) | 2024.07.21 |
[TIL - 1주차] 데브코스 최종 프로젝트 (0) | 2024.07.13 |
[TIL - 80일 차] Spark, SparkML 실습 (5) (0) | 2024.07.12 |