
์๋ ํ์ธ์, Habr! ์ด ๊ธ์์๋ ๊ธฐ์ DWH๋ DataLake ์ธํ๋ผ์์ ์ผ๊ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ ์ค ํ๋๋ฅผ ์๊ฐํ๊ณ ์ ํฉ๋๋ค. Apache Airflow(์ดํ Airflow)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. Habr์์๋ ์ด ๋๊ตฌ์ ๋ํ ๊ด์ฌ์ด ๋ถ์กฑํ์ง๋ง, ๋ณธ ๊ธ์์๋ ETL/ELT ํ๋ก์ธ์ค ์ค์ผ์ค๋ฌ๋ฅผ ์ ํํ ๋ ์ ์ด๋ Airflow๋ ๊ณ ๋ คํด ๋ณผ ๋งํ ๊ฐ์น๊ฐ ์๋ค๋ ์ ์ ๊ฐ์กฐํ๊ณ ์ ํฉ๋๋ค.
์ด์ ์ Tinkoff Bank์์ ๊ทผ๋ฌดํ ๋ DWH๋ฅผ ์ฃผ์ ๋ก ์ฌ๋ฌ ํธ์ ๊ธฐ์ฌ๋ฅผ ์ผ์ต๋๋ค. ์ง๊ธ์ Mail.Ru ๊ทธ๋ฃน ํ์ ํฉ๋ฅํ์ฌ ๊ฒ์ ๋ถ์ผ์ ๋ฐ์ดํฐ ๋ถ์ ํ๋ซํผ์ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. ์๋ก์ด ์์๊ณผ ํฅ๋ฏธ๋ก์ด ์๋ฃจ์ ์ด ๋์ค๋ ๋๋ก, ์ ์ ์ ํฌ ํ์ ์ฌ๊ธฐ์์ ๋ฐ์ดํฐ ๋ถ์ ํ๋ซํผ์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋กค๋ก๊ทธ
์, ์์ํด ๋ณผ๊น์. Airflow๋ ๋ฌด์์ผ๊น์? ๋ผ์ด๋ธ๋ฌ๋ฆฌ(๋๋ ) ์ํฌํ๋ก ๊ฐ๋ฐ, ๊ณํ ๋ฐ ๋ชจ๋ํฐ๋ง์ ์ํ ๊ธฐ๋ฅ์ ๋๋ค. Airflow์ ์ฃผ์ ๊ธฐ๋ฅ: Python ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ค๋ช (๊ฐ๋ฐ)ํฉ๋๋ค. ์ด๋ ํ๋ก์ ํธ ๋ฐ ๊ฐ๋ฐ ๊ด๋ฆฌ์ ๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ค์ ๋ก (์๋ฅผ ๋ค์ด) ETL ํ๋ก์ ํธ๋ Python ํ๋ก์ ํธ์ผ ๋ฟ์ด๋ฉฐ, ์ธํ๋ผ ๊ธฐ๋ฅ, ํ ๊ท๋ชจ ๋ฐ ๊ธฐํ ์๊ตฌ ์ฌํญ์ ๊ณ ๋ คํ์ฌ ์ํ๋ ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋๊ตฌ ์ธก๋ฉด์์๋ ๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํฉ๋๋ค. ์๋ฅผ ๋ค์ด PyCharm + Git์ ์ฌ์ฉํด ๋ณด์ธ์. ํ๋ฅญํ๊ณ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค!
์ด์ Airflow์ ์ฃผ์ ์ํฐํฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ๋ณธ์ง๊ณผ ๋ชฉ์ ์ ์ดํดํ๋ฉด ํ๋ก์ธ์ค ์ํคํ ์ฒ๋ฅผ ์ต์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์์ ๊ฒ์ ๋๋ค. ์๋ง๋ ์ฃผ์ ์ํฐํฐ๋ ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ(Directed Acyclic Graph, ์ดํ DAG)์ผ ๊ฒ์ ๋๋ค.
DAG
DAG๋ ํน์ ์ผ์ ์ ๋ฐ๋ผ ์๊ฒฉํ๊ฒ ์ ์๋ ์์๋๋ก ์ํํ๋ ค๋ ์์ ์ ์๋ฏธ์ ์ผ๋ก ํตํฉํ ๊ฒ์ ๋๋ค. Airflow๋ DAG ๋ฐ ๊ธฐํ ์ํฐํฐ ์์ ์ ์ํ ํธ๋ฆฌํ ์น ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.

DAG๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.

๊ฐ๋ฐ์๋ DAG๋ฅผ ์ค๊ณํ ๋ DAG ๋ด๋ถ ์์ ์ด ๊ตฌ์ถ๋ ์ฐ์ฐ์ ์งํฉ์ ์ ์ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ ๋ค๋ฅธ ์ค์ํ ์ํฐํฐ์ธ Airflow ์ฐ์ฐ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ฐ์
์ฐ์ฐ์๋ ์์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๊ธฐ๋ฐ์ด ๋๋ ์ํฐํฐ๋ก, ์์ ์ธ์คํด์ค ์คํ ์ค์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ์ง ์ค๋ช ํฉ๋๋ค. ์ด๋ฏธ ์ฌ์ฉํ ์ ์๋ ์ฐ์ฐ์ ์งํฉ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์:
- BashOperator๋ bash ๋ช ๋ น์ ์คํํ๊ธฐ ์ํ ์ฐ์ฐ์์ ๋๋ค.
- PythonOperator๋ Python ์ฝ๋๋ฅผ ํธ์ถํ๋ ์ฐ์ฐ์์ ๋๋ค.
- EmailOperator โ ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ์ฐ์ฐ์.
- HTTPOperator๋ http ์์ฒญ์ ์ฒ๋ฆฌํ๋ ์ฐ์ฐ์์ ๋๋ค.
- SqlOperator๋ SQL ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํ ์ฐ์ฐ์์ ๋๋ค.
- ์ผ์๋ ์ด๋ฒคํธ(์๊ตฌ๋๋ ์๊ฐ์ ๋์ฐฉ, ํ์ํ ํ์ผ์ ์ถํ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ, API์ ์๋ต ๋ฑ)๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ฐ์ฐ์์ ๋๋ค.
๋์ฑ ๊ตฌ์ฒด์ ์ธ ์ฐ์ฐ์๋ก๋ DockerOperator, HiveOperator, S3FileTransferOperator, PrestoToMysqlOperator, SlackOperator๊ฐ ์์ต๋๋ค.
ํ์์ ๋ฐ๋ผ ์ฐ์ฐ์๋ฅผ ๊ฐ๋ฐํ์ฌ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, MongoDB์์ Hive๋ก ๋ฌธ์๋ฅผ ๋ด๋ณด๋ด๋ ์ฐ์ฐ์์ธ MongoDBToHiveViaHdfsTransfer์ Hive์์ ์์ ํ๋ ์ฌ๋ฌ ์ฐ์ฐ์๋ฅผ ๋ง๋ค์์ต๋๋ค. : CHLoadFromHiveOperator์ CHTableLoaderOperator. ์ค์ ๋ก ๊ธฐ๋ณธ ์ฐ์ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋๋ ์ฝ๋๊ฐ ํ๋ก์ ํธ์ ์ถ๊ฐ๋๋ฉด ์ด๋ฅผ ์๋ก์ด ์ฐ์ฐ์๋ก ๋ชจ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ถ๊ฐ ๊ฐ๋ฐ์ด ๊ฐ์ํ๋๊ณ ํ๋ก์ ํธ์ ์ฐ์ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ฑ์์ง๋๋ค.
๋ค์์ผ๋ก, ์ด๋ฌํ ๋ชจ๋ ์์ ์ธ์คํด์ค๋ฅผ ์๋ฃํด์ผ ํ๋ฉฐ, ์ด์ ํ๋๋์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
์ค์ผ์ค๋ฌ
Airflow์ ์์ ์ค์ผ์ค๋ฌ๋ ๋ค์์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ฉ๋๋ค. ์ ๋ฌ๋ฆฌ๋ ํ๋ฅผ ๊ตฌ์ฑํ๊ณ ์์ ์ ๋น๋๊ธฐ ๋ฐ ๋ถ์ฐ ์คํ์ ์ง์ํ๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Airflow ์ธก์์๋ ๋ชจ๋ ์์ ์ด ํ๋ก ๋๋ฉ๋๋ค. ํ์ ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ์ ๋ชฉ์ ์ ์์ค ์์ ๋ถํ๋ฅผ ์ค์ด๊ฑฐ๋ DWH ๋ด์์ ์์ ์ ์ ๋ ฅํ๋ ๊ฒ์ ๋๋ค. ํ์ ์น ์ธํฐํ์ด์ค๋ฅผ ํตํด ๊ด๋ฆฌํ ์ ์์ต๋๋ค.

๊ฐ ํ์๋ ์ฌ๋กฏ ์์ ์ ํ์ด ์์ต๋๋ค. 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 ์์ค์์ ์ง์ ๋ ํ์ ์์
์์ค์์ ์ฌ์ ์๋ ์ ์์ต๋๋ค.
๋ณ๋์ ํ๋ก์ธ์ค์ธ ์ค์ผ์ค๋ฌ๋ Airflow์ ๋ชจ๋ ์์
์ ์ค์ผ์ค๋งํ๋ ์ญํ ์ ํฉ๋๋ค. ์ค์ ๋ก ์ค์ผ์ค๋ฌ๋ ์์
์คํ ์ค์ ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ ๋ฉ์ปค๋์ฆ์ ์ฒ๋ฆฌํฉ๋๋ค. ์์
์ด ์คํ๋๊ธฐ ์ ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค.
- DAG์์๋ ์ด์ ์์ ์ด ์๋ฃ๋๋ฉด ์๋ก์ด ์์ ์ ๋๊ธฐ์ด์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ๋๊ธฐ์ด์ ์์ ์ฐ์ ์์์ ๋ฐ๋ผ ์ ๋ ฌ๋๋ฉฐ(์ฐ์ ์์๋ ์ ์ด ๊ฐ๋ฅ), ํ์ ๋น ์ฌ๋กฏ์ด ์์ผ๋ฉด ์์ ์ ์์ ์ ๋ฃ์ ์ ์์ต๋๋ค.
- ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๋ฌ๋ฆฌ ์์ปค๊ฐ ์์ผ๋ฉด ์์ ์ ํด๋น ์ ๋ฌ๋ฆฌ ์์ปค์๊ฒ ์ ๋ฌ๋๊ณ , ์์ ์์ ํ๋ก๊ทธ๋๋ฐํ ์์ ์ ํ ๋ช ๋๋ ์ฌ๋ฌ ๋ช ์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ฉ๋๋ค.
์ถฉ๋ถํ ๊ฐ๋จํฉ๋๋ค.
์ค์ผ์ค๋ฌ๋ ๋ชจ๋ DAG ์ธํธ์ DAG ๋ด์ ๋ชจ๋ ์์ ์์ ์๋ํฉ๋๋ค.
Scheduler๊ฐ 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 ์ฝ๋์ด๋ฏ๋ก, ์๋ฅผ ๋ค์ด ์ค๋ฉ๋ ์์ค ์์ ์ ์ฝ๋ ์์ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ธ ๊ฐ์ 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๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ๋ง์ผ๋ก ์ค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ํธ๋ฆฌํ์ฃ !
๋ ๋ณต์กํ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด DB ํํ์ ์์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํ ์ด๋ธ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ , ํ ์ด๋ธ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๊ณ , DWH ์ธํ๋ผ์ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ฌ N๊ฐ์ ํ ์ด๋ธ์ ์คํ ๋ฆฌ์ง์ ๋ก๋ํ๋ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋๋ ๋ชฉ๋ก ํํ์ ๋งค๊ฐ๋ณ์ ์์ ์ ์ง์ํ์ง ์๋ API๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด ๋ชฉ๋ก์ ๋ฐ๋ผ DAG(๋ค์ค ๊ทธ๋ฃน)์์ N๊ฐ์ ์์ ์ ์์ฑํ๊ณ , API ์์ฒญ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ๋ก ์ ํํ๊ณ , API์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์คํฌ๋ํํ ์ ์์ต๋๋ค. ์ ์ฐํ๊ฒ ํ์ฉํ ์ ์์ต๋๋ค!
์ ์ฅ์
Airflow๋ ์์ฒด ๋ฐฑ์๋ ์ ์ฅ์์ธ DB(MySQL ๋๋ Postgres ์ค ํ๋, ์ ํฌ๋ Postgres๋ฅผ ์ฌ์ฉํฉ๋๋ค)๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์๋ ์์ ์ํ, DAG, ์ฐ๊ฒฐ ์ค์ , ์ ์ญ ๋ณ์ ๋ฑ์ด ์ ์ฅ๋ฉ๋๋ค. Airflow์ ์ ์ฅ์๋ ๋งค์ฐ ๋จ์ํ๋ฉฐ(์ฝ 20๊ฐ์ ํ ์ด๋ธ) ์์ฒด ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ๋ ค๋ ๊ฒฝ์ฐ ํธ๋ฆฌํฉ๋๋ค. ์ ๋ Informatica ์ ์ฅ์์ 100500๊ฐ์ ํ ์ด๋ธ์ด ์์๋ ๊ฒ์ผ๋ก ๊ธฐ์ตํ๋๋ฐ, ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๊ธฐ ์ ์ ์ด๋ฅผ ์ดํดํ๋ ๋ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
๋ชจ๋ํฐ๋ง
์ ์ฅ์์ ๋จ์์ฑ์ ๊ณ ๋ คํ๋ฉด, ์ฌ์ฉ์์๊ฒ ํธ๋ฆฌํ ์์ ๋ชจ๋ํฐ๋ง ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. Zeppelin์ ๋ ธํธ๋ถ์ ์ฌ์ฉํ์ฌ ์์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.

์ด๋ Airflow ์์ฒด์ ์น ์ธํฐํ์ด์ค์ผ ์๋ ์์ต๋๋ค.

Airflow ์ฝ๋๋ ์คํ ์์ค์ด๋ฏ๋ก Telegram์ ์๋ฆผ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค. ์คํ ์ค์ธ ๋ชจ๋ ์์ ์ธ์คํด์ค์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ ์ฒด ๊ฐ๋ฐ ๋ฐ ์ง์ํ์ด ์ฐธ์ฌํ๋ Telegram ๊ทธ๋ฃน์ ์คํธ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ Telegram์ ํตํด ์ ์ํ ๋ต๋ณ์ ๋ฐ๊ณ , Zeppelin์ ํตํด Airflow์ ์ ๋ฐ์ ์ธ ์์ ์ํฉ์ ํ์ ํ ์ ์์ต๋๋ค.
์ ์ฒด๋ก
Airflow๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ์์ค์ด๋ฏ๋ก ๊ธฐ์ ์ ๊ธฐ๋ํด์๋ ์ ๋ฉ๋๋ค. ์ ๋๋ก ์๋ํ๋ ์๋ฃจ์ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ํฌ์ํ ๊ฐ์ค๋ฅผ ํ์ธ์. ๋ชฉํ๋ ๋ฌ์ฑ ๊ฐ๋ฅํ๋ฉฐ, ๋ฏฟ์ด ์์ฌ์น ์์ต๋๋ค. ๊ทธ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ ์๋, ์ ์ฐ์ฑ, ์๋ก์ด ํ๋ก์ธ์ค ์ถ๊ฐ์ ์ฉ์ด์ฑ ๋ฑ Airflow์ ์ฅ์ ์ด ๋ถ๋ช ๋ง์์ ๋์ค ๊ฒ๋๋ค. ๋ฌผ๋ก ํ๋ก์ ํธ ๊ตฌ์ฑ๊ณผ Airflow ์์ฒด์ ์์ ์ฑ์๋ ๋ง์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํฉ๋๋ค. ๊ธฐ์ ์ ์ผ์ด๋์ง ์์ต๋๋ค.
ํ์ฌ Airflow๋ ๋งค์ผ ์คํ๋๊ณ ์์ต๋๋ค. ์ฝ 6,5์ฒ ๊ฐ์ ์์ . ์ด ๋์ ๋ณธ์ง์ ์ผ๋ก ๋งค์ฐ ๋ค๋ฆ ๋๋ค. ๋ค์ํ๊ณ ๋งค์ฐ ๊ตฌ์ฒด์ ์ธ ์์ค์์ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์ธ DWH๋ก ๋ก๋ํ๋ ์์ , ๋ฉ์ธ DWH ๋ด๋ถ์์ ์ผ์ผ์ด์ค๋ฅผ ๊ณ์ฐํ๋ ์์ , ๋น ๋ฅธ DWH์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ์์ ๋ฑ ๋งค์ฐ ๋ค์ํ ์์ ๋ค์ด ์๋๋ฐ, Airflow๋ ์ด ๋ชจ๋ ์์ ์ ๋งค์ผ ์ฒ๋ฆฌํฉ๋๋ค. ์ซ์๋ก ์ด์ผ๊ธฐํ์๋ฉด, 2,3 ์ฒ๋ช DWH(Hadoop) ๋ด์์ ๋ค์ํ ๋ณต์ก์ฑ์ ์ง๋ ์์ ์ ELT, ๋๋ต 2,5๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ถ์ฒ์ ๋ฐ๋ฅด๋ฉด, ์ด๊ฒ์ ํ์ ๋๋ค 4๋ช ์ ETL ๊ฐ๋ฐ์DWH ๋ด๋ถ์์์ ETL ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ DWH ๋ด๋ถ์์์ ELT ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ก ๊ตฌ๋ถ๋๋ฉฐ ๋ฌผ๋ก ๋ ๋ง์ ํ ๋ช ์ ๊ด๋ฆฌ์์๋น์ค ์ธํ๋ผ๋ฅผ ๋ด๋นํ๋ ๊ธฐ๊ด์ ๋๋ค.
์์ผ๋ก์ ๊ณํ
ํ๋ก์ธ์ค ์๋ ํ์ฐ์ ์ผ๋ก ์ฆ๊ฐํ๋ฉฐ, Airflow ์ธํ๋ผ ์ธก๋ฉด์์ ์ฐ๋ฆฌ๊ฐ ํ ๊ฐ์ฅ ์ค์ํ ์ผ์ ํ์ฅ์ ๋๋ค. Airflow ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๊ณ , Celery Worker๋ฅผ ์ํ ๋ ๊ทธ(leg)๋ฅผ ํ ๋นํ๊ณ , ์์ ์ค์ผ์ค๋ง ํ๋ก์ธ์ค์ ์ ์ฅ์๋ฅผ ๊ฐ์ถ ๋ณต์ ํค๋(duplicate head)๋ฅผ ๋ง๋ค๊ณ ์ ํฉ๋๋ค.
์ปคํผ์ฝ
๋ฌผ๋ก , ์ด๊ฒ ์ ๊ฐ Airflow์ ๋ํด ๋ง์๋๋ฆฌ๊ณ ์ถ์ ์ ๋ถ๋ ์๋์ง๋ง, ํต์ฌ๋ง ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค. ์์์ ๋จน์ผ๋ฉด ๋ฐ๋ผ์ค๋ ๋ฒ์ด์ฃ . ํ๋ฒ ๋์ ๋ณด์ธ์. ๋ถ๋ช ๋ง์์ ๋์ค ๊ฑฐ์์ ๐
์ถ์ฒ : habr.com
