데이터 파이프라인 회고 (SQL + Python)

데이터 파이프라인 회고: SQL과 Python을 활용한 자동화 개선 방안 소개.
ImRieul's avatar
Jun 08, 2024
데이터 파이프라인 회고 (SQL + Python)
안녕하세요. 이번에는 퇴사 기념(?)으로 마지막 프로젝트에서 작업한 내용을 피드백해보려고 합니다. 잘못된 원천 데이터를 제공받아 몇 번 재작업한 일이 있었습니다. (지난 글에서 몇 억 건 데이터 포함입니다 ㅎㅎ..)
그럴 때마다 재작업을 하는데 아무리 기록하고 조심해도 데이터에 실수가 있었습니다. "데이터에는 테스트 코드가 없나?" 생각하다가 찾아보니 데이터 파이프라인을 위한 Python 라이브러리 Luigi가 있었습니다. 또한 데이터 엔지니어링에서 자주 보이는 ETL이라는 단어도 알게 되었습니다.
 
  1. 기존 데이터 파이프라인 구축 방식
  1. 기존 방식의 문제점
  1. Luigi의 소개와 장점
  1. 향후 데이터 파이프라인 개선 방안
 
위 단계를 따라 피드백을 해보려 합니다. 인수인계를 준비하면서 제가 작업했던 흐름을 보니 실수를 체크하기 어려운 작업이었습니다.
 
기존 데이터 파이프라인 흐름
기존 데이터 파이프라인 흐름
개선하고 싶은 데이터 파이프라인 흐름
개선하고 싶은 데이터 파이프라인 흐름
 
 

결론

1. 기존 데이터 파이프라인 구축 방식: Python과 SQL을 활용하여 공공데이터 포털에서 데이터를 수집하고, 데이터베이스에 저장 후 수동으로 변환 작업을 수행하며, 최종 데이터를 CSV로 관리.
2. 기존 방식의 문제점: 복잡한 SQL 코드, 수동 CTL 과정, CSV 파일 관리의 번거로움, 그리고 자동화 부족으로 인해 효율성과 유지보수에 어려움이 존재.
3. Luigi의 소개와 장점: Luigi는 데이터 파이프라인을 자동화하고 관리할 수 있는 Python 기반 워크플로우 관리 시스템으로, 효율성, 유지보수 용이성, 확장성, 가시성을 제공.
4. 향후 데이터 파이프라인 개선 방안: Luigi를 도입하여 SQL 코드 모듈화, 데이터베이스 중심 관리, 전체 파이프라인 자동화, 그리고 지속적인 모니터링과 개선을 통해 효율성과 신뢰성을 높임.
 
No
항목
기존 방식
향후 개선 방안
1
데이터 수집
Python을 사용하여 공공데이터 포털 API로 데이터 수집
유지
2
데이터 저장
원천 데이터를 데이터베이스에 저장
유지
3
데이터 캐싱
데이터가 많을 경우 Materialized View로 캐싱
유지
4
데이터 변환 및 집계
SQL을 통해 수동으로 변환 및 집계 작업 수행
Luigi를 통해 SQL 코드 모듈화 및 자동화
5
CTL 과정
수동으로 수행되는 데이터 변환 과정
Luigi를 통해 전체 CTL 과정을 자동화
6
데이터 저장 형식
변환된 데이터를 CSV 파일로 저장
데이터베이스에 직접 저장
7
CSV 파일 관리
CSV 파일을 다운로드하고 업로드하는 과정 수동으로 수행
CSV 파일 다운로드 및 업로드 과정을 제거하고 데이터베이스로 직접 업로드
8
자동화 수준
수작업이 많아 자동화 부족
Luigi를 통해 전체 파이프라인 자동화
9
유지보수 용이성
복잡한 SQL 코드로 인해 유지보수 어려움
모듈화된 SQL 코드와 자동화된 파이프라인으로 유지보수 용이
10
효율성
수동 작업과 복잡한 SQL로 인해 비효율적
자동화와 모듈화를 통해 효율성 향상
11
신뢰성
수동 작업으로 인한 오류 발생 가능성 높음
자동화된 프로세스로 신뢰성 향상
12
모니터링 및 개선
별도의 모니터링 및 개선 체계 부족
Luigi의 대시보드를 통해 실시간 모니터링 및 지속적인 개선 가능
 

 

1. 기존 데이터 파이프라인 구축 방식

1.1 Python을 통한 데이터 수집

기존 데이터 파이프라인의 첫 번째 단계는 Python을 사용하여 공공데이터 포털의 API로부터 데이터를 수집하는 것이었습니다.
  • 데이터 수집:
    • Python 스크립트를 통해 공공데이터 포털의 API에 요청을 보내고, 필요한 데이터를 받아왔습니다.
    • 수집된 원천 데이터는 즉시 로컬 데이터베이스에 저장되어 후속 처리에 대비했습니다.
    • 큰 데이터는 csv로 제공받았습니다.
 

1.2 원천 데이터의 데이터베이스 저장

수집된 원천 데이터는 중간 저장소로서 데이터베이스에 저장되었습니다.
  • 데이터베이스 저장:
    • API로부터 수집된 데이터를 구조화하여 로컬 데이터베이스에 저장했습니다.
    • 이를 통해 원천 데이터를 안전하게 보관하고, 후속 처리 및 분석 작업을 효율적으로 수행할 수 있었습니다.
 

1.3 원천 데이터의 Materialized View로 캐싱

원천 데이터가 수천만 건 이상인 경우, 데이터를 바로 집계하면 시간이 많이 소요되었기 때문에, Materialized View를 사용하여 데이터를 캐싱했습니다.
  • Materialized View 캐싱:
    • 대용량 데이터를 효율적으로 처리하기 위해, 데이터베이스에서 Materialized View를 생성하여 데이터를 캐싱했습니다.
    • Materialized View는 주기적으로 갱신되며, 이를 통해 집계 데이터를 빠르게 조회할 수 있었습니다.
    • 이 과정으로 데이터 집계에 소요되는 시간을 크게 줄일 수 있었습니다.
 

1.4 수동 SQL 변환 과정

데이터 변환과 집계 과정은 SQL을 통해 수동으로 이루어졌습니다.
  • 데이터 변환 및 집계:
    • 데이터베이스에 저장된 원천 데이터에 대해 필요한 변환 작업과 집계 작업을 SQL 쿼리를 통해 수행했습니다.
    • 이 과정은 수동으로 이루어졌으며, 복잡한 쿼리를 작성하여 데이터를 가공했습니다.
 

1.5 CSV 파일 관리

데이터 변환의 마지막 단계에서는 변환된 데이터를 CSV 파일로 저장하고, 이를 최종 개발 데이터베이스 테이블로 업로드하는 과정이 포함되었습니다.
  • CSV 파일 다운로드 및 업로드:
    • 변환된 데이터를 Python 스크립트를 사용하여 CSV 파일로 저장했습니다.
    • 저장된 CSV 파일은 로컬 파일 시스템에 다운로드되었고, 이를 최종 개발 데이터베이스 테이블로 업로드하는 로직도 Python 스크립트에 포함되었습니다.
    • Python 로직은 쿼리 결과를 CSV로 내리고, 해당 CSV 파일을 다시 데이터베이스로 import하는 과정을 자동으로 처리했습니다.
이와 같은 방식으로 구축된 기존 데이터 파이프라인은 데이터 수집부터 최종 데이터베이스 업로드까지 일련의 수동 작업과 자동화된 작업이 혼합된 형태로 운영되었습니다.
 

 

2. 기존 방식의 문제점

2.1 SQL 코드 복잡성

기존 파이프라인에서 데이터를 변환하고 집계하는 과정은 주로 SQL을 통해 수동으로 이루어졌습니다.
  • 복잡한 SQL 코드:
    • 데이터 변환 및 집계를 위해 작성된 SQL 쿼리가 매우 복잡하고 길어졌습니다.
    • SQL 쿼리가 100줄이 넘는 경우가 많아, 이를 작성하고 유지보수하는 데 많은 시간과 노력이 필요했습니다.
    • 복잡한 쿼리는 가독성이 떨어져 다른 개발자가 이해하거나 수정하기 어려웠습니다.
 

2.2 수동 CTL 과정

데이터 파이프라인의 CTL 과정 중 특히 데이터 변환(Transformation) 단계가 수동으로 이루어져 비효율적이었습니다.
  • 수동 데이터 변환:
    • 데이터를 변환하는 과정이 자동화되지 않고, 사람이 직접 SQL 쿼리를 실행하여 데이터를 가공해야 했습니다.
    • 각 단계마다 수작업이 필요해, 오류 발생 가능성이 높고 작업 효율이 떨어졌습니다.
    • 수동 작업으로 인해 데이터 처리 시간이 길어지고, 실시간 데이터 처리에 한계가 있었습니다.
 

2.3 CSV 파일 관리의 번거로움

CSV 파일을 사용한 데이터 저장 및 관리 과정에서 여러 가지 비효율성이 존재했습니다.
  • CSV 파일 다운로드 및 업로드:
    • 변환된 데이터를 CSV 파일로 저장하고, 이를 로컬 파일 시스템에 다운로드한 후, 다시 데이터베이스로 업로드하는 과정이 수동으로 이루어졌습니다.
    • 이 과정에서 파일 관리의 번거로움이 있었으며, 대용량 데이터를 다룰 때 성능 저하가 발생했습니다.
    • CSV 파일 관리가 추가적인 작업 부담을 증가시켰습니다.
 

2.4 자동화 부족

데이터 파이프라인의 많은 부분이 수동으로 이루어져, 전체적인 자동화 수준이 낮았습니다.
  • 자동화 부족:
    • 데이터 수집부터 변환, 업로드까지의 과정 중 많은 부분이 자동화되지 않았습니다.
    • 자동화된 파이프라인이 부재하여, 작업의 일관성과 신뢰성이 떨어졌습니다.
    • 수동으로 처리되는 작업이 많아질수록, 데이터 처리의 지연이 발생하고 인적 오류의 가능성이 증가했습니다.
이와 같은 문제점들로 인해 기존 데이터 파이프라인은 유지보수와 효율성 측면에서 많은 한계가 있었습니다.
 

 

3. Luigi 소개 및 장점

3.1 Luigi란 무엇인가?

Luigi는 Python으로 작성된 워크플로우 관리 시스템으로, 복잡한 데이터 파이프라인을 쉽게 구축하고 관리할 수 있도록 도와줍니다.
  • 오픈 소스: Luigi는 오픈 소스 프로젝트로, 넷플릭스에서 개발하고 유지보수되고 있습니다.
  • 파이프라인 구성: 데이터 파이프라인의 각 단계를 Task로 정의하고, 이러한 Task 간의 의존성을 명확하게 관리할 수 있습니다.
  • 확장성: 간단한 워크플로우부터 복잡한 대규모 데이터 파이프라인까지 확장할 수 있습니다.
 

3.2 Luigi의 주요 기능

Luigi는 데이터 파이프라인을 자동화하고 관리하는 데 필요한 다양한 기능을 제공합니다.
  • Task 정의: 파이프라인의 각 단계를 Task로 정의할 수 있습니다. 각 Task는 Python 코드로 작성되며, 입력과 출력을 명확하게 정의합니다.
  • 의존성 관리: Task 간의 의존성을 정의하여, 각 Task가 실행되는 순서를 자동으로 관리합니다.
  • 재시도 및 오류 처리: Task가 실패할 경우 재시도 로직을 정의할 수 있으며, 오류 발생 시 알림을 받을 수 있습니다.
  • 시각화: Luigi는 파이프라인의 실행 상태와 의존성을 시각적으로 보여주는 대시보드를 제공합니다.
 

3.3 Luigi의 장점

Luigi를 사용하면 다음과 같은 여러 가지 장점을 누릴 수 있습니다.
  • 자동화: 수작업을 최소화하고, 파이프라인의 각 단계를 자동화하여 효율성을 높입니다.
  • 유지보수 용이: 코드의 모듈화와 Task 간 의존성 관리를 통해, 파이프라인을 쉽게 유지보수할 수 있습니다.
  • 확장성: 작은 규모의 프로젝트에서 대규모 데이터 파이프라인까지 유연하게 확장할 수 있습니다.
  • 가시성: 실행 상태와 의존성을 시각적으로 확인할 수 있어, 파이프라인의 상태를 쉽게 모니터링하고 관리할 수 있습니다.
 

 

4. 향후 데이터 파이프라인 개선 방안

4.1 SQL 코드 단순화 및 모듈화

복잡한 SQL 코드를 단순화하고 모듈화하여 유지보수를 용이하게 합니다.
  • SQL 코드 모듈화:
    • 복잡한 SQL 쿼리를 작은 단위로 나누어 모듈화합니다.
    • 각 모듈은 특정 변환 작업을 수행하도록 설계하여, 코드의 가독성과 재사용성을 높입니다.
    • 모듈화된 SQL 코드를 Python 코드 내에서 호출하여 사용합니다.
  • 자동화된 SQL 실행:
    • 수동으로 실행되던 SQL 쿼리를 Luigi Task로 자동화합니다.
    • 데이터베이스에 저장된 원천 데이터에 대해 필요한 변환과 집계 작업을 자동으로 수행합니다.
 

4.2 데이터베이스 중심의 데이터 저장 및 관리

CSV 파일을 사용한 데이터 저장 방식을 개선하여, 데이터베이스 중심으로 데이터를 관리합니다.
  • 데이터베이스 활용:
    • 데이터 변환 및 집계 결과를 CSV 파일 대신 데이터베이스에 직접 저장합니다.
    • 이를 통해 파일 관리의 번거로움을 줄이고, 대용량 데이터 처리 성능을 개선합니다.
  • 직접 데이터베이스 업로드:
    • 변환된 데이터를 CSV 파일로 다운로드하고 업로드하는 과정을 제거하고, 직접 데이터베이스로 업로드합니다.
    • Python 스크립트를 사용하여 쿼리 결과를 바로 데이터베이스 테이블로 저장합니다.
 

4.3 전체 파이프라인 자동화

파이프라인의 모든 단계를 자동화하여 일관성과 신뢰성을 높입니다.
  • 전체 파이프라인 자동화:
    • 데이터 수집부터 변환, 업로드까지의 모든 과정을 Luigi Task로 정의하고, 전체 파이프라인을 자동화합니다.
    • 자동화된 파이프라인은 일정한 시간 간격으로 또는 트리거 이벤트에 의해 실행됩니다.
    • 이를 통해 실시간 데이터 처리와 일관된 데이터 갱신을 보장합니다.
 

4.4 효율성과 신뢰성 향상

자동화된 파이프라인을 통해 전체적인 데이터 처리 효율성과 신뢰성을 향상시킵니다.
  • 효율성 향상:
    • 자동화된 작업으로 수작업의 부담을 줄이고, 데이터 처리 시간을 단축합니다.
    • 모듈화된 코드와 데이터베이스 중심의 저장 방식을 통해 데이터 관리의 효율성을 높입니다.
  • 신뢰성 향상:
    • 자동화된 파이프라인은 일관된 데이터 처리와 오류 최소화를 보장합니다.
    • 각 단계의 실행 로그와 오류 보고를 통해 신뢰성을 확보합니다.
 

4.5 지속적인 모니터링과 개선

Luigi의 대시보드를 활용하여 파이프라인을 지속적으로 모니터링하고, 필요에 따라 개선합니다.
  • 실시간 모니터링:
    • Luigi의 대시보드를 통해 파이프라인의 실행 상태와 의존성을 실시간으로 확인합니다.
    • 문제 발생 시 즉각 대응할 수 있도록 알림 시스템을 활용합니다.
  • 지속적인 개선:
    • 파이프라인의 성능과 효율성을 주기적으로 평가하고, 개선할 부분을 찾아 최적화합니다.
    • 새로운 데이터 요구사항에 따라 파이프라인을 유연하게 수정하고 확장합니다.
 
Share article

Rieul's Index