ð TL;DR (3è¡èŠçŽ)
- äœïŒ: dagsterã¯ãããŒã¿åŠçã®æµãïŒãã€ãã©ã€ã³ïŒãçŸããå®çŸ©ããå®è¡ããç£èŠããããã®æ¬¡äžä»£Pythonã©ã€ãã©ãªã§ãã
- ãã€ïŒ: è€æ°ã®ã¹ããããæã€ããŒã¿å€æãETL/ELTãæ©æ¢°åŠç¿ã®ãã£ãŒãã£ãŒçæãªã©ãåŠçã®é åºãšäŸåé¢ä¿ãå³å¯ã«ç®¡çããããšãã«äœ¿ããŸãã
- å©ç¹ïŒ: åŠçã®äŸåé¢ä¿ããããŒã¿è³ç£ïŒAssetïŒããšããŠæç¢ºåãããšã©ãŒçºçæã®è¿œè·¡ãåå®è¡ãåçã«ç°¡åã«ããŠãããŸãã
1. ð€ äžäœdagsterãšã¯äœïŒïŒæ žå¿çãªåœ¹å²ãšäž»ãªäœ¿çšäŸïŒ
Pythonã䜿ã£ãããŒã¿åŠçã¯ãããŒã¿åæãæ©æ¢°åŠç¿ãWebãµãŒãã¹éçºãªã©ãããããåéã§æ¬ ãããŸããããããããããžã§ã¯ãã倧ãããªãã«ã€ããŠããã©ã®ããŒã¿ããã©ã®åŠçãçµãŠã次ã®åŠçã«äœ¿ãããã®ããã远跡ããã®ãéåžžã«é£ãããªããŸãã
ããããªããã以äžã®ãããªæ©ã¿ãæ±ããŠãããªãããŸãã«ä»ãdagsterããã®è§£æ±ºçãæç€ºããŠãããŸãã
- ãæšå€å®è¡ããã¹ã¯ãªãããéäžã§æ¢ãŸã£ããã©ãã©ããŸã§é²ãã ãåãããªãâŠã
- ãAãšããããŒã¿ã»ãããäœãã«ã¯ãå¿ ãBãšCã®åŠçãçµãã£ãŠããªããšãããªãã®ã«ãééããŠAã ãå®è¡ããŠããŸã£ãïŒã
- ãåŠçã®æµãå šäœãã誰ãèŠãŠãåããããã«å³ã§ç€ºããããã©ãæ¯åææžãã§ãããŒãã£ãŒããæžããŠããâŠã
ð æ žå¿çãªåœ¹å²ïŒããŒã¿åŠçã®ãå·¥å Žé·ããšãã¬ã·ãããã¯ã
dagsterã®æ žå¿çãªåœ¹å²ã¯ãããŒã¿åŠçãåãªããå®è¡å¯èœãªã¹ã¯ãªããããšããŠã§ã¯ãªãããããŒã¿è³ç£ïŒAssetïŒããçã¿åºãããã»ã¹ãšããŠæãçŽãããšã§ãã
åŸæ¥ã®ããŒã¿åŠçã¯ãæçã§äŸãããªããåçºã®ã¬ã·ããã§ããã
- éèãåãã¹ã¯ãªãããå®è¡ã2. èãçŒãã¹ã¯ãªãããå®è¡ã3. ããããçµã¿åãããŠã«ã¬ãŒãäœãã¹ã¯ãªãããå®è¡ã
ããéäžã§çŠãä»ãããïŒãšã©ãŒãåºããïŒãã©ãããããçŽãã¹ãããã©ã®ææïŒäžéããŒã¿ïŒããã¡ã«ãªã£ãã®ããèªåã§ç¢ºèªããªããã°ãªããŸããã
äžæ¹ãdagsterã¯ãé«åºŠã«ç®¡çãããå·¥å Žé·ãã®ãããªãã®ã§ãã
dagsterã¯ãããŒã¿åŠçã®åã¹ããããç¬ç«ãããäœæ¥å·¥çšïŒOpïŒããšããŠå®çŸ©ãããã®å·¥çšãçã¿åºãææç©ïŒäžéããŒã¿ãæçµçµæïŒããããŒã¿è³ç£ïŒAssetïŒããšããŠå³å¯ã«ç®¡çããŸãã
æ¯å©çã«èšãã°ãdagsterã¯åãªãã¬ã·ãã§ã¯ãªããããã®èã¯ããã®ãµãã©ã€ã€ãŒããä»å ¥ãããã®æž©åºŠã§çŒãããã®çµæã次ã®å·¥çšã«æž¡ãããšãããå質管çãŸã§å«ãã詳现ãªãè£œé æç€ºæžããªã®ã§ãã
ããã«ããã以äžã®åé¡ã解決ããŸãã
- äŸåé¢ä¿ã®æç¢ºå: ãAãäœãã«ã¯BãšCãå¿ é ããšããé¢ä¿ãã³ãŒãå ã§æç¢ºã«å®çŸ©ãããŸããdagsterã¯BãšCãå®äºãããŸã§Aã®å®è¡ãèš±å¯ããŸããã2. å®è¡ãšç£èŠ: åŠçãã©ããŸã§é²ãã ãããšã©ãŒãã©ãã§çºçããããã©ã®ããŒã¿ã«åé¡ããããããå°çšã®Web UIïŒDagitïŒã§ãªã¢ã«ã¿ã€ã ã«ç£èŠã§ããŸãã3. åå®è¡ã®å¹çå: ãšã©ãŒãçºçããŠãã倱æããã¹ããã以éã®å¿ èŠãªéšåã ããèªåã§ç¹å®ããå¹ççã«åå®è¡ã§ããŸãã
ð äž»ãªäœ¿çšäŸïŒãã®ã©ã€ãã©ãªãç䟡ãçºæ®ããç¬é
dagsterã¯ãããŒã¿ãè€éãªæµãã蟿ããããããç¶æ³ã§åŒ·åãªããŒã«ãšãªããŸãã
1. ETL/ELTãã€ãã©ã€ã³ã®æ§ç¯
ããã¯æãå žåçãªäœ¿çšäŸã§ãã
- E (Extract - æœåº): ããŒã¿ããŒã¹ãAPIããããŒã¿ãååŸããã
- T (Transform - 倿): ååŸããããŒã¿ãã¯ã¬ã³ãžã³ã°ãéèšãçµåããã
- L (Load - ããŒã): 倿åŸã®ããŒã¿ãããŒã¿ãŠã§ã¢ããŠã¹ïŒäŸ: Snowflake, BigQueryïŒã«æžã蟌ãã
ãããã®ã¹ããããäŸåããã£ãŠãããšããdagsterã¯ãæœåºãå®äºããªããšå€æã«é²ããªããã倿ãçµãããªããšããŒãã§ããªãããšããæµããä¿èšŒããåã¹ãããã®æå/倱æãèšé²ããŸãã
2. æ©æ¢°åŠç¿ã¢ãã«ã®ãã¬ãŒãã³ã°ãããŒç®¡ç
æ©æ¢°åŠç¿ãããžã§ã¯ãã§ã¯ãåã«ã¢ãã«ãåŠç¿ãããã ãã§ãªãããã®ååŸã«å€ãã®ããŒã¿åŠçãå¿ èŠã§ãã
- ããŒã¿æºå: çããŒã¿ããç¹åŸŽéïŒFeatureïŒãçæããã
- ãã¬ãŒãã³ã°: ç¹åŸŽéã䜿ã£ãŠã¢ãã«ãåŠç¿ãããã
- è©äŸ¡: åŠç¿æžã¿ã¢ãã«ã®æ§èœãè©äŸ¡ããã
ç¹åŸŽéã®çæã¹ãããã倱æããã°ããã¬ãŒãã³ã°ã¯ç¡æå³ã§ããdagsterã¯ããã®ç¹åŸŽéãã¢ãã«èªäœããAssetããšããŠç®¡çããããšã§ãããã®ã¢ãã«ã¯ããã€çæããããã©ã®ç¹åŸŽéã»ããã§åŠç¿ãããã®ãããåžžã«è¿œè·¡å¯èœã«ããŸãã
3. 宿çãªããŒã¿ã¬ããŒãã®èªåçæ
æ¯é±æææ¥ã«ãå é±ã®å£²äžããŒã¿ãéèšããã°ã©ããäœæããSlackãã¡ãŒã«ã§éä¿¡ããããšãã£ãå®åæ¥åã«ãæé©ã§ãã
éèšåŠçãã°ã©ãçæåŠçãéç¥åŠçããã¹ãŠdagsterã®ãžã§ããšããŠå®çŸ©ããŠããã°ãäžãäžéèšåŠçã§ãšã©ãŒãåºãŠããã°ã©ãçæãéç¥ã誀ã£ãŠå®è¡ãããããšãé²ããå·¥å Žé·ïŒdagsterïŒãããã«ãéèšåŠçã倱æããŸããããšå ±åããŠãããŸãã
2. ð» ã€ã³ã¹ããŒã«æ¹æ³
dagsterã¯Pythonã®ããã±ãŒãžç®¡çããŒã« pip ã䜿ã£ãŠç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸããéçºç°å¢ã§Web UIïŒDagitïŒã䜿ãããã«ãdagster-webserver ãäžç·ã«ã€ã³ã¹ããŒã«ããã®ãäžè¬çã§ãã
以äžã®ã³ãã³ããã¿ãŒããã«ã§å®è¡ããŠãã ããã
pip install dagster dagster-webserver
3. ð ïž å®éã«åäœãããµã³ãã«ã³ãŒã
ããã§ã¯ãæãåºæ¬çãªã2ã€ã®ããŒã¿è³ç£ãçæããããããçµã¿åãããŠæçµçãªããŒã¿è³ç£ãäœãããšãããã€ãã©ã€ã³ãå®çŸ©ããŸãã
ãã®ã³ãŒãã repo.py ãšããŠä¿åããŠãã ããã
# repo.py
from dagster import asset, Definitions, job, op, define_asset_job
# --- 1. ããŒã¿è³ç£ïŒAssetïŒã®å®çŸ© ---
@asset(group_name="sources")
def raw_data():
"""
ã¹ããã1: å€éšããçããŒã¿ãååŸããåŠçãã·ãã¥ã¬ãŒãã
ãã®åŠçãæåãããšããªã¹ã圢åŒã®ãçããŒã¿ããšããè³ç£ãçæãããã
"""
print("â¡ïž çããŒã¿ãååŸäž...")
return [10, 20, 30, 40, 50]
@asset(group_name="preprocessing", deps=[raw_data])
def processed_data(raw_data):
"""
ã¹ããã2: çããŒã¿ãåãåããååŠçïŒããã§ã¯åèŠçŽ ã2åïŒãè¡ãã
deps=[raw_data] ã«ãããraw_dataãå
ã«å®è¡ãããããšãä¿èšŒãããã
"""
print("ð ååŠçãå®è¡äž...")
return [x * 2 for x in raw_data]
@asset(group_name="reporting", deps=[processed_data])
def final_report(processed_data):
"""
ã¹ããã3: ååŠçæžã¿ããŒã¿ãåãåããæçµã¬ããŒãïŒåèšå€ïŒãçæããã
"""
print("â
æçµã¬ããŒããäœæäž...")
total = sum(processed_data)
print(f"ð æçµåèšå€: {total}")
return total
# --- 2. å®çŸ©ã®ãŸãšã ---
# dagsterã«å¿
èŠãªæ
å ±ïŒã¢ã»ããã®éåïŒãDefinitionsãªããžã§ã¯ãã«æž¡ã
defs = Definitions(
assets=[raw_data, processed_data, final_report],
# å®çŸ©ããã¢ã»ããå
šãŠãå®è¡ãããžã§ããèªåã§å®çŸ©ã§ãã
jobs=[
define_asset_job(
name="full_data_pipeline",
selection=["raw_data", "processed_data", "final_report"]
)
]
)
å®è¡æ¹æ³ïŒWeb UIã®èµ·åïŒ
ãã®ãã¡ã€ã«ããããã£ã¬ã¯ããªã§ã以äžã®ã³ãã³ããå®è¡ããŠãã ããã
dagster dev
ã¿ãŒããã«ã«è¡šç€ºãããURLïŒé垞㯠http://127.0.0.1:3000ïŒã«ã¢ã¯ã»ã¹ãããšãdagsterã®Web UIã§ãã Dagit ãèµ·åããŸããDagitå
ã§å®çŸ©ãããžã§ããéžæãããLaunch Runããã¿ã³ãæŒãããšã§ããã€ãã©ã€ã³ãå®è¡ãããŸãã
4. ð ã³ãŒãã®è©³çŽ°èª¬æ
ããŠãäžèšã®ã·ã³ãã«ãªã³ãŒãã§ãããåŸæ¥ã®Pythonã¹ã¯ãªãããšã¯å šãç°ãªãå²åŠã«åºã¥ããŠããŸããdagsterã®ã³ãŒããçè§£ããäžã§éèŠãª3ã€ã®èŠçŽ ããåå¿è ã®æ¹ã«ãåãããããããã«åŸ¹åºçã«è§£èª¬ããŸãã
1. @asset ãã³ã¬ãŒã¿ãšããŒã¿è³ç£ã®æŠå¿µ (Asset)
åŸæ¥ã®ããã°ã©ãã³ã°ã§ã¯ã颿°ã¯ãåŠçããã®ãã®ã衚ããŸãããããããdagsterã§ã¯ @asset ãã³ã¬ãŒã¿ã颿°ã«ä»äžããããšã§ããã®é¢æ°ã®åœ¹å²ããç¹å®ã®ããŒã¿è³ç£ãçã¿åºã補é ããã»ã¹ãã«å€ããŸãã
@asset(group_name="sources")
def raw_data():
# ... ããŒã¿çæããžã㯠...
return [10, 20, 30, 40, 50]
- 颿°ã®åå (
raw_data): ããã¯ãçæãããããŒã¿è³ç£ã®ååã«ãªããŸãã - æ»ãå€ (return): 颿°ã®æ»ãå€ãããã®è³ç£ã®å ·äœçãªãå€ããšãªããŸããdagsterã¯ããã©ã«ãã§ãã®å€ãæ°žç¶åïŒä¿åïŒããããšããŸãïŒããŒã«ã«å®è¡ã§ã¯äžæãã¡ã€ã«ãšããŠæ±ãããŸãïŒã
group_name: UIäžã§è³ç£ãåé¡ããããã®ã©ãã«ã§ããå€§èŠæš¡ãªãããžã§ã¯ãã§ã¯å¿ é ãšãªããŸãã
ãªããããéèŠãªã®ãïŒ
ããŒã¿è³ç£ãšããŠå®çŸ©ããããšã§ãdagsterã¯ãã©ã®è³ç£ããã©ã®è³ç£ã«äŸåããŠãããããèªåã§ææ¡ã§ããŸããããã¯ãåãªã颿°åŒã³åºãïŒprocessed_data(raw_data())ïŒãšã¯æ ¹æ¬çã«ç°ãªããŸãã颿°åŒã³åºãã®å Žåãå®è¡é åºã¯å®çŸ©ãããŸããããã®çµæïŒããŒã¿ïŒãå·¥å Žå
šäœã§ã©ã®ããã«å©çšããã管çãããŠãããã¯å€éšããã¯åãããŸããã
@asset ã䜿ãããšã§ãdagsterã¯ããªãã®ããŒã¿åŠçå
šäœããããŒã¿ãããŒã®ã°ã©ãããšããŠå
éšçã«æ§ç¯ãããã®ã°ã©ãã«åºã¥ããŠå®è¡èšç»ãç«ãŠãã®ã§ãã
2. äŸåé¢ä¿ã®å®çŸ© (deps ãšé¢æ°ã®åŒæ°)
dagsterã«ãããäŸåé¢ä¿ã®å®çŸ©æ¹æ³ã¯éåžžã«çŽæçã§ãããPythonã®é¢æ°ã®ä»çµã¿ãæå€§éã«æŽ»çšããŠããŸãã
@asset(group_name="preprocessing", deps=[raw_data])
def processed_data(raw_data):
# raw_dataãšããåŒæ°åã§ãåã®è³ç£ã®å€ãåãåã
return [x * 2 for x in raw_data]
deps=[raw_data]: ããã¯ããã®processed_dataã¢ã»ãããå®è¡ãããåã«ãå¿ ãraw_dataã¢ã»ãããæåè£ã«å®äºããŠããå¿ èŠãããããšã宣èšããŠããŸãã- åŒæ°å (
raw_data): dagsterã¯è³¢ããåŒæ°åãäŸåããã¢ã»ããã®ååãšäžèŽããŠããããšãèªèããŸããå®è¡æãdagsterã¯å ã«çæãããraw_dataè³ç£ã®å€ãããã®é¢æ°ã®åŒæ°ãšããŠèªåçã«æ³šå ¥ïŒInjectïŒããŠãããŸãã
ãã®ä»çµã¿ã«ãããéçºè ã¯ããŒã¿ã®æµããå¿é ããããšãªããç®ã®åã®ã倿ããžãã¯ãã ãã«éäžã§ããŸããdagsterãããŒã¿ã®åãæž¡ããšäŸåé¢ä¿ã®é å®ããã¹ãŠåŒãåããŠãããã®ã§ãã
3. Definitionsãšãžã§ãã®å®çŸ©
å®çŸ©ããè€æ°ã®ã¢ã»ããããdagsterãèªèããå®è¡å¯èœãªåœ¢ã«ãŸãšããã®ã Definitions ãªããžã§ã¯ãã®åœ¹å²ã§ãã
# dagsterã«å¿
èŠãªæ
å ±ïŒã¢ã»ããã®éåïŒãDefinitionsãªããžã§ã¯ãã«æž¡ã
defs = Definitions(
assets=[raw_data, processed_data, final_report],
jobs=[
define_asset_job(
name="full_data_pipeline",
selection=["raw_data", "processed_data", "final_report"]
)
]
)
Definitions: ããã¯ãdagsterç°å¢ïŒãªããžããªïŒã®ã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ãã¡ã€ã«ã®ãããªãã®ã§ããå®çŸ©ããå šãŠã®ã¢ã»ããããªã¹ã圢åŒã§æž¡ããŸããdefine_asset_job: ã¢ã»ããã¯åäœã§ååšããŸããããããããå®è¡å¯èœãªäžé£ã®åŠçããšããŠãŸãšããã®ãããžã§ãïŒJobïŒãã§ããããã§ã¯ãå®çŸ©ãã3ã€ã®ã¢ã»ããããã¹ãŠå«ãfull_data_pipelineãšããååã®ãžã§ããäœæããŠããŸãã
ãã® Definitions ãªããžã§ã¯ãããããªãã dagster dev ã³ãã³ããå®è¡ãããšãã«ãDagit (Web UI) ã«è¡šç€ºããããèšèšå³ããã®ãã®ã«ãªããŸãã
4. Dagit (Web UI) ã®åœ¹å²ã®éèŠæ§
ãµã³ãã«ã³ãŒãã®å®è¡æ¹æ³ã§ dagster dev ãæšå¥šããã®ã¯ãdagsterã®ç䟡ããã®Web UIãDagit ã«ããããã§ãã
åå¿è
ãåŸæ¥ã®ã¹ã¯ãªããïŒäŸ: python my_script.pyïŒãå®è¡ãããšããçµæã¯ã¿ãŒããã«ã®ãã°ãèŠããããããŸããã§ãããããããDagitã¯ä»¥äžã®ãããªæ©èœãæäŸããŸãã
- å¯èŠå (Asset Graph): å®çŸ©ããã¢ã»ããéã®äŸåé¢ä¿ããèªåçã«çŸããã°ã©ããšããŠè¡šç€ºãããŸããã©ã®ããŒã¿ãã©ãããæ¥ãŠãã©ããžæµããã®ããäžç®çç¶ã§ãã
- å®è¡ãšç£èŠ (Runs): ãžã§ãã®å®è¡ãéå§ãããã®å®è¡ãæåããã倱æãããã倱æããå Žåã¯ã©ã®ã¹ãããïŒã¢ã»ããïŒã§ãšã©ãŒãçºçããããããªã¢ã«ã¿ã€ã ã§ç¢ºèªã§ããŸãã
- ãã°ç®¡ç: åã¹ãããã®æšæºåºåïŒ
printæãªã©ïŒãDagitå ã«æŽçãããŠä¿åãããŸãããšã©ãŒçºçæãã該åœã¹ãããã®ãã°ã«ããã«ãžã£ã³ãã§ããŸãã
dagsterã䜿ããšããããšã¯ãåã«ã³ãŒããæžãããšã§ã¯ãªãããã®Dagitãšãããå¶åŸ¡ç€ãã䜿ã£ãŠããŒã¿å·¥å Žã管çããããšãªã®ã§ããè€éãªåŠçã«ãªãã°ãªãã»ã©ãDagitã®ååšãéçºå¹çãé£èºçã«åäžãããŸãã
5. â ïž æ³šæç¹ãŸãã¯ãã³ã
dagsterã¯åŒ·åã§ãããåŸæ¥ã®ã¹ã¯ãªããå®è¡ãšã¯ç°ãªããã©ãã€ã ïŒèãæ¹ïŒãèŠæ±ããŸããåå¿è ãã¹ã ãŒãºã«å°å ¥ããããã«ãç¹ã«éèŠãªãã³ãã2ã€ç޹ä»ããŸãã
1. ããŒã¿æ°žç¶åïŒI/O ManagerïŒã®æŠå¿µãçè§£ãã
ãµã³ãã«ã³ãŒãã§ã¯ãraw_data ã¢ã»ããããªã¹ããè¿ããprocessed_data ã¢ã»ããããããåŒæ°ãšããŠåãåããŸãããããŒã«ã«ã§ã®å®è¡ã§ã¯ããã®ããŒã¿ã®åãæž¡ãã¯ã¡ã¢ãªå
ãäžæãã¡ã€ã«ã§è¡ãããŸãã
ããããå®éã®ãããã¯ã·ã§ã³ç°å¢ã§ã¯ãããŒã¿åŠçã¯æ°æéãããããšããããŸãããã®éãäžéããŒã¿ïŒäŸ: processed_data ã®çµæïŒãã¡ã¢ãªã«ä¿æãç¶ããã®ã¯çŸå®çã§ã¯ãããŸããããããéäžã§ãµãŒããŒãèœã¡ããããŒã¿ã¯æ¶ããŠããŸããŸãã
ãã³ã: dagsterã¯ãã¢ã»ããã®æ»ãå€ãæ°žç¶çã«ä¿åããå¿ èŠã«å¿ããŠããŒãããä»çµã¿ãšããŠãI/O Managerãã䜿ããŸãã
åå¿è
ã®ãã¡ã¯æèããªããŠãåããŸããããããžã§ã¯ããæ¬æ Œåãããéã«ã¯ãdagster-pyspark ã dagster-aws ã®ãããªæ¡åŒµæ©èœã䜿ã£ãŠãS3ãããŒã¿ããŒã¹ã«äžéããŒã¿ãä¿åããI/O Managerãèšå®ããå¿
èŠããããŸãã
ãäžéããŒã¿ã¯ã¡ã¢ãªã§ã¯ãªããæ°žç¶çãªã¹ãã¬ãŒãžã«ä¿åãããã¹ãã ããšããååãåžžã«æèããŠãã ãããããããåŸæ¥ã®é¢æ°åŒã³åºããšdagsterã®å€§ããªéãã§ãã
2. ã¢ã»ããã®ãåªçæ§ïŒã¹ããšãããïŒããæèãã
åªçæ§ãšã¯ããäœåºŠå®è¡ããŠãåãçµæãåŸãããããšããæ§è³ªãæããŸãã
dagsterã¯ã倱æããã¢ã»ããã ããåå®è¡ããããäŸåé¢ä¿ã倿ŽãããŠããªãã¢ã»ããã®å®è¡ãã¹ããããããïŒãã£ãã·ã¥ã®ãããªæ¯ãèãïŒããããšãã§ããŸããããã¯ãã¢ã»ãããåªçæ§ãæã£ãŠãããšããåæã®ããšã§æãå¹ççã«æ©èœããŸãã
äŸãã°ããçŸåšæå»ããã°ã«æžã蟌ãããšããåŠçã¯ãå®è¡ãããã³ã«ãã°ã®å 容ãå€ããããåªçã§ã¯ãããŸããã
äžæ¹ããç¹å®ã®å ¥åãã¡ã€ã«Aãèªã¿èŸŒã¿ãåžžã«åã倿ããžãã¯Bãé©çšããããšããåŠçã¯ãå ¥åãã¡ã€ã«Aãå€ãããªãéããäœåºŠå®è¡ããŠãåãåºåãåŸãããããåªçã§ãã
dagsterã§ã¢ã»ãããå®çŸ©ããéã¯ãããã®é¢æ°ã¯ãå ¥åãå€ãããªãéããäœåºŠå®è¡ããŠãåãåºåïŒããŒã¿è³ç£ïŒãçã¿åºããïŒããèªåèªçããåªçæ§ãä¿ã€ããã«ããžãã¯ãèšèšããããšãããã€ãã©ã€ã³ã®å®å®æ§ãšãããã°ã®å®¹æãã«ã€ãªãããŸãã
6. ð äžç·ã«èŠãŠãããšè¯ãã©ã€ãã©ãª
dagsterãšåããããŒã¿ãã€ãã©ã€ã³ã®ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãæ ãã©ã€ãã©ãªãšããŠãPythonçã§æãæåã§æŽå²ãããã®ã Apache Airflow ã§ãã
âïž Apache Airflow
- 圹å²: ãžã§ãã®ã¹ã±ãžã¥ãŒãªã³ã°ãšã¯ãŒã¯ãããŒç®¡çã
- dagsterãšã®éã: Airflowã¯ãã¿ã¹ã¯ïŒåŠçïŒãã®å®è¡é åºã管çããããšã«çŠç¹ãåœãŠãŠããŸããäžæ¹ãdagsterã¯ãããŒã¿è³ç£ïŒçµæïŒããã®ãã®ã«çŠç¹ãåœãŠãããŒã¿äžå¿ã®èšèšãä¿ããŸãã
- åŠç¿ã®ãã³ã: Airflowã¯å·šå€§ãªã³ãã¥ããã£ãšè±å¯ãªããã¥ã¡ã³ãããããŸãããæŠå¿µãã¿ã¹ã¯äžå¿ã§ãããããè€éãªããŒã¿äŸåé¢ä¿ãæ±ãéã«ã¯ãdagsterã®ãAssetãäžå¿ã®ã¢ãããŒãã®æ¹ãçŽæçã ãšæããéçºè ãå¢ããŠããŸãã
ããããªããããŒã¿ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ã®æŽå²ãšäž»æµãªæ¹æ³è«ãç¥ããããªãAirflowããããããªããã¢ãã³ã§ããŒã¿äžå¿ã®èšèšå²åŠãåŠã³ãããªãdagsterããããããæ·±ãæãäžããŠã¿ãŠãã ãããäž¡è ã®éããçè§£ããããšã§ãããŒã¿ãšã³ãžãã¢ãªã³ã°ã®å šäœåãèŠããŠããŸãã
7. ð ãŸãšã
仿¥ã¯ãè€éãªããŒã¿åŠçã®æµããçŸãããå¹ççã«ç®¡çããããã®åŒ·åãªããŒã«ãdagsterãã玹ä»ããŸããã
dagsterã®æ žå¿ã¯ãåãªãã¹ã¯ãªããå®è¡ã§ã¯ãªããããŒã¿åŠçããããŒã¿è³ç£ïŒAssetïŒããçæã»æ¶è²»ããå·¥å ŽãšããŠæãçŽãç¹ã«ãããŸãããã®æ°ãããã©ãã€ã ã«ãã£ãŠãäŸåé¢ä¿ã®ç®¡çããšã©ãŒã®è¿œè·¡ãåå®è¡ãåçã«ç°¡åã«ãªããŸãã
ããªãããããããŒã¿åŠçã®è€éãã«ããããããŠãããªããä»ããdagsterã®ãå·¥å Žé·ãã«ããªãã®ããŒã¿ãã€ãã©ã€ã³ã®ç®¡çãä»»ããŠã¿ãŸãããã
ð æ¬¡ã®ææŠèª²é¡
- Dagitãæ¢æ€ããã:
dagster devãå®è¡ããDagitã®UIãé ã ãŸã§èŠãŠãã ãããç¹ã«ãAsset Graphãã®è¡šç€ºããããªãã®æžããã³ãŒããšã©ã®ããã«å¯Ÿå¿ããŠãããã確èªããŸãããã2. ãšã©ãŒãæå³çã«çºçãããŠã¿ãã:raw_data颿°å ã§ãæå³çã«raise Exception("ããŒã¿ååŸå€±æïŒ")ã远å ãããžã§ããå®è¡ããŠã¿ãŠãã ãããDagitãã©ã®ããã«ãšã©ãŒããã€ã©ã€ãããåŸç¶ã®processed_dataãfinal_reportã®å®è¡ãé²ãã芳å¯ããŸãããã
ãã®äžæ©ããããªãã®ããŒã¿ãšã³ãžãã¢ãªã³ã°ã¹ãã«ã次ã®ã¬ãã«ãžãšåŒãäžããŠãããã¯ãã§ããHappy Coding!
ð æšå¥šã¿ã° (ããã·ã¥ã¿ã°)
-
ããŒã¿åæ
-
dagster