์๋ , ํ๋ธ๋ฅด! ์ด ๊ธฐ์ฌ์์๋ ์๋ฅผ ๋ค์ด ๊ธฐ์ DWH ๋๋ DataLake์ ์ธํ๋ผ์์ ์ผ๊ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํ ํ๋ฅญํ ๋๊ตฌ ์ค ํ๋์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์ถ์ต๋๋ค. Apache Airflow(์ดํ Airflow)์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ด๋ Habrรฉ์ ๋ํ ๊ด์ฌ์ ๋ถ๋นํ๊ฒ ๋นผ์๊ธด ๊ฒ์ด๋ฉฐ, ์ฃผ์ ๋ถ๋ถ์์๋ ETL/ELT ํ๋ก์ธ์ค์ ๋ํ ์ค์ผ์ค๋ฌ๋ฅผ ์ ํํ ๋ ์ ์ด๋ Airflow๋ฅผ ์ดํด๋ณผ ๊ฐ์น๊ฐ ์์์ ํ์ ์ํค๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
์ด์ ์ ์ ๋ Tinkoff Bank์์ ๊ทผ๋ฌดํ ๋ DWH๋ฅผ ์ฃผ์ ๋ก ์ผ๋ จ์ ๊ธฐ์ฌ๋ฅผ ์ผ์ต๋๋ค. ์ด์ ์ ๋ Mail.Ru ๊ทธ๋ฃน ํ์ ์ผ์์ด ๋์ด ๊ฒ์ ๋ถ์ผ์ ๋ฐ์ดํฐ ๋ถ์์ ์ํ ํ๋ซํผ์ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. ์ค์ ๋ก ๋ด์ค์ ํฅ๋ฏธ๋ก์ด ์๋ฃจ์ ์ด ๋์ค๋ฉด ์ ํฌ ํ๊ณผ ์ ๋ ์ฌ๊ธฐ์ ๋ฐ์ดํฐ ๋ถ์์ ์ํ ํ๋ซํผ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
ํ๋กค๋ก๊ทธ
๊ทธ๋ผ ์์ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ณต๊ธฐ ํ๋ฆ์ด๋ ๋ฌด์์
๋๊น? ์ด๊ณณ์ ๋์๊ด(ํน์
์ด์ Airflow์ ์ฃผ์ ํญ๋ชฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ๋ณธ์ง๊ณผ ๋ชฉ์ ์ ์ดํดํจ์ผ๋ก์จ ํ๋ก์ธ์ค ์ํคํ ์ฒ๋ฅผ ์ต์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์๋ง๋ ์ฃผ์ ์ํฐํฐ๋ ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ(์ดํ DAG)์ผ ๊ฒ์ ๋๋ค.
DAG
DAG๋ ํน์ ์ผ์ ์ ๋ฐ๋ผ ์๊ฒฉํ๊ฒ ์ ์๋ ์์๋ก ์๋ฃํ๋ ค๋ ์์ ์ ์๋ฏธ ์๋ ์ฐ๊ฒฐ์ ๋๋ค. Airflow๋ DAG ๋ฐ ๊ธฐํ ํญ๋ชฉ ์์ ์ ์ํ ํธ๋ฆฌํ ์น ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
DAG๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ฐ๋ฐ์๋ DAG๋ฅผ ์ค๊ณํ ๋ DAG ๋ด ์์ ์ด ๊ตฌ์ถ๋ ์ฐ์ฐ์ ์ธํธ๋ฅผ ๋ฐฐ์นํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ ๋ค๋ฅธ ์ค์ํ ์ํฐํฐ์ธ Airflow Operator๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ฐ์
์ด์์๋ ์์
์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ธฐ๋ฐ์ด ๋๋ ์ํฐํฐ๋ก, ์์
์ธ์คํด์ค ์คํ ์ค์ ๋ฐ์ํ๋ ์ํฉ์ ์ค๋ช
ํฉ๋๋ค.
- BashOperator - bash ๋ช ๋ น์ ์คํํ๋ ์ฐ์ฐ์์ ๋๋ค.
- PythonOperator - Python ์ฝ๋๋ฅผ ํธ์ถํ๊ธฐ ์ํ ์ฐ์ฐ์์ ๋๋ค.
- EmailOperator โ ์ด๋ฉ์ผ ์ ์ก์ ์ํ ์ฐ์ฐ์์ ๋๋ค.
- HTTPOperator - http ์์ฒญ ์์ ์ ์ํ ์ฐ์ฐ์์ ๋๋ค.
- SqlOperator - SQL ์ฝ๋ ์คํ์ ์ํ ์ฐ์ฐ์์ ๋๋ค.
- ์ผ์๋ ์ด๋ฒคํธ(ํ์ํ ์๊ฐ ๋์ฐฉ, ํ์ํ ํ์ผ์ ๋ชจ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ผ์ธ, API์ ์๋ต ๋ฑ)๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ฐ์ฐ์์ ๋๋ค.
DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator์ ๊ฐ์ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์ฐ์ฐ์๊ฐ ์์ต๋๋ค.
๋ํ ์์ ์ ํน์ฑ์ ๋ฐ๋ผ ์ฐ์ฐ์๋ฅผ ๊ฐ๋ฐํ์ฌ ํ๋ก์ ํธ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด MongoDB์์ Hive๋ก ๋ฌธ์๋ฅผ ๋ด๋ณด๋ด๋ ์ฐ์ฐ์์ธ MongoDBToHiveViaHdfsTransfer์ ์์
์ ์ํ ์ฌ๋ฌ ์ฐ์ฐ์๋ฅผ ๋ง๋ค์์ต๋๋ค.
๋ค์์ผ๋ก ์ด๋ฌํ ๋ชจ๋ ์์ ์ธ์คํด์ค๋ฅผ ์คํํด์ผ ํ๋ฉฐ ์ด์ ์ค์ผ์ค๋ฌ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
์ค์ผ์ค๋ฌ
Airflow์ ์์
์ค์ผ์ค๋ฌ๋ ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
๊ฐ ํ์๋ ์ฌ๋กฏ ์์ ์ ํ์ด ์์ต๋๋ค. DAG๋ฅผ ๋ง๋ค ๋ ํ์ด ์ ๊ณต๋ฉ๋๋ค.
ALERT_MAILS = Variable.get("gv_mail_admin_dwh")
DAG_NAME = 'dma_load'
OWNER = 'Vasya Pupkin'
DEPENDS_ON_PAST = True
EMAIL_ON_FAILURE = True
EMAIL_ON_RETRY = True
RETRIES = int(Variable.get('gv_dag_retries'))
POOL = 'dma_pool'
PRIORITY_WEIGHT = 10
start_dt = datetime.today() - timedelta(1)
start_dt = datetime(start_dt.year, start_dt.month, start_dt.day)
default_args = {
'owner': OWNER,
'depends_on_past': DEPENDS_ON_PAST,
'start_date': start_dt,
'email': ALERT_MAILS,
'email_on_failure': EMAIL_ON_FAILURE,
'email_on_retry': EMAIL_ON_RETRY,
'retries': RETRIES,
'pool': POOL,
'priority_weight': PRIORITY_WEIGHT
}
dag = DAG(DAG_NAME, default_args=default_args)
dag.doc_md = __doc__
DAG ์์ค์์ ์ ์๋ ํ์ ์์
์์ค์์ ์ฌ์ ์๋ ์ ์์ต๋๋ค.
๋ณ๋์ ํ๋ก์ธ์ค์ธ Scheduler๊ฐ Airflow์ ๋ชจ๋ ์์
์์ฝ์ ๋ด๋นํฉ๋๋ค. ์ค์ ๋ก ์ค์ผ์ค๋ฌ๋ ์คํ ์์
์ ์ค์ ํ๋ ๋ชจ๋ ๋ฉ์ปค๋์ฆ์ ๋ค๋ฃน๋๋ค. ์์
์ ์คํ๋๊ธฐ ์ ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
- ์ด์ ์์ ์ DAG์์ ์๋ฃ๋์์ผ๋ฉฐ ์ ์์ ์ด ๋๊ธฐ์ด์ ์ถ๊ฐ๋ ์ ์์ต๋๋ค.
- ๋๊ธฐ์ด์ ์์ ์ ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๋ ฌ๋๋ฉฐ(์ฐ์ ์์๋ ์ ์ด ๊ฐ๋ฅ) ํ์ ์ฌ์ ์ฌ๋กฏ์ด ์์ผ๋ฉด ์์ ์ ์คํํ ์ ์์ต๋๋ค.
- ๋ฌด๋ฃ ์์ ์ ์ ๋ฌ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ์์ ์ด ํด๋น ์ ๋ฌ๋ฆฌ๋ก ์ ์ก๋ฉ๋๋ค. ๋ฌธ์ ์ ํ๋ก๊ทธ๋๋ฐํ ์์ ์ ํ๋ ๋๋ ๋ค๋ฅธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฉ๋๋ค.
์ถฉ๋ถํ ๊ฐ๋จํฉ๋๋ค.
์ค์ผ์ค๋ฌ๋ ๋ชจ๋ DAG ์งํฉ๊ณผ DAG ๋ด์ ๋ชจ๋ ์์ ์์ ์คํ๋ฉ๋๋ค.
์ค์ผ์ค๋ฌ๊ฐ DAG ์์ ์ ์์ํ๋ ค๋ฉด DAG๊ฐ ์ผ์ ์ ์ค์ ํด์ผ ํฉ๋๋ค.
dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='@hourly')
๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ฌ์ ์ค์ ์ธํธ๊ฐ ์์ต๋๋ค: @once
, @hourly
, @daily
, @weekly
, @monthly
, @yearly
.
cron ํํ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
dag = DAG(DAG_NAME, default_args=default_args, schedule_interval='*/10 * * * *')
์คํ ๋ ์ง
Airflow์ ์๋ ๋ฐฉ์์ ์ดํดํ๋ ค๋ฉด DAG์ ์คํ ๋ ์ง๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. Airflow์์ DAG์๋ ์คํ ๋ ์ง ์ฐจ์์ด ์์ต๋๋ค. ์ฆ, DAG์ ์์ ์ผ์ ์ ๋ฐ๋ผ ๊ฐ ์คํ ๋ ์ง์ ๋ํด ์์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์คํ ๋ ์ง์ ๋ํด ์์ ์ ๋ค์ ์คํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด DAG๋ ์ฌ๋ฌ ์คํ ๋ ์ง์ ๋์์ ์์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ฌ๊ธฐ์ ๋ช ํํ๊ฒ ํ์๋ฉ๋๋ค.
๋ถํํ๊ฒ๋(๋๋ ๋คํ์ค๋ฝ๊ฒ๋ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฆ) DAG์ ์์ ๊ตฌํ์ด ์์ ๋๋ฉด ์กฐ์ ์ฌํญ์ ๊ณ ๋ คํ์ฌ ์ด์ ์คํ ๋ ์ง์ ์คํ์ด ์งํ๋ฉ๋๋ค. ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๊ณผ๊ฑฐ ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ณ์ฐํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ์ข์ง๋ง ๊ฒฐ๊ณผ์ ์ฌํ์ฑ์ด ์์ค๋๊ธฐ ๋๋ฌธ์ ์ข์ง ์์ต๋๋ค(๋ฌผ๋ก Git์์ ํ์ํ ์์ค ์ฝ๋ ๋ฒ์ ์ ๋ฐํํ๊ณ ๋ฌด์์ ๊ณ์ฐํ๋๋ก ๊ท์ฐฎ๊ฒ ํ๋ ์ฌ๋์ ์๋ฌด๋ ์์ต๋๋ค). ํ์ํ ๋ฐฉ์์ผ๋ก ์ผํ์ฑ์ด ํ์ํฉ๋๋ค).
์์ ์์ฑ
DAG์ ๊ตฌํ์ Python์ ์ฝ๋์ด๋ฏ๋ก, ์๋ฅผ ๋ค์ด ์ค๋ฉ๋ ์์ค๋ก ์์ ํ ๋ ์ฝ๋ ์์ ์ค์ด๋ ๋งค์ฐ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์์ค๋ก XNUMX๊ฐ์ MySQL ์ค๋๊ฐ ์๊ณ ๊ฐ ์ค๋๋ก ์ด๋ํ์ฌ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ํ ๋ ๋ฆฝ์ ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ๋ณ๋ ฌ๋ก. DAG์ Python ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
connection_list = lv.get('connection_list')
export_profiles_sql = '''
SELECT
id,
user_id,
nickname,
gender,
{{params.shard_id}} as shard_id
FROM profiles
'''
for conn_id in connection_list:
export_profiles = SqlToHiveViaHdfsTransfer(
task_id='export_profiles_from_' + conn_id,
sql=export_profiles_sql,
hive_table='stg.profiles',
overwrite=False,
tmpdir='/data/tmp',
conn_id=conn_id,
params={'shard_id': conn_id[-1:], },
compress=None,
dag=dag
)
export_profiles.set_upstream(exec_truncate_stg)
export_profiles.set_downstream(load_profiles)
DAG๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด ๊ฒฝ์ฐ ๊ฐ๋จํ ์ค์ ์ ์กฐ์ ํ๊ณ DAG๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ํธ์ํ!
์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํํ์ ์์ค๋ก ์์ ํ๊ฑฐ๋ ํ ์ด๋ธ ๊ตฌ์กฐ, ํ ์ด๋ธ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ค๋ช ํ๊ณ DWH ์ธํ๋ผ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๋ฑ ๋ ๋ณต์กํ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. N๊ฐ์ ํ ์ด๋ธ์ ์คํ ๋ฆฌ์ง์ ๋ก๋ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋๋ ์๋ฅผ ๋ค์ด ๋ชฉ๋ก ํ์์ ๋งค๊ฐ๋ณ์ ์์ ์ ์ง์ํ์ง ์๋ API๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ชฉ๋ก์์ DAG์ N๊ฐ์ ์์ ์ ์์ฑํ๊ณ API์ ์์ฒญ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ก ์ ํํ๊ณ ์คํฌ๋ฉํ ์ ์์ต๋๋ค. API์์ ํ์ํ ๋ฐ์ดํฐ. ์ ์ฐํ!
์ ์ฅ์
Airflow์๋ ์์ ์ํ, DAG, ์ฐ๊ฒฐ ์ค์ , ์ ์ญ ๋ณ์ ๋ฑ์ ์ ์ฅํ๋ ์์ฒด ๋ฐฑ์๋ ์ ์ฅ์์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL ๋๋ Postgres์ผ ์ ์๊ณ Postgres๊ฐ ์์)๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํ ์ ์์ต๋๋ค. Airflow์ ์ ์ฅ์๋ ๋งค์ฐ ๊ฐ๋จํ๊ณ (ํ ์ด๋ธ ์ฝ 20๊ฐ) ๊ทธ ์์ ์์ฒด ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ๋ ค๋ ๊ฒฝ์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ฟผ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ์ ์ดํดํ๊ธฐ ์ ์ ์ค๋ซ๋์ ์ฐ๊ตฌํด์ผ ํ๋ Informatica ๋ฆฌํฌ์งํ ๋ฆฌ์ ์๋ 100500๊ฐ์ ํ ์ด๋ธ์ ๊ธฐ์ตํฉ๋๋ค.
๋ชจ๋ํฐ๋ง
๋ฆฌํฌ์งํ ๋ฆฌ์ ๋จ์์ฑ์ ๊ณ ๋ คํ๋ฉด ํธ๋ฆฌํ ์์ ๋ชจ๋ํฐ๋ง ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ Zeppelin์์ ๋ฉ๋ชจ์ฅ์ ์ฌ์ฉํ์ฌ ์์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
์ด๋ Airflow ์์ฒด์ ์น ์ธํฐํ์ด์ค์ผ ์๋ ์์ต๋๋ค.
Airflow ์ฝ๋๋ ์คํ ์์ค์ด๋ฏ๋ก Telegram์ ์๋ฆผ์ ์ถ๊ฐํ์ต๋๋ค. ์์ ์ ๊ฐ ์คํ ์ธ์คํด์ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด ๊ฐ๋ฐ ๋ฐ ์ง์ ํ์ด ๊ตฌ์ฑ๋ Telegram์ ๊ทธ๋ฃน์ ์คํธ์ ๋ณด๋ ๋๋ค.
Telegram์ ํตํด(ํ์ํ ๊ฒฝ์ฐ) ์ฆ๊ฐ์ ์ธ ์๋ต์ ๋ฐ๊ณ , Zeppelin์ ํตํด Airflow์ ์์ ์ ๋ํ ์ ๋ฐ์ ์ธ ๊ทธ๋ฆผ์ ๋ฐ์ต๋๋ค.
์ ์ฒด๋ก
Airflow๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ ์์ค์ด๋ฏ๋ก ๊ธฐ์ ์ ๊ธฐ๋ํด์๋ ์ ๋ฉ๋๋ค. ํจ๊ณผ์ ์ธ ์๋ฃจ์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํฌ์ํ ์ค๋น๋ฅผ ํ์ญ์์ค. ๋ชฉํ๋ ๋ฌ์ฑ ๊ฐ๋ฅํฉ๋๋ค. ์ ๋ฅผ ๋ฏฟ์ผ์ธ์. ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ ์๋, ์ ์ฐ์ฑ, ์๋ก์ด ํ๋ก์ธ์ค ์ถ๊ฐ ์ฉ์ด์ฑ ๋ฑ์ด ๋ง์์ ๋์ค ๊ฒ์ ๋๋ค. ๋ฌผ๋ก ํ๋ก์ ํธ ๊ตฌ์ฑ, Airflow ์์ฒด์ ์์ ์ฑ์ ๋ง์ ๊ด์ฌ์ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ๊ธฐ์ ์ ์ผ์ด๋์ง ์์ต๋๋ค.
์ด์ Airflow๊ฐ ๋งค์ผ ์๋ํฉ๋๋ค. ์ฝ 6,5๊ฐ ์์ . ๊ทธ๋ค์ ์ฑ๊ฒฉ์ด ์๋นํ ๋ค๋ฆ ๋๋ค. ๋ค์ํ๊ณ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์์ค์์ ๊ธฐ๋ณธ DWH๋ก ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ์์ ์ด ์๊ณ , ๊ธฐ๋ณธ DWH ๋ด๋ถ์ ๋งค์ฅ ์ ๋ฉด์ ๊ณ์ฐํ๋ ์์ ์ด ์์ผ๋ฉฐ, ๋น ๋ฅธ DWH์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์์ ์ด ์๊ณ , ๋งค์ฐ ๋ค์ํ ์์ ์ด ์์ต๋๋ค. ๋งค์ผ ๋ค ์น์ด ๋จน์ต๋๋ค. ์ซ์๋ก ๋งํ๋ฉด ์ด๋ ๋ค. 2,3 ์ฒ๋ช DWH(Hadoop) ๋ด์์ ๋ค์ํ ๋ณต์ก์ฑ์ ์ง๋ ELT ์์ . 2,5๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ํต์ ๋ฐ๋ฅด๋ฉด ์ฌ๊ธฐ๋ ํ์ ๋๋ค. 4๋ช ์ ETL ๊ฐ๋ฐ์, ์ด๋ DWH์์์ ETL ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ DWH ๋ด๋ถ์ ELT ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๊ด๋ฆฌ์ ํ ๋ช , ์๋น์ค ์ธํ๋ผ๋ฅผ ๋ด๋นํฉ๋๋ค.
์์ผ๋ก์ ๊ณํ
ํ๋ก์ธ์ค ์๋ ํ์ฐ์ ์ผ๋ก ์ฆ๊ฐํ๊ณ ์์ผ๋ฉฐ Airflow ์ธํ๋ผ ์ธก๋ฉด์์ ์ฐ๋ฆฌ๊ฐ ํ ์ฃผ์ ์์ ์ ํ์ฅ์ ๋๋ค. ์ฐ๋ฆฌ๋ Airflow ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๊ณ , Celery ์์ ์๋ฅผ ์ํ ํ ์์ ๋ค๋ฆฌ๋ฅผ ํ ๋นํ๊ณ , ์์ ์ผ์ ํ๋ก์ธ์ค์ ์ ์ฅ์๋ฅผ ๊ฐ์ถ ์์ฒด ๋ณต์ ํค๋๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
์ปคํผ์ฝ
๋ฌผ๋ก ์ด๊ฒ์ด Airflow์ ๋ํด ๋งํ๊ณ ์ถ์ ์ ๋ถ๋ ์๋์ง๋ง ์ฃผ์ ์ฌํญ์ ๊ฐ์กฐํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ๋จน์ผ๋ฉด ์์์ด ๋ฐ๋ผ์ค๋๋ฐ ๊ผญ ๋์ ๋ณด์๋ฉด ์ข์ํ์ค ๊ฒ ๊ฐ์์ :)
์ถ์ฒ : habr.com