Computer Engineering/DataPlatform

ETL과 ELT의 차이, ELT가 더 가치있는 이유 그리고 EtLT

jordan.bae 2023. 6. 24. 19:05

ETL과 ELT의 차이

ETL과 ELT의 차이는 데이터를 소스에서 타켓으로Ingestion하는 과정에서 Transafrom을 언제 하는지에 대한 차이입니다. ETL은 Extract-Transfrom-Load 순으로 진행됩니다. 반면에 ELT는 Extract-Load-Transform순으로 진행됩니다. 많은 글에서 ELT가 데이터를 Transform하지 않은 상태로 DataLake 또는 Data Warehouse에 데이터를 적재하지 않기 때문에 원시 데이터로 부터 다양한 가공이 가능해서 더 데이터를 잘 활용할 수 있다고 설명하는 부분에 집중합니다. 하지만, ELT의 패러다임은 단순히 Transformation 순서만 바뀐 것이 아니라 Ingestion layer와 Transformation layer를 나뉘게 만들었습니다. 그리고 이 패러다임에는 Datalake가 함께 하고 있고, 모던 데이터 플랫폼 구조에 아주 큰 영향을 줬습니다.

이 글에서는 간단한 EtLT 예제 코드와 함께 이런 트렌드 변화가 데이터플랫폼에 어떤 영향을 주었는지에 대해 설명해보려고 합니다. 또, EtLT Extract - small transformation - Load -  Tranform도 함께 간단히 설명합니다.
 

ELT 사실은 EtLT예제 코드

ELT라고 하지만 대부분의 경우 small T, 즉 약간의 transformation은 필요합니다. 예를 들면,PII 데이터 제거라던지 Raw 데이터 column이름을 재정의한다던지 여기서 집중하는 것은 최대한 Raw 데이터 그대로를 적재하는 것입니다.
예제 코드로는 FinanceDataReader 라이브러리로 한국의 상장된 주식 리스트를 가져와서 PostgreSQL에 적재하는 예제입니다. EtL후 Transformation하는 DAG은 포함되어 있지 않습니다.
FinanceDataReader 라이브러리를 활용하면 아주 간단하게 아래와 같이 한국의 상장된 주식 리스트를 가져올 수 있습니다.

jupyter 코드 캡쳐

이제 해당 코드를 Airflow DAG으로 메일 한 번 테이블을 Truncate 형식으로 Load하는 코드를 아래와 같이 작성합니다.
위에 이야기했던 것처럼 small transformation이 들어가서 ETL작업처럼 보일 수 있지만 저는 원본 데이터에서 column이름만 rename 했을 뿐 제가 필요한 데이터만 추출하지도 않았고, 데이터를 필요에 따라 가공하지도 않았습니다. ETL 작업이었다면 주식 데이터는 다른 곳에서 가져오기 때문에 처음 부터 회사정보만 가져오고 마지막 주식 정보를 제외해서 테이블에 저장했을 수 있습니다.

import datetime

import FinanceDataReader as fdr
import pandas as pd
from airflow import DAG
from airflow.operators.python import PythonOperator

from db.postgres import get_db_engine
from utils.texts import camel_to_snake


def etl():
    def extract() -> pd.DataFrame:
        stocks = fdr.StockListing("KRX")
        return stocks
	
    # small transaformation
    def transform(df: pd.DataFrame) -> pd.DataFrame:
        # transform column_name
        df = df.rename(columns=lambda x: camel_to_snake(x))
        return df

    def load(df: pd.DataFrame) -> None:
        conn = get_db_engine("finance")
        df.to_sql(
            name="stock_list",
            con=conn,
            if_exists="replace",
            method="multi",
            index=False,
        )

    df = extract()
    transformed_df = transform(df)
    load(transformed_df)


with DAG(
    dag_id="update_stock_list",
    start_date=datetime.datetime(2023, 6, 23),
    schedule_interval="0 0 * * *",
    catchup=False,
    tags=["fdr"],
) as dag:
    etl_task = PythonOperator(
        task_id="etl",
        python_callable=etl,
    )

    etl_task

 

ELT이 탄생한 배경

ELT가 탄생한 배경은 데이터를 더 잘 활용하고 유연한 구조를 만들기 위합입니다.

출처: AWS

수집(Ingestion)과 가공(Transformation)의 단계를 나눠서 하나의 목적으로만 가공하는 것이 아니라 여러 목적으로 가공할 수 있게 됩니다. 또, 예전과 달리 데이터 보관비용이 낮은 Data Lake (ex. Hadoop, AWS S3, GCP Cloud Stoage, Databricks lakehouse)가 생겨나면서 당장 필요한 데이터가 아니더라도 데이터 원본 자체를 모두 저장하게 됩니다. Datalake를 사용하면 다만 서로 다른 schema의 데이터 그리고 조금 더 다양한 포맷의 데이터를 저장할 수 있다는 점의 추가적 장점이 있습니다. 하지만, Datalake를 사용하지 않더라도 raw 데이터를 그대로 저장한다는 개념을 살려서 Datawareshouse에 저장할 수도 있습니다. 

정리하면 ELT의 장점은 크게 유연성layer 분리 라고 생각합니다.

ELT의 가치

위의 ELT 코드의 가치를 어떤 부분이라고 생각하시나요?
ELT로 가져갈 수 있는 장점은 분명합니다.
1. 변화에 유연합니다.
예를 들어서, 제가 위에 데이터에서 일부 컬럼은 필요가 없어서 Transform단계에서 exclude했다고 가정합니다. 그런데 나중에 비즈니스 상황에 따라 다시 필요하게 된다면 데이터 수집 파트에서 변경이 불가피합니다. 즉, Transformation 은 비즈니스 로직에 가깝습니다. 원하는 형태로 데이터를 변경하고 필요한 데이터만 가져온다는 것은 requirements의 변화에 따라 변경이 필요하다는 것입니다.
2. 데이터를 다양한 부분에 활용합니다.
Raw데이터 자체를 ingestion 한다면 필요에 따라서 조금 더 다양하게 활용이 가능합니다. Raw데이터 자체를 가지고 있다면 처음에는 A라는 비즈니스 요구사항에 따라서 x,y,z라는 데이터만 쓰이고 있다고 해도, 새로운 product의 B라는 비즈니스 요구사항(q,w,e 데이터 필요) 에도 활용할 수 있습니다. 즉, 원천 데이터를 보관하고 있기 때문에 다양한 필요에 따라서 가공할 수 있습니다. 
물론, Layer를 분리해서 관리하는 것은 하나의 목적으로만 사용할 때 더 많은 리소스가 필요합니다. 하지만, 하나의 데이터라도 다양한 제품에 쓰일 수 있고, 다양한 팀의 다양한 목적으로 활용될 수 있기 때문에 ELT는 충분한 가치를 만들 수 있다고 생각합니다.
 

ELT 가 가져온 변화

ETL과 ELT를 그냥 봤을 때는 L과 T의 순서만 바뀌었다고 생각할 수 있습니다.
하지만, 이 부분은 큰 변화입니다.  그 이유는 ETL은 하나의 작업이지만 ELT는 EL과 Transformation 작업이 분리됩니다. 즉, Data Ingestion과 Data Transformation의 분리입니다. 생각해 보면 Extract, Load는 하나의 작업으로 이뤄집니다. A라는 소스에 있는 데이터를 추출해서 B로 적재하기 때문에 함께 진행되게 됩니다.
즉, Transformation이 아예 새로운 Layer로 분리되게 됩니다. 이런 흐름은 Transformation 과 관련된 다양한 서비스 또는 추가레이어( dbt  , dataform AIrflow transformation DAG)가 생겨났습니다. Data Platform에도 Transformation component를 따로 분리해서 구축합니다.

dbt 홈페이지에 dbt에 대한 설명

 

마무리

ELT는 아주 예전부터 시작된 패러다임이고, ELT와 ETL을 비교하는 글도 많지만 갑자기 코드를 작성하다가 ELT가 이래서 필요했지 라는 생각이 들어서 글을 한 번 적어봤습니다. 
 

다른 읽어 볼만한 글

- IBM ELT

- 데이터 플랫폼이란?

 

Data Platform이란? /데이터 플랫폼 이란

데이터 엔지니어의 가장 중요한 역할은 하나는 데이터플랫폼을 구축하는 일이라고 생각합니다. 데이터 플랫폼은 기존의 데이터웨어하우스 중심의 시스템에서 벗어나 다양한 데이터를 다루고,

blog.doosikbae.com

- Coalesce 2022 Analytics Engineering Conference 후기

 

Coalesce 2022 New Orleans 후기 - Analytics Engineering 그리고 Modern DataStack

영문 글 링크(Link of English version post) Introduction 안녕하세요. 10월 14일부터 10월 21일까지 뉴올리언스에서 열린 Coalesce 2022 - The Analytics Engineering Conference 행사를 다녀왔습니다. Coalesce 2022는 dbt Labs에

blog.doosikbae.com

 

반응형