본문 바로가기

데이터 엔지니어링

[Spark] 캡스톤 프로젝트🚧: from HIVE to Kafka

프로젝트 개요

 

기본적으로, Gold 관련 정보를 담는 MDM 플랫폼이 있음.

해당 플랫폼은 여러 Banking System으로부터 정보를 받아와서 저장함.

동시에, 반대로 여러 수요자들에게 저장되었던 정보를 나눠주기도 함.

 

이때 우리가 집중할 부분은 오른쪽. 그러니까 MDM 플랫폼에서 각 수요자에게 데이터를 나눠주는 파이프라인을 구축하는 것이 미션임.

 

저 많은 수요자들에게 동시다발적으로 데이터를 공급한다면, MDM 플랫폼의 안정성이 떨어질 수 있음. 그래서 우리는, 중간에 Kafka를 배치해서 안정성을 높이려고 함.

 

이때 Kafka에서 다른 수요자들에게 어떻게 데이터를 분배하는지는 그 담당자가 할 일이고, 내가 할 일은, MDM 플랫폼에서 Kafka로 어떻게 정보를 옮기느냐임. 더 자세히 그 부분을 들여다보면,

 

 

MDM의 데이터들은 HIVE에 저장되어 있는 상태임. 나는 pyspark를 활용해서, HIVE에서 데이터를 가져와서 조건에 맞게 가공한 후 Kafka로 옮기기면 됨. 매우 쉬워보임. 그러나 실제로 진행해보면 꽤나 까다롭다고 함.

 

내용물을 boil down 해보면 다음과 같음.

 

 

실무에서의 활용을 염두에 두고 코딩하기로 함. 재사용성을 위한 모듈 활용, 유닛 테스팅 등을 적극 활용하기로.

 

HIVE에서의 테이블은 아래와 같이 3개가 있고, 이 3개를 모두 활용해서 새로운 엔티티를 만들어야 함.

 

각 account는 하나 혹은 여러개의 party와 연결되어 있음.

그리고 하나의 party는 party address를 가지고 있을 수도 있고, 아닐 수도 있음.

 

우리가 할 것은, 저 세개의 테이블에서 데이터를 읽어들인 후, 그걸 합쳐서 하나의 entity record로 만들고, 이를 Kafka로 보내는 일임.

 

참고로, Kafka로 데이터를 보낼 때는 무조건 JSON 이어야 함. 그 템플릿을 정리하면 아래와 같음.

 

 

eventHeader는

keys는

payload는

이렇다.

 

 

 프로젝트 기본 설정 - 어지간한 spark 프로젝트의 시작 템플릿이라고 보면 됨

기본 틀은 아래와 같음.

 

각각의 폴더 및 파일에 대한 설명은 다음과 같음.

 

우선 관련한 모든 파일들을 pip install로 다운받아줌. python, pipenv, pyspark 등.

 

그리고 PATH 설정해줘야 함. 첫번째 코드 쳐서 나온 값의 마지막 site-packages를 Scripts로 바꿔서 PATH 설정.

$ py -m site --user-site
$ setx PATH "%PATH%;C:\Users\globa\AppData\Roaming\Python\Python311\Scripts"

 

 

git flow 전략 활용

개발 및 배포 파이프라인을 구축할 때, 일반적으로 활용하는 전략이 git flow임.

 

# 1️⃣ 개발 시작
git checkout develop
git checkout -b feature/add-login
# 기능 개발 후 커밋 & 푸시
git add .
git commit -m "Add login feature"
git push origin feature/add-login

# 2️⃣ 기능 완료 후 develop으로 병합
git checkout develop
git merge feature/add-login
git push origin develop

# 3️⃣ 배포 준비 (release 브랜치 생성)
git checkout -b release/1.0.0
# 배포 테스트 및 버그 수정 후 main 병합
git checkout main
git merge release/1.0.0
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin main --tags

# 4️⃣ 핫픽스 긴급 패치
git checkout main
git checkout -b hotfix/fix-login-error
# 버그 수정 후 main과 develop에 병합
git checkout main
git merge hotfix/fix-login-error
git checkout develop
git merge hotfix/fix-login-error
git push origin main
git push origin develop

 

이 일련의 과정을 automate 하는 것을 우리는 CI/CD 자동화라고 부름. testing, packaging, deployment 등에 대한 자동화.

Jenkins가 가장 유명한 툴.

 

 

CI/CD Pipeline 구축 - Jenkins

기본 형태는 거의 동일함. 싱글 노드 클러스터여도 우리 프로젝트 성능상 문제가 없음.

기본적으로는 Jenkins와 우리의 github을 plugins를 활용해서 서로 integrate 하는 방식으로 활용.

 

Github과 Jenkins 상의 GUI를 활용해서 서로 configure 처리해주고 연결해주면 되고, 이건 추후에 필요할 때 이같은 방식으로 활용하면 될 듯. 어려울 것 없음.

 

정작 어려운 것은 jenkins 파일을 만드는 것. 그 과정에서 각종 프로그램과 linux 기반 커맨드, stage를 다뤄야 하기 때문. 이 디테일은 추후에 더 깊게 공부해보자.

 

 

Detailed codes

https://github.com/beomjookim/spark-capstone

 

GitHub - beomjookim/spark-capstone

Contribute to beomjookim/spark-capstone development by creating an account on GitHub.

github.com