เชนเชพเชฏ, เชนเซเช เชฆเชฟเชฎเชฟเชคเซเชฐเซ เชฒเซเชเชตเชฟเชจเซเชจเซเชเซ เชเซเช - เชตเซเชเซเช เชเซเชฅเชจเซ เชเชเชชเชจเซเชเชจเชพ เชเชจเชพเชฒเชฟเชเชฟเชเซเชธ เชตเชฟเชญเชพเชเชจเซ เชกเซเชเชพ เชเชจเซเชเชฟเชจเชฟเชฏเชฐ.
เชนเซเช เชคเชฎเชจเซ ETL เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชตเชฟเชเชธเชพเชตเชตเชพ เชฎเชพเชเซ เชเช เช เชฆเซเชญเซเชค เชธเชพเชงเชจ เชตเชฟเชถเซ เชเชนเซเชถ - Apache Airflow. เชชเชฐเชเชคเซ เชเชฐเชซเซเชฒเซ เชเชเชฒเซ เชธเชฐเซเชตเชคเซเชฎเซเชเซ เช เชจเซ เชฌเชนเซเชชเชเซเชทเซเชฏ เชเซ เชเซ เชคเชฎเซ เชกเซเชเชพ เชชเซเชฐเชตเชพเชนเชฎเชพเช เชธเชพเชฎเซเชฒ เชจ เชนเซเชต เชคเซ เชชเชฃ เชคเชฎเชพเชฐเซ เชคเซเชจเซ เชจเชเซเชเชฅเซ เชเซเชตเซเช เชเซเชเช, เชชเชฐเชเชคเซ เชธเชฎเชฏเชพเชเชคเชฐเซ เชเซเชเชชเชฃ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชถเชฐเซ เชเชฐเชตเชพเชจเซ เช เชจเซ เชคเซเชจเชพ เช เชฎเชฒ เชชเชฐ เชฆเซเชเชฐเซเช เชฐเชพเชเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เช เชจเซ เชนเชพ, เชนเซเช เชฎเชพเชคเซเชฐ เชเชนเซเชถ เชจเชนเซเช, เชชเชฃ เชฌเชคเชพเชตเซเชถ: เชชเซเชฐเซเชเซเชฐเชพเชฎเชฎเชพเช เชเชฃเชพ เชฌเชงเชพ เชเซเชก, เชธเซเชเซเชฐเซเชจเชถเซเชเซเชธ เช เชจเซ เชญเชฒเชพเชฎเชฃเซ เชเซ.
เชเซเชฏเชพเชฐเซ เชคเชฎเซ เชเชฐเชซเซเชฒเซ / เชตเชฟเชเชฟเชฎเซเชกเชฟเชฏเชพ เชเซเชฎเชจเซเชธ เชถเชฌเซเชฆเชจเซ เชเซเชเชฒ เชเชฐเซ เชเซ เชคเซเชฏเชพเชฐเซ เชคเชฎเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชถเซเช เชเซเช เชเซ
เชธเชฎเชพเชตเชฟเชทเซเชเซเชจเซเช เชเซเชทเซเชเช
เชชเชฐเชฟเชเชฏ เชฎเซเชเซเชฏ เชญเชพเช, เชตเซเชฏเชตเชนเชพเชฐเซ (เช เชจเซ เชฅเซเชกเซ เชธเซเชฆเซเชงเชพเชเชคเชฟเช) เชถเชพ เชฎเชพเชเซ เช เชฎเซ (เช เชจเซ เชคเชฎเซ) เชเซเชฒเชธเซเชเชฐ เชเชธเซเชฎเซเชฌเชฒเซเชเช เชฎเซเชณเชญเซเชค เชเซเชฏเชพเชฒเซ เช เชฎเซ เชเชพเชฐเซเชฏเซ เชเชจเชฐเซเช เชเชฐเซเช เชเซเช เชซเซเชฒ เชตเชฟเชถเซ เชฅเซเชกเซเช เช เชฎเซ เช เชจเซเชกเชฐเชฒเซเชกเซเชก เชฒเซเชก เชเชฐเซเช เชเซเช เชเซเชกเชพเชฃเซ, เชนเซเชเซเชธ เช เชจเซ เช เชจเซเชฏ เชเชฒเซ เชเชธเซเชเชฎ เชเชชเชฐเซเชเชฐเชจเซเช เชชเชฆเชเซเชเซเชฆเชจ เชถเซเช เชคเชฎเซ เชฐเซเชกเชตเชพเชจเชพ เชเซ? เชเชเชคเซเชฐ เชเชฐเชตเซเช
เชญเชพเช เช เชเชคเชฟเชฎ, เชธเชเชฆเชฐเซเชญ เช เชจเซ เชฎเชพเชนเชฟเชคเซ เชธเชเชฆเชฐเซเชญเซ
เชชเชฐเชฟเชเชฏ
เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชกเซเชเซเชเชเซเชจเซ เชเซเชฎ เช เชเซ:
- เช เชเชเชฐเชฎเชพเช เชฒเชเซเชฒเซเช
- เชเช เชธเชฐเชธ เชเชกเชฎเชฟเชจ เชชเซเชจเชฒ เชเซ,
- เช เชจเชฟเชถเซเชเชฟเชค เชธเชฎเชฏ เชฎเชพเชเซ เชตเชฟเชธเซเชคเซเชค
- เชซเชเซเชค เชตเชงเซ เชธเชพเชฐเซเช, เช เชจเซ เชคเซ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เช เชฒเช เชนเซเชคเซเช เชฎเชพเชเซ เชฌเชจเชพเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชนเชคเซเช, เชเชเชฒเซ เชเซ (เชเซเชฎ เชเซ เชคเซ เชเชพเชคเชพ เชชเชนเซเชฒเชพ เชฒเชเชพเชฏเซเชฒ เชเซ):
- เช เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชธเชเชเซเชฏเชพเชฎเชพเช เชฎเชถเซเชจเซ เชชเชฐ เชเชพเชฐเซเชฏ เชเชฒเชพเชตเชตเซเช เช เชจเซ เชคเซเชจเซเช เชจเชฟเชฐเซเชเซเชทเชฃ เชเชฐเชตเซเช (เชเซเชเชฒเชพ เชธเซเชฒเชฐเซ / เชเซเชฌเชฐเชจเซเชเซเชธ เช เชจเซ เชคเชฎเชพเชฐเซ เช เชเชคเชฐเชพเชคเซเชฎเชพ เชคเชฎเชจเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเชถเซ)
- เชชเชพเชฏเชฅเซเชจ เชเซเชก เชฒเชเชตเชพ เช เชจเซ เชธเชฎเชเชตเชพ เชฎเชพเชเซ เชเซเชฌ เช เชธเชฐเชณ เชฅเซ เชกเชพเชฏเชจเซเชฎเชฟเช เชตเชฐเซเชเชซเซเชฒเซ เชเชจเชฐเซเชถเชจ เชธเชพเชฅเซ
- เช เชจเซ เชเซเชเชชเชฃ เชกเซเชเชพเชฌเซเชธเซเชธ เช เชจเซ API เชจเซ เชคเซเชฏเชพเชฐ เชเชเชเซ เช เชจเซ เชนเซเชฎเชฎเซเชเชก เชชเซเชฒเชเชเชจเซเชธ เชฌเชเชจเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชเชฌเซเชเชพ เชธเชพเชฅเซ เชเชจเซเชเซเช เชเชฐเชตเชพเชจเซ เชเซเชทเชฎเชคเชพ (เชเซ เช เชคเซเชฏเชเชค เชธเชฐเชณ เชเซ).
เช เชฎเซ เช เชฐเซเชคเซ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช:
- เช เชฎเซ DWH เช เชจเซ ODS (เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชตเชฐเซเชเซเชเชพ เช เชจเซ เชเซเชฒเชฟเชเชนเชพเชเชธ เชเซ) เชฎเชพเช เชตเชฟเชตเชฟเชง เชธเซเชคเซเชฐเซเชคเซ (เชเชฃเชพ SQL เชธเชฐเซเชตเชฐ เช เชจเซ PostgreSQL เชเชฆเชพเชนเชฐเชฃเซ, เชเชชเซเชฒเชฟเชเซเชถเชจ เชฎเซเชเซเชฐเชฟเชเซเชธ เชธเชพเชฅเซเชจเชพ เชตเชฟเชตเชฟเชง API, 1C เชชเชฃ) เชฎเชพเชเชฅเซ เชกเซเชเชพ เชเชเชคเซเชฐเชฟเชค เชเชฐเซเช เชเซเช.
- เชเซเชตเซ เชฐเซเชคเซ เช
เชฆเซเชฏเชคเชจ
cron
, เชเซ ODS เชชเชฐ เชกเซเชเชพ เชเชเชคเซเชฐเซเชเชฐเชฃ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชถเชฐเซ เชเชฐเซ เชเซ, เช เชจเซ เชคเซเชฎเชจเซ เชเชพเชณเชตเชฃเซ เชชเชฐ เชชเชฃ เชจเชเชฐ เชฐเชพเชเซ เชเซ.
เชคเชพเชเซเชคเชฐเชฎเชพเช เชธเซเชงเซ, เช เชฎเชพเชฐเซ เชเชฐเซเชฐเชฟเชฏเชพเชคเซ 32 เชเซเชฐเซ เช เชจเซ 50 GB RAM เชธเชพเชฅเซ เชเช เชจเชพเชจเชพ เชธเชฐเซเชตเชฐ เชฆเซเชตเชพเชฐเชพ เชเชตเชฐเซ เชฒเซเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เชเชฐเชซเซเชฒเซเชฎเชพเช, เช เชเชพเชฎ เชเชฐเซ เชเซ:
- เชตเชงเซ 200 เชกเซ เชเซเชธ (เชเชฐเซเชเชฐ เชตเชฐเซเชเชซเซเชฒเซ, เชเซเชฎเชพเช เชเชชเชฃเซ เชเชพเชฐเซเชฏเซ เชญเชฐเซเชฏเชพ เชเซ),
- เชฆเชฐเซเชเชฎเชพเช เชธเชฐเซเชฐเชพเชถ 70 เชเชพเชฐเซเชฏเซ,
- เช เชญเชฒเชพเช เชถเชฐเซ เชฅเชพเชฏ เชเซ (เชธเชฐเซเชฐเชพเชถ เชชเชฃ) เชเชฒเชพเชเชฎเชพเช เชเชเชตเชพเชฐ.
เช เชจเซ เช เชฎเซ เชเซเชตเซ เชฐเซเชคเซ เชตเชฟเชธเซเชคเชฐเชฃ เชเชฐเซเชฏเซเช เชคเซ เชตเชฟเชถเซ, เชนเซเช เชจเซเชเซ เชฒเชเซเชถ, เชชเชฐเชเชคเซ เชนเชตเซ เชเชพเชฒเซ รผber-เชธเชฎเชธเซเชฏเชพเชจเซ เชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชเชฐเซเช เชเซ เชเชชเชฃเซ เชนเชฒ เชเชฐเซเชถเซเช:
เชคเซเชฏเชพเช เชคเซเชฐเชฃ เชฎเซเชณ SQL เชธเชฐเซเชตเชฐ เชเซ, เชฆเชฐเซเชเชฎเชพเช 50 เชกเซเชเชพเชฌเซเชธเซเชธ เชเซ - เช เชจเซเชเซเชฐเชฎเซ เชเช เชชเซเชฐเซเชเซเชเซเชเชจเชพ เชเชฆเชพเชนเชฐเชฃเซ, เชคเซเชฎเชจเซ เชชเชพเชธเซ เชธเชฎเชพเชจ เชฎเชพเชณเชเซเช เชเซ (เชฒเชเชญเช เชฆเชฐเซเช เชเชเซเชฏเชพเช, เชฎเซเช-เชนเชพ-เชนเชพ), เชเซเชจเซ เช เชฐเซเชฅ เชเซ เชเซ เชฆเชฐเซเช เชชเชพเชธเซ เชเชฐเซเชกเชฐ เชเซเชฌเชฒ เชเซ (เชธเชฆเชจเชธเซเชฌเซ, เชคเซ เชธเชพเชฅเซเชจเซเช เชเซเชฌเชฒ เชจเชพเชฎ เชเซเชเชชเชฃ เชตเซเชฏเชตเชธเชพเชฏเชฎเชพเช เชฆเชฌเชพเชฃ เชเชฐเซ เชถเชเชพเชฏ เชเซ). เช เชฎเซ เชธเชฐเซเชตเชฟเชธ เชซเซเชฒเซเชกเซเชธ (เชธเซเชฐเซเชธ เชธเชฐเซเชตเชฐ, เชธเซเชฐเซเชธ เชกเซเชเชพเชฌเซเช, ETL เชเชพเชธเซเช เชเชเชกเซ) เชเชฎเซเชฐเซเชจเซ เชกเซเชเชพ เชฒเชเช เชเซเช เช เชจเซ เชจเชฟเชเชพเชฒเชธเชชเชฃเซ เชคเซเชจเซ เชตเชฐเซเชเชฟเชเชพเชฎเชพเช เชจเชพเชเซเช เชเซเช.
เชเชพเชฒเซ เชเชเช!
เชฎเซเชเซเชฏ เชญเชพเช, เชตเซเชฏเชตเชนเชพเชฐเซ (เช เชจเซ เชฅเซเชกเซ เชธเซเชฆเซเชงเชพเชเชคเชฟเช)
เชถเชพ เชฎเชพเชเซ เช เชฎเซ (เช เชจเซ เชคเชฎเซ)
เชเซเชฏเชพเชฐเซ เชตเซเชเซเชทเซ เชฎเซเชเชพ เชนเชคเชพ เช
เชจเซ เชนเซเช เชธเชพเชฆเซ เชนเชคเซ SQL
- เชเช เชฐเชถเชฟเชฏเชจ เชฐเชฟเชเซเชฒเชฎเชพเช, เช
เชฎเซ เช
เชฎเชพเชฐเชพ เชฎเชพเชเซ เชเชชเชฒเชฌเซเชง เชฌเซ เชเซเชฒเซเชธเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ ETL เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช เชเชฐเซเชซเซ เชกเซเชเชพ เชซเซเชฒเซ เชธเชพเชฅเซ เชเซเชญเชพเชเชก เชเชฐเซเชฏเซเช เชเซ:
- เชเชจเซเชซเซเชฐเซเชฎเซเชเชฟเชเชพ เชชเชพเชตเชฐ เชธเซเชจเซเชเชฐ - เชเช เช
เชคเซเชฏเชเชค เชซเซเชฒเชพเชคเซ เชธเชฟเชธเซเชเชฎ, เช
เชคเซเชฏเชเชค เชเชคเซเชชเชพเชฆเช, เชคเซเชจเชพ เชชเซเชคเชพเชจเชพ เชนเชพเชฐเซเชกเชตเซเชฐ เชธเชพเชฅเซ, เชคเซเชจเซเช เชชเซเชคเชพเชจเซเช เชตเชฐเซเชเชจเชฟเชเช. เชฎเซเช เชคเซเชจเซ เชเซเชทเชฎเชคเชพเชเชจเชพ 1% เชญเชเชตเชพเชจเชจเซ เชชเซเชฐเชคเชฟเชฌเชเชงเชฟเชค เชเชฐเชตเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ. เชถเชพ เชฎเชพเชเซ? เชธเชพเชฐเซเช, เชธเซ เชชเซเชฐเชฅเชฎ, เช เชเชจเซเชเชฐเชซเซเชธ, เชเซเชฏเชพเชเช 380 เชจเชพ เชฆเชพเชฏเชเชพเชฅเซ, เชฎเชพเชจเชธเชฟเช เชฐเซเชคเซ เชเชชเชฃเชพ เชชเชฐ เชฆเชฌเชพเชฃ เชฒเชพเชตเซ เชเซ. เชฌเซเชเซเช, เช เชเซเชจเซเชเซเชฐเชพเชชเชถเชจ เช
เชคเซเชฏเชเชค เชซเซเชจเซเชธเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเช, เชเซเชธเซเชธเซ เชเชเชเซเชจเชพ เชชเซเชจเชเชเชชเชฏเซเช เช
เชจเซ เช
เชจเซเชฏ เช
เชคเซเชฏเชเชค-เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ-เชเชฆเซเชฏเซเช-เชฏเซเชเซเชคเชฟเช เชฎเชพเชเซ เชฐเชเชพเชฏเซเชฒ เชเซ. เชเชฐเชฌเชธ AXNUMX / เชตเชฐเซเชท เชจเซ เชชเชพเชเชเชจเซ เชเซเชฎ เชคเซเชจเซ เชเชฟเชเชฎเชค เชเซ เชคเซ เชนเชเซเชเชค เชตเชฟเชถเซ, เช
เชฎเซ เชเชเช เชเชนเซเชถเซเช เชจเชนเซเช.
เชธเชพเชตเชเซเชค เชฐเชนเซ, เชธเซเชเซเชฐเซเชจเชถเซเช 30 เชตเชฐเซเชทเชฅเซ เชเชเซ เชเชเชฎเชฐเชจเชพ เชฒเซเชเซเชจเซ เชฅเซเชกเซเช เชจเซเชเชธเชพเชจ เชชเชนเซเชเชเชพเชกเซ เชถเชเซ เชเซ
- SQL เชธเชฐเซเชตเชฐ เชเชเซเชเชฐเชฃ เชธเชฐเซเชตเชฐ - เช
เชฎเซ เช
เชฎเชพเชฐเชพ เชเชจเซเชเซเชฐเชพ-เชชเซเชฐเซเชเซเชเซเช เชชเซเชฐเชตเชพเชนเชฎเชพเช เช เชธเชพเชฅเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ. เช เซเช เชเซ, เชนเชเซเชเชคเชฎเชพเช: เช
เชฎเซ เชชเชนเซเชฒเชพเชฅเซ เช SQL เชธเชฐเซเชตเชฐเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช, เช
เชจเซ เชคเซเชจเชพ ETL เชธเชพเชงเชจเซเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเชตเซ เชคเซ เชเซเชเช เชฐเซเชคเซ เชเซเชฐเชตเชพเชเชฌเซ เชนเชถเซ. เชคเซเชฎเชพเช เชฌเชงเซเช เชธเชพเชฐเซเช เชเซ: เชฌเชเชจเซ เชเชจเซเชเชฐเชซเซเชธ เชธเซเชเชฆเชฐ เชเซ, เช
เชจเซ เชชเซเชฐเซเชเซเชฐเซเชธ เชฐเชฟเชชเซเชฐเซเชเซเชธ... เชชเชฐเชเชคเซ เช เชฎเชพเชเซ เช
เชฎเซ เชธเซเชซเซเชเชตเซเชฐ เชชเซเชฐเซเชกเชเซเชเซเชธเชจเซ เชชเชธเชเชฆ เชจเชฅเซ เชเชฐเชคเชพ, เชเชน, เช เชฎเชพเชเซ เชจเชนเซเช. เชคเซเชจเซเช เชธเชเชธเซเชเชฐเชฃ
dtsx
(เชเซ เชธเซเชต เชชเชฐ เชถเชซเชฒเซเชก เชจเซเชกเซเชธ เชธเชพเชฅเซ XML เชเซ) เช เชฎเซ เชเชฐเซ เชถเชเซเช เชเซเช, เชชเชฐเชเชคเซ เชฎเซเชฆเซเชฆเซ เชถเซเช เชเซ? เชเช เชเชพเชธเซเช เชชเซเชเซเช เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ เชเซ เชเซ เชธเซเชเชเชกเซ เชเซเชทเซเชเชเซเชจเซ เชเช เชธเชฐเซเชตเชฐเชฅเซ เชฌเซเชเชพ เชธเชฐเซเชตเชฐ เชชเชฐ เชเซเชเชเชถเซ? เชนเชพ, เชถเซเช เชธเซ, เชคเชฎเชพเชฐเซ เชคเชฐเซเชเชจเซ เชเชเชเชณเซ เชตเซเชธ เชเซเชเชกเชพเชเชฎเชพเชเชฅเซ เชชเชกเซ เชเชถเซ, เชฎเชพเชเชธ เชฌเชเชจ เชชเชฐ เชเซเชฒเชฟเช เชเชฐเซ. เชชเชฐเชเชคเซ เชคเซ เชเซเชเซเชเชธเชชเชฃเซ เชตเชงเซ เชซเซเชถเชจเซเชฌเชฒ เชฒเชพเชเซ เชเซ:
เช เชฎเซ เชเซเชเซเชเชธเชชเชฃเซ เชฐเชธเซเชคเชพเช เชถเซเชงเซ เชฐเชนเซเชฏเชพ เชเซเช. เชเซเชธ เชชเชฃ เชฒเชเชญเช เชธเซเชต-เชฒเซเชเชฟเชค SSIS เชชเซเชเซเช เชเชจเชฐเซเชเชฐ เชชเชฐ เชเชตเซเชฏเชพ ...
โฆเช เชจเซ เชชเชเซ เชฎเชจเซ เชจเชตเซ เชจเซเชเชฐเซ เชฎเชณเซ. เช เชจเซ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชคเซเชจเชพ เชชเชฐ เชฎเชจเซ เชเชเชณ เชจเซเชเชณเซ เชเชฏเซ.
เชเซเชฏเชพเชฐเซ เชฎเชจเซ เชเชพเชฃเชตเชพ เชฎเชณเซเชฏเซเช เชเซ ETL เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชตเชฐเซเชฃเชจเซ เชธเชฐเชณ เชชเชพเชฏเชฅเซเชจ เชเซเชก เชเซ, เชคเซเชฏเชพเชฐเซ เชฎเซเช เชเชจเชเชฆ เชฎเชพเชเซ เชจเซเชคเซเชฏ เชเชฐเซเชฏเซเช เชจเชนเซเช. เช เชฐเซเชคเซ เชกเซเชเชพ เชธเซเชเซเชฐเซเชฎเชจเซเช เชตเชฐเซเชเชจ เช เชจเซ เชญเชฟเชจเซเชจเชคเชพ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ, เช เชจเซ เชธเซเชเชเชกเซ เชกเซเชเชพเชฌเซเชเชฎเชพเชเชฅเซ เชเช เช เชธเซเชเซเชฐเชเซเชเชฐ เชธเชพเชฅเซ เชเซเชทเซเชเชเซเชจเซ เชเช เชฒเชเซเชทเซเชฏเชฎเชพเช เชฐเซเชกเชตเซเช เช เชฆเซเชข เชเซ เชฌเซ 13โ เชธเซเชเซเชฐเซเชจเชฎเชพเช เชชเชพเชฏเชฅเซเชจ เชเซเชกเชจเซ เชฌเชพเชฌเชค เชฌเชจเซ เชเช เชนเชคเซ.
เชเซเชฒเชธเซเชเชฐ เชเชธเซเชฎเซเชฌเชฒเซเชเช
เชเชพเชฒเซ เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชฌเชพเชฒเชฎเชเชฆเชฟเชฐเชจเซ เชตเซเชฏเชตเชธเซเชฅเชพ เชจ เชเชฐเซเช, เช เชจเซ เช เชนเซเช เชธเชเชชเซเชฐเซเชฃเชชเชฃเซ เชธเซเชชเชทเซเช เชตเชธเซเชคเซเช เชตเชฟเชถเซ เชตเชพเชค เชจ เชเชฐเซเช, เชเซเชฎ เชเซ เชเชฐเชซเซเชฒเซ, เชคเชฎเชพเชฐเชพ เชชเชธเชเชฆ เชเชฐเซเชฒเชพ เชกเซเชเชพเชฌเซเช, เชธเซเชฒเชฐเซ เช เชจเซ เชกเซเชเซเชธเชฎเชพเช เชตเชฐเซเชฃเชตเซเชฒ เช เชจเซเชฏ เชเซเชธเซ เชเชจเซเชธเซเชเซเชฒ เชเชฐเชตเชพ.
เชเซเชฅเซ เช
เชฎเซ เชคเชฐเชค เช เชชเซเชฐเชฏเซเชเซ เชถเชฐเซ เชเชฐเซ เชถเชเซเช, เชฎเซเช เชธเซเชเซเช เชฌเชจเชพเชตเซเชฏเซเช docker-compose.yml
เชเซเชฎเชพเช:
- เชเชพเชฒเซ เชเชฐเซเชเชฐ เชตเชงเชพเชฐเซเช เชนเชตเชพ เชชเซเชฐเชตเชพเชน: เชถเซเชกเซเชฏเซเชฒเชฐ, เชตเซเชฌเชธเชฐเซเชตเชฐ. เชธเซเชฒเชฐเซเชจเชพ เชเชพเชฐเซเชฏเซเชจเซ เชฎเซเชจเชฟเชเชฐ เชเชฐเชตเชพ เชฎเชพเชเซ เชซเซเชฒเชพเชตเชฐ เชชเชฃ เชคเซเชฏเชพเช เชซเชฐเชคเซเช เชนเชถเซ (เชเชพเชฐเชฃ เชเซ เชคเซ เชชเชนเซเชฒเชพเชฅเซ เช
apache/airflow:1.10.10-python3.7
, เชชเชฃ เช เชฎเชจเซ เชตเชพเชเชงเซ เชจเชฅเซ) - เชชเซเชธเซเชเชเซเชฐเซ เชเชธเชเซเชฏเซเชเชฒ, เชเซเชฎเชพเช เชเชฐเชซเซเชฒเซ เชคเซเชจเซ เชธเซเชตเชพ เชฎเชพเชนเชฟเชคเซ (เชถเซเชกเซเชฏเซเชฒเชฐ เชกเซเชเชพ, เชเชเซเชเซเชเซเชฏเซเชถเชจเชจเชพ เชเชเชเชกเชพ, เชตเชเซเชฐเซ) เชฒเชเชถเซ เช เชจเซ เชธเซเชฒเชฐเซ เชชเซเชฐเซเชฃ เชฅเชฏเซเชฒเชพ เชเชพเชฐเซเชฏเซเชจเซ เชเชฟเชนเซเชจเชฟเชค เชเชฐเชถเซ;
- Redis, เชเซ เชธเซเชฒเชฐเซ เชฎเชพเชเซ เชเชพเชธเซเช เชฌเซเชฐเซเชเชฐ เชคเชฐเซเชเซ เชเชพเชฎ เชเชฐเชถเซ;
- เชธเซเชฒเชฐเซ เชเชพเชฎเชฆเชพเชฐ, เชเซ เชเชพเชฐเซเชฏเซเชจเชพ เชธเซเชงเชพ เช เชฎเชฒเชฎเชพเช เชฐเซเชเชพเชฏเซเชฒ เชนเชถเซ.
- เชซเซเชฒเซเชกเชฐเชฎเชพเช
./dags
เช เชฎเซ เชกเซเชเซเชธเชจเชพ เชตเชฐเซเชฃเชจ เชธเชพเชฅเซ เช เชฎเชพเชฐเซ เชซเชพเชเชฒเซ เชเชฎเซเชฐเซเชถเซเช. เชคเซเช เชซเซเชฒเชพเชฏ เชชเชฐ เชฒเซเชตเชพเชฎเชพเช เชเชตเชถเซ, เชคเซเชฅเซ เชฆเชฐเซเช เชเซเชเช เชชเชเซ เชธเชฎเชเซเชฐ เชธเซเชเซเชเชจเซ เชเชเชฒ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชจเชฅเซ.
เชเซเชเชฒเชพเช เชธเซเชฅเชณเซเช, เชเชฆเชพเชนเชฐเชฃเซเชฎเชพเชเชจเซ เชเซเชก เชธเชเชชเซเชฐเซเชฃ เชฐเซเชคเซ เชฌเชคเชพเชตเชตเชพเชฎเชพเช เชเชตเชคเซ เชจเชฅเซ (เชเซเชฅเซ เชเซเชเซเชธเซเชเชฎเชพเช เชเชกเชฌเชก เชจ เชฅเชพเชฏ), เชชเชฐเชเชคเซ เชเซเชฏเชพเชเช เชคเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชฎเชพเช เชธเชเชถเซเชงเชฟเชค เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชธเชเชชเซเชฐเซเชฃ เชตเชฐเซเชเชฟเชเช เชเซเชก เชเชฆเชพเชนเชฐเชฃเซ เชฐเซเชชเซเชเซเชเชฐเซเชฎเชพเช เชฎเชณเซ เชถเชเซ เชเซ
https://github.com/dm-logv/airflow-tutorial .
เชกเซเชเชฐ-เชเชเชชเซเช.เชเชฎเชเชฎเชเชฒ
version: '3.4'
x-airflow-config: &airflow-config
AIRFLOW__CORE__DAGS_FOLDER: /dags
AIRFLOW__CORE__EXECUTOR: CeleryExecutor
AIRFLOW__CORE__FERNET_KEY: MJNz36Q8222VOQhBOmBROFrmeSxNOgTCMaVp2_HOtE0=
AIRFLOW__CORE__HOSTNAME_CALLABLE: airflow.utils.net:get_host_ip_address
AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgres+psycopg2://airflow:airflow@airflow-db:5432/airflow
AIRFLOW__CORE__PARALLELISM: 128
AIRFLOW__CORE__DAG_CONCURRENCY: 16
AIRFLOW__CORE__MAX_ACTIVE_RUNS_PER_DAG: 4
AIRFLOW__CORE__LOAD_EXAMPLES: 'False'
AIRFLOW__CORE__LOAD_DEFAULT_CONNECTIONS: 'False'
AIRFLOW__EMAIL__DEFAULT_EMAIL_ON_RETRY: 'False'
AIRFLOW__EMAIL__DEFAULT_EMAIL_ON_FAILURE: 'False'
AIRFLOW__CELERY__BROKER_URL: redis://broker:6379/0
AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://airflow:airflow@airflow-db/airflow
x-airflow-base: &airflow-base
image: apache/airflow:1.10.10-python3.7
entrypoint: /bin/bash
restart: always
volumes:
- ./dags:/dags
- ./requirements.txt:/requirements.txt
services:
# Redis as a Celery broker
broker:
image: redis:6.0.5-alpine
# DB for the Airflow metadata
airflow-db:
image: postgres:10.13-alpine
environment:
- POSTGRES_USER=airflow
- POSTGRES_PASSWORD=airflow
- POSTGRES_DB=airflow
volumes:
- ./db:/var/lib/postgresql/data
# Main container with Airflow Webserver, Scheduler, Celery Flower
airflow:
<<: *airflow-base
environment:
<<: *airflow-config
AIRFLOW__SCHEDULER__DAG_DIR_LIST_INTERVAL: 30
AIRFLOW__SCHEDULER__CATCHUP_BY_DEFAULT: 'False'
AIRFLOW__SCHEDULER__MAX_THREADS: 8
AIRFLOW__WEBSERVER__LOG_FETCH_TIMEOUT_SEC: 10
depends_on:
- airflow-db
- broker
command: >
-c " sleep 10 &&
pip install --user -r /requirements.txt &&
/entrypoint initdb &&
(/entrypoint webserver &) &&
(/entrypoint flower &) &&
/entrypoint scheduler"
ports:
# Celery Flower
- 5555:5555
# Airflow Webserver
- 8080:8080
# Celery worker, will be scaled using `--scale=n`
worker:
<<: *airflow-base
environment:
<<: *airflow-config
command: >
-c " sleep 10 &&
pip install --user -r /requirements.txt &&
/entrypoint worker"
depends_on:
- airflow
- airflow-db
- broker
เชจเซเชเชง:
- เชฐเชเชจเชพเชจเซ เชเชธเซเชฎเซเชฌเชฒเซเชฎเชพเช, เชนเซเช เชฎเซเชเซ เชญเชพเชเซ เชเชพเชฃเซเชคเซ เชเชฌเซ เชชเชฐ เชเชงเชพเชฐ เชฐเชพเชเชคเซ เชนเชคเซ
เชชเชเชฒ/เชกเซเชเชฐ-เชเชฐเชซเซเชฒเซ - เชคเซเชจเซ เชคเชชเชพเชธเชตเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเซ. เชเชฆเชพเช เชคเชฎเชพเชฐเซ เชคเชฎเชพเชฐเชพ เชเซเชตเชจเชฎเชพเช เชฌเซเชเซ เชเซเช เชตเชธเซเชคเซเชจเซ เชเชฐเซเชฐ เชจเชฅเซ. - เชคเชฎเชพเชฎ เชเชฐเชซเซเชฒเซ เชธเซเชเชฟเชเชเซเชธ เชฎเชพเชคเซเชฐ เชฎเชพเชฐเชซเชคเซ เช เชเชชเชฒเชฌเซเชง เชจเชฅเซ
airflow.cfg
, เชชเชฃ เชชเชฐเซเชฏเชพเชตเชฐเชฃ เชเชฒเซ เชฆเซเชตเชพเชฐเชพ (เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเซ เชเชญเชพเชฐ), เชเซเชจเซ เชฎเซเช เชฆเซเชทเชฟเชค เชฐเซเชคเซ เชฒเชพเชญ เชฒเซเชงเซ. - เชธเซเชตเชพเชญเชพเชตเชฟเช เชฐเซเชคเซ, เชคเซ เชเชคเซเชชเชพเชฆเชจ เชฎเชพเชเซ เชคเซเชฏเชพเชฐ เชจเชฅเซ: เชฎเซเช เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชนเซเชฆเชฏเชจเชพ เชงเชฌเชเชพเชฐเชพ เชเชจเซเชเซเชจเชฐ เชชเชฐ เชฎเซเชเซเชฏเชพ เชจเชฅเซ, เชฎเชจเซ เชธเซเชฐเชเซเชทเชพเชจเซ เชเชฟเชเชคเชพ เชจเชฅเซ. เชชเชฐเชเชคเซ เชฎเซเช เช เชฎเชพเชฐเชพ เชชเซเชฐเชฏเซเชเชเชพเชฐเซ เชฎเชพเชเซ เชเชเชพเชฎเชพเช เชเชเซเช เชฏเซเชเซเชฏ เชเชฐเซเชฏเซเช.
- เชจเซเชเชง เชเชฐเซ เชเซ:
- เชกเซเช เชซเซเชฒเซเชกเชฐ เชถเซเชกเซเชฏเซเชฒเชฐ เช เชจเซ เชเชพเชฎเชฆเชพเชฐเซ เชฌเชเชจเซ เชฎเชพเชเซ เชธเซเชฒเชญ เชนเซเชตเซเช เชเซเชเช.
- เช เช เชฌเชงเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชฒเชพเชเชฌเซเชฐเซเชฐเซเชเชจเซ เชฒเชพเชเซ เชชเชกเซ เชเซ - เชคเซ เชฌเชงเชพ เชถเซเชกเซเชฏเซเชฒเชฐ เช เชจเซ เชเชพเชฎเชฆเชพเชฐเซ เชธเชพเชฅเซ เชฎเชถเซเชจเซ เชชเชฐ เชเชจเซเชธเซเชเซเชฒ เชเชฐเซเชฒเชพ เชนเซเชตเชพ เชเซเชเช.
เชธเชพเชฐเซเช, เชนเชตเซ เชคเซ เชธเชฐเชณ เชเซ:
$ docker-compose up --scale worker=3
เชฌเชงเซเช เชตเชงเซ เชเชพเชฏ เชชเชเซ, เชคเชฎเซ เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธ เชเซเช เชถเชเซ เชเซ:
- เชนเชตเชพ เชชเซเชฐเชตเชพเชน:
http://127.0.0.1:8080/admin/ - เชซเซเชฒ:
http://127.0.0.1:5555/dashboard
เชฎเซเชณเชญเซเชค เชเซเชฏเชพเชฒเซ
เชเซ เชคเชฎเซ เช เชฌเชงเชพ "เชกเซเชเซเชธ" เชฎเชพเช เชเชเชเชชเชฃ เชธเชฎเชเซ เชถเชเซเชฏเชพ เชจเชฅเซ, เชคเซ เช เชนเซเช เชเช เชจเชพเชจเซ เชถเชฌเซเชฆเชเซเชถ เชเซ:
- เชถเซเชกเซเชฏเซเชฒเชฐ - เชเชฐเชซเซเชฒเซเชฎเชพเช เชธเซเชฅเซ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเชพเชเชพ, เชเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ เชเซ เชฐเซเชฌเซเชเซเชธ เชธเชเชค เชฎเชนเซเชจเชค เชเชฐเซ เชเซ, เชตเซเชฏเชเซเชคเชฟ เชจเชนเซเช: เชถเซเชกเซเชฏเซเชฒเชจเซเช เชจเชฟเชฐเซเชเซเชทเชฃ เชเชฐเซ เชเซ, เชกเซเช เช
เชชเชกเซเช เชเชฐเซ เชเซ, เชเชพเชฐเซเชฏเซ เชถเชฐเซ เชเชฐเซ เชเซ.
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชเซเชจเชพ เชธเชเชธเซเชเชฐเชฃเซเชฎเชพเช, เชคเซเชจเซ เชฎเซเชฎเชฐเซเชฎเชพเช เชธเชฎเชธเซเชฏเชพ เชนเชคเซ (เชจเชพ, เชธเซเชฎเซเชคเชฟ เชญเซเชฐเชเชถ เชจเชฅเซ, เชชเชฐเชเชคเซ เชฒเซเชเซเชธ) เช เชจเซ เชฒเซเชเชธเซ เชชเซเชฐเชพเชฎเซเชเชฐ เชชเชฃ เชฐเซเชชเชฐเซเชเชพเชเชฎเชพเช เช เชฐเชนเซเชฏเซเช.
run_duration
- เชคเซเชจเซเช เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เช เชเชคเชฐเชพเชฒ. เชชเชฐเชเชคเซ เชนเชตเซ เชฌเชงเซเช เชฌเชฐเชพเชฌเชฐ เชเซ. - เชกเซ
เช (เชเชฐเซเชซเซ "เชกเซเช") - "เชจเชฟเชฐเซเชฆเซเชถเชฟเชค เชเชธเชพเชฏเชเซเชฒเชฟเช เชเซเชฐเชพเชซ", เชชเชฐเชเชคเซ เชเชตเซ เชตเซเชฏเชพเชเซเชฏเชพ เชฅเซเชกเชพ เชฒเซเชเซเชจเซ เชเชนเซเชถเซ, เชชเชฐเชเชคเซ เชนเชเซเชเชคเชฎเชพเช เชคเซ เชเชเชฌเซเชเชพ เชธเชพเชฅเซ เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเชคเชพ เชเชพเชฐเซเชฏเซ เชฎเชพเชเซเชจเซเช เชเชจเซเชเซเชจเชฐ เชเซ (เชจเซเชเซ เชเซเช) เช
เชฅเชตเชพ SSIS เชฎเชพเช เชชเซเชเซเช เช
เชจเซ เชเชจเซเชซเซเชฐเซเชฎเซเชเชฟเชเชพเชฎเชพเช เชตเชฐเซเชเชซเซเชฒเซเชจเซเช เชเชจเชพเชฒเซเช เชเซ. .
เชกเซเชเซเชธ เชเชชเชฐเชพเชเชค, เชนเชเซ เชชเชฃ เชธเชฌเชกเซเชเซเชธ เชนเซเช เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เช เชฎเซ เชฎเซเชเซ เชญเชพเชเซ เชคเซ เชฎเซเชณเชตเซ เชถเชเชคเชพ เชจเชฅเซ.
- เชกเซเชเชเซ เชฐเชจ - เชชเซเชฐเชพเชฐเชเชญเชฟเช เชกเซเช, เชเซ เชคเซเชจเซ เชชเซเชคเชพเชจเซ เชธเซเชเชชเซเชฒ เชเซ
execution_date
. เชธเชฎเชพเชจ เชกเซเชเชจเชพ เชกเชพเชเซเชฐเชจเซเชธ เชธเชฎเชพเชเชคเชฐ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเซ เชถเชเซ เชเซ (เชเซ เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชเชพเชฐเซเชฏเซเชจเซ เช เชธเซเชชเชทเซเช เชฌเชจเชพเชตเซเชฏเชพ เชเซ, เช เชฒเชฌเชคเซเชค). - เชเชชเชฐเซเชเชฐ เชเซเชเซเชเชธ เชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชตเชพเชฌเชฆเชพเชฐ เชเซเชกเชจเชพ เชเซเชเชกเชพเช เชเซ. เชคเซเชฏเชพเช เชคเซเชฐเชฃ เชชเซเชฐเชเชพเชฐเชจเชพ เชเชชเชฐเซเชเชฐเซ เชเซ:
- เชเซเชฐเชฟเชฏเชพเช
เชฎเชพเชฐเชพ เชชเซเชฐเชฟเชฏเชจเซ เชเซเชฎ
PythonOperator
, เชเซ เชเซเชเชชเชฃ (เชฎเชพเชจเซเชฏ) Python เชเซเชก เชเชฒเชพเชตเซ เชถเชเซ เชเซ; - เชเซเชฐเชพเชจเซเชธเชซเชฐ, เชเซ เชกเซเชเชพเชจเซ เชธเซเชฅเชณเซเชฅเซ เชฌเซเชเชพ เชธเซเชฅเชพเชจเซ เชชเชฐเชฟเชตเชนเชจ เชเชฐเซ เชเซ, เชเชนเซ เชเซ,
MsSqlToHiveTransfer
; - เชธเซเชจเซเชธเชฐ เชฌเซเชเซ เชฌเชพเชเซ, เชคเซ เชคเชฎเชจเซ เชเชเชจเชพ เชจ เชฌเชจเซ เชคเซเชฏเชพเช เชธเซเชงเซ เชกเซเชเชจเชพ เชเชเชณเชจเชพ เช
เชฎเชฒเชจเซ เชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชชเชตเชพ เช
เชฅเชตเชพ เชงเซเชฎเซเช เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ.
HttpSensor
เชเชฒเซเชฒเซเชเชฟเชค เช เชเชคเชฟเชฎ เชฌเชฟเชเชฆเซ เชเซเชเชเซ เชถเชเซ เชเซ, เช เชจเซ เชเซเชฏเชพเชฐเซ เชเชเซเชเชฟเชค เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ เชฐเชพเชน เชเซเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชถเชฐเซ เชเชฐเซGoogleCloudStorageToS3Operator
. เชเชฟเชเซเชเชพเชธเซ เชฎเชจ เชชเซเชเชถเซ: โเชถเชพ เชฎเชพเชเซ? เชเซเชตเชเซ, เชคเชฎเซ เชเชชเชฐเซเชเชฐเชฎเชพเช เช เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจเซ เชเชฐเซ เชถเชเซ เชเซ!" เช เชจเซ เชชเชเซ, เชธเชธเซเชชเซเชจเซเชกเซเชก เชเชชเชฐเซเชเชฐเซ เชธเชพเชฅเซเชจเชพ เชเชพเชฐเซเชฏเซเชจเชพ เชชเซเชฒเชจเซ เชเซเชเชเซ เชจ เชเชตเชพ เชฎเชพเชเซ. เชธเซเชจเซเชธเชฐ เชเชเชฒเชพ เชชเซเชฐเชฏเชพเชธ เชชเชนเซเชฒเชพ เชถเชฐเซ เชฅเชพเชฏ เชเซ, เชคเชชเชพเชธเซ เชเซ เช เชจเซ เชฎเซเชคเซเชฏเซ เชชเชพเชฎเซ เชเซ.
- เชเซเชฐเชฟเชฏเชพเช
เชฎเชพเชฐเชพ เชชเซเชฐเชฟเชฏเชจเซ เชเซเชฎ
- เชเชพเชฐเซเชฏ - เชเซเชทเชฟเชค เชเชชเชฐเซเชเชฐเซ, เชชเซเชฐเชเชพเชฐเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฒเซเชงเชพ เชตเชฟเชจเชพ, เช เชจเซ เชกเซเช เชธเชพเชฅเซ เชเซเชกเชพเชฏเซเชฒเชพเชจเซ เชเชพเชฐเซเชฏเชจเชพ เชชเชฆ เชชเชฐ เชฌเชขเชคเซ เชเชชเชตเชพเชฎเชพเช เชเชตเซ เชเซ.
- เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃ - เชเซเชฏเชพเชฐเซ เชธเชพเชฎเชพเชจเซเชฏ เชเชฏเซเชเชเซ เชจเชเซเชเซ เชเชฐเซเชฏเซเช เชเซ เชเชพเชฐเซเชฏเชเชฐเซเชคเชพ-เชเชพเชฎเชฆเชพเชฐเซ เชชเชฐ เชฏเซเชฆเซเชงเชฎเชพเช เชเชพเชฐเซเชฏเซ เชฎเซเชเชฒเชตเชพเชจเซ เชธเชฎเชฏ เชเชตเซ เชเชฏเซ เชเซ (เชเซ เชเชชเชฃเซ เชเชชเชฏเซเช เชเชฐเซเช เชคเซ เชธเซเชฅเชณ เชชเชฐ เช
LocalExecutor
เช เชฅเชตเชพ เชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เชฆเซเชฐเชธเซเชฅ เชจเซเชก เชชเชฐCeleryExecutor
), เชคเซ เชคเซเชฎเชจเซ เชธเชเชฆเชฐเซเชญ เชธเซเชเชชเซ เชเซ (เชเชเชฒเซ โโโโเชเซ, เชเชฒเซเชจเซ เชธเชฎเซเชน - เชเชเซเชเซเชเซเชฏเซเชถเชจ เชชเซเชฐเชพเชฎเซเชเชฐ), เชเชฆเซเชถ เช เชฅเชตเชพ เชเซเชตเซเชฐเซ เชเซเชฎเซเชชเชฒเซเชเซเชธเชจเซ เชตเชฟเชธเซเชคเซเชค เชเชฐเซ เชเซ, เช เชจเซ เชคเซเชฎเชจเซ เชชเซเชฒ เชเชฐเซ เชเซ.
เช เชฎเซ เชเชพเชฐเซเชฏเซ เชเชจเชฐเซเช เชเชฐเซเช เชเซเช
เชชเซเชฐเชฅเชฎ, เชเชพเชฒเซ เชเชชเชฃเชพ เชกเชเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฏเซเชเชจเชพเชจเซ เชฐเซเชชเชฐเซเชเชพ เชเชชเซเช, เช เชจเซ เชชเชเซ เชเชชเชฃเซ เชตเชงเซ เช เชจเซ เชตเชงเซ เชตเชฟเชเชคเซเชฎเชพเช เชกเชพเชเชต เชเชฐเซเชถเซเช, เชเชพเชฐเชฃ เชเซ เชเชชเชฃเซ เชเซเชเชฒเชพเช เชฌเชฟเชจ-เชคเซเชเซเช เชเชเซเชฒเซ เชฒเชพเชเซ เชเชฐเซเช เชเซเช.
เชคเซเชฅเซ, เชคเซเชจเชพ เชธเชฐเชณ เชธเซเชตเชฐเซเชชเชฎเชพเช, เชเชตเชพ เชกเซเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชถเซ:
from datetime import timedelta, datetime
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from commons.datasources import sql_server_ds
dag = DAG('orders',
schedule_interval=timedelta(hours=6),
start_date=datetime(2020, 7, 8, 0))
def workflow(**context):
print(context)
for conn_id, schema in sql_server_ds:
PythonOperator(
task_id=schema,
python_callable=workflow,
provide_context=True,
dag=dag)
เชเชพเชฒเซ เชคเซเชจเซ เชถเซเชงเซ เชเชพเชขเซเช:
- เชชเซเชฐเชฅเชฎ, เช เชฎเซ เชเชฐเซเชฐเซ เชฒเชฟเชฌเซเชธ เชเชฏเชพเชค เชเชฐเซเช เชเซเช เช เชจเซ เชเชเชเช เชฌเซเชเซเช;
sql_server_ds
เชเซList[namedtuple[str, str]]
เชเชฐเชซเซเชฒเซ เชเชจเซเชเซเชถเชจเซเชธเชจเชพ เชเชจเซเชเซเชถเชจเชจเชพ เชจเชพเชฎเซ เช เชจเซ เชกเซเชเชพเชฌเซเชธเซเชธ เชเซ เชเซเชฎเชพเชเชฅเซ เช เชฎเซ เช เชฎเชพเชฐเซ เชชเซเชฒเซเช เชฒเชเชถเซเช;dag
- เช เชฎเชพเชฐเชพ เชกเซเชเชจเซ เชเชพเชนเซเชฐเชพเชค, เชเซ เชเชตเชถเซเชฏเชเชชเชฃเซ เชนเซเชตเซ เชเซเชเชglobals()
, เช เชจเซเชฏเชฅเชพ เชเชฐเชซเซเชฒเซ เชคเซเชจเซ เชถเซเชงเซ เชถเชเชถเซ เชจเชนเซเช. เชกเชเชจเซ เชชเชฃ เชเชนเซเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ:- เชคเซเชจเซเช เชจเชพเชฎ เชถเซเช เชเซ
orders
- เช เชจเชพเชฎ เชชเชเซ เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชฆเซเชเชพเชถเซ, - เชเซ เชคเซ เชเช เชฎเซ เชเซเชฒเชพเชเชจเซ เชฎเชงเซเชฏเชฐเชพเชคเซเชฐเชฟเชฅเซ เชเชพเชฎ เชเชฐเชถเซ,
- เช
เชจเซ เชคเซ เชฒเชเชญเช เชฆเชฐ 6 เชเชฒเชพเชเซ เชเชพเชฒเชตเซเช เชเซเชเช (เช
เชนเซเช เชคเซเชจเชพ เชฌเชฆเชฒเซ เช
เชเชฐเชพ เชฒเซเชเซ เชฎเชพเชเซ
timedelta()
เชธเซเชตเซเชเชพเชฐเซเชฏcron
-เชฒเชพเชเชจ0 0 0/6 ? * * *
, เชเชเซ เช เชเชกเซ เชฎเชพเชเซ - เชเซเชตเซ เช เชญเชฟเชตเซเชฏเชเซเชคเชฟ@daily
);
- เชคเซเชจเซเช เชจเชพเชฎ เชถเซเช เชเซ
workflow()
เชฎเซเชเซเชฏ เชเชพเชฎ เชเชฐเชถเซ, เชชเชฃ เช เชคเซเชฏเชพเชฐเซ เชจเชนเซเช. เชนเชฎเชฃเชพเช เชฎเชพเชเซ, เช เชฎเซ เชซเชเซเชค เช เชฎเชพเชฐเชพ เชธเชเชฆเชฐเซเชญเชจเซ เชฒเซเชเชฎเชพเช เชกเชฎเซเชช เชเชฐเซเชถเซเช.- เช
เชจเซ เชนเชตเซ เชเชพเชฐเซเชฏเซ เชฌเชจเชพเชตเชตเชพเชจเซ เชธเชฐเชณ เชเชพเชฆเซ:
- เช เชฎเซ เช เชฎเชพเชฐเชพ เชธเซเชคเซเชฐเซเชคเซ เชฆเซเชตเชพเชฐเชพ เชเชฒเชพเชตเซเช เชเซเช;
- เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซ
PythonOperator
, เชเซ เช เชฎเชพเชฐเชพ เชกเชฎเซเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเชถเซworkflow()
. เชเชพเชฐเซเชฏเชจเซเช เชตเชฟเชถเชฟเชทเซเช เชจเชพเชฎ (เชกเซเชเชจเซ เช เชเชฆเชฐ) เชธเซเชชเชทเซเช เชเชฐเชตเชพเชจเซเช เชญเซเชฒเชถเซ เชจเชนเซเช เช เชจเซ เชกเซเชเชจเซ เช เชฌเชพเชเชงเซ. เชงเซเชตเชprovide_context
เชฌเชฆเชฒเชพเชฎเชพเช, เชซเชเชเซเชถเชจเชฎเชพเช เชตเชงเชพเชฐเชพเชจเซ เชฆเชฒเซเชฒเซ เชฐเซเชกเชถเซ, เชเซเชจเซ เช เชฎเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชพเชณเชเซเชชเซเชฐเซเชตเช เชเชเชคเซเชฐเชฟเชค เชเชฐเซเชถเซเช**context
.
เชนเชฎเชฃเชพเช เชฎเชพเชเซ, เชคเซ เชฌเชงเซ เช เชเซ. เช เชฎเชจเซ เชถเซเช เชฎเชณเซเชฏเซเช:
- เชตเซเชฌ เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชจเชตเซเช เชกเซเช,
- เชฆเซเชข เชธเซ เชเชพเชฐเซเชฏเซ เชเซ เชธเชฎเชพเชเชคเชฐ เชฐเซเชคเซ เชเชฒเชพเชตเชตเชพเชฎเชพเช เชเชตเชถเซ (เชเซ เชเชฐเชซเซเชฒเซ, เชธเซเชฒเชฐเซ เชธเซเชเชฟเชเชเซเชธ เช เชจเซ เชธเชฐเซเชตเชฐ เชเซเชทเชฎเชคเชพ เชคเซเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ).
เชธเชพเชฐเซเช, เชฒเชเชญเช เชธเชฎเชเชพเชฏเซเช.
เช
เชตเชฒเชเชฌเชจ เชเซเชฃ เชธเซเชฅเชพเชชเชฟเชค เชเชฐเชถเซ?
เช เชเชเซ เชตเชธเซเชคเซเชจเซ เชธเชฐเชณ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซ, เชฎเซเช เชธเซเชเซเชฐเซ เชเชฐเซเชฏเซเช docker-compose.yml
เชชเซเชฐเชเซเชฐเชฟเชฏเชพ requirements.txt
เชฌเชงเชพ เชเชพเชเช เซ เชชเชฐ.
เชนเชตเซ เชคเซ เชเชฏเซ:
เชเซเชฐเซ เชธเซเชเซเชตเซเชฐ เช เชถเซเชกเซเชฏเซเชฒเชฐ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชพเชฏเซเชฒเชพ เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃเซ เชเซ.
เช เชฎเซ เชฅเซเชกเซ เชฐเชพเชน เชเซเชเช เชเซเช, เชเชพเชฎเชฆเชพเชฐเซ เชฆเซเชตเชพเชฐเชพ เชเชพเชฐเซเชฏเซ เชชเซเชฐเซเชฃ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ:
เชฒเซเชฒเชพเช, เช เชฒเชฌเชคเซเชค, เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชคเซเชฎเชจเซเช เชเชพเชฐเซเชฏ เชชเซเชฐเซเชฃ เชเชฐเซเชฏเซเช เชเซ. เชฐเซเชกเซเชธ เชเซเชฌ เชธเชซเชณ เชจเชฅเซ.
เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เช เชฎเชพเชฐเชพ เชเชคเซเชชเชพเชฆเชจ เชชเชฐ เชเซเช เชซเซเชฒเซเชกเชฐ เชจเชฅเซ
./dags
, เชฎเชถเซเชจเซ เชตเชเซเชเซ เชเซเช เชธเซเชฎเซเชณ เชจเชฅเซ - เชฌเชงเชพ เชกเซ เชเซเชธ เช เชเชฆเชฐ เชฐเชนเซ เชเซgit
เช เชฎเชพเชฐเชพ Gitlab เชชเชฐ, เช เชจเซ Gitlab CI เชเซเชฏเชพเชฐเซ เชฎเชฐเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชคเซเชฏเชพเชฐเซ เชฎเชถเซเชจเซเชจเซ เช เชชเชกเซเชเซเชธเชจเซเช เชตเชฟเชคเชฐเชฃ เชเชฐเซ เชเซmaster
.
เชซเซเชฒ เชตเชฟเชถเซ เชฅเซเชกเซเช
เชเซเชฏเชพเชฐเซ เชเชพเชฎเชฆเชพเชฐเซ เช เชฎเชพเชฐเชพ เชชเซเชธเชฟเชซเชพเชฏเชฐเซเชธเชจเซ เชฎเชพเชฐเชคเชพ เชนเซเชฏ, เชคเซเชฏเชพเชฐเซ เชเชพเชฒเซ เชฌเซเชเซเช เชเช เชธเชพเชงเชจ เชฏเชพเชฆ เชเชฐเซเช เชเซ เชเชชเชฃเชจเซ เชเชเชเช เชฌเชคเชพเชตเซ เชถเชเซ เชเซ - เชซเซเชฒเชพเชตเชฐ.
เชตเชฐเซเชเชฐ เชจเซเชกเซเชธ เชชเชฐ เชธเชพเชฐเชพเชเชถ เชฎเชพเชนเชฟเชคเซ เชธเชพเชฅเซเชจเซเช เชชเซเชฐเชฅเชฎ เชชเซเชทเซเช :
เชเชพเชฐเซเชฏเซ เชธเชพเชฅเซเชจเซเช เชธเซเชฅเซ เชธเชเชจ เชชเซเชทเซเช เชเซ เชเชพเชฎ เชชเชฐ เชเชฏเชพ เชเซ:
เช เชฎเชพเชฐเชพ เชฌเซเชฐเซเชเชฐเชจเซ เชธเซเชฅเชฟเชคเชฟ เชธเชพเชฅเซเชจเซเช เชธเซเชฅเซ เชเชเชเชพเชณเชพเชเชจเช เชชเซเชทเซเช :
เชธเซเชฅเซ เชคเซเชเชธเซเชตเซ เชชเซเชทเซเช เชเชพเชฐเซเชฏ เชธเซเชฅเชฟเชคเชฟ เชเซเชฐเชพเชซ เช เชจเซ เชคเซเชฎเชจเชพ เช เชฎเชฒเชจเชพ เชธเชฎเชฏ เชธเชพเชฅเซ เชเซ:
เช เชฎเซ เช เชจเซเชกเชฐเชฒเซเชกเซเชก เชฒเซเชก เชเชฐเซเช เชเซเช
เชคเซเชฅเซ, เชคเชฎเชพเชฎ เชเชพเชฐเซเชฏเซ เชชเซเชฐเซเชฃ เชฅเช เชเชฏเชพ เชเซ, เชคเชฎเซ เชเชพเชฏเชฒเซเชจเซ เชฒเช เชเช เชถเชเซ เชเซ.
เช เชจเซ เชคเซเชฏเชพเช เชเชฃเชพ เชเชพเชฏเชฒ เชฅเชฏเชพ เชนเชคเชพ - เชเช เช เชฅเชตเชพ เชฌเซเชเชพ เชเชพเชฐเชฃเซเชธเชฐ. เชเชฐเชซเซเชฒเซเชจเชพ เชธเชพเชเชพ เชเชชเชฏเซเชเชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เช เชเซเชฌ เช เชเซเชฐเชธ เชธเซเชเชตเซ เชเซ เชเซ เชกเซเชเชพ เชเซเชเซเชเชธเชชเชฃเซ เชเชตเซเชฏเซ เชจเชฅเซ.
เชคเชฎเชพเชฐเซ เชฒเซเช เชเซเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เช เชจเซ เชเชเซ เชเชฏเซเชฒเชพ เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃเซเชจเซ เชซเชฐเซเชฅเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
เชเซเชเชชเชฃ เชเซเชฐเชธ เชชเชฐ เชเซเชฒเชฟเช เชเชฐเซเชจเซ, เช เชฎเซ เช เชฎเชพเชฐเชพ เชฎเชพเชเซ เชเชชเชฒเชฌเซเชง เชเซเชฐเชฟเชฏเชพเช เชเซเชเชถเซเช:
เชคเชฎเซ เชฒเช เชถเชเซ เชเซ เช เชจเซ เชซเซเชฒเชจเชจเซ เชธเชพเชซ เชเชฐเซ เชถเชเซ เชเซ. เชเชเชฒเซ เชเซ, เชเชชเชฃเซ เชญเซเชฒเซ เชเชเช เชเซเช เชเซ เชคเซเชฏเชพเช เชเชเชเช เชจเชฟเชทเซเชซเชณ เชฅเชฏเซเช เชเซ, เช เชจเซ เชคเซ เช เชเชฆเชพเชนเชฐเชฃ เชเชพเชฐเซเชฏ เชถเซเชกเซเชฏเซเชฒเชฐ เชชเชฐ เชเชถเซ.
เชคเซ เชธเซเชชเชทเซเช เชเซ เชเซ เชฌเชงเชพ เชฒเชพเชฒ เชเซเชฐเชธ เชธเชพเชฅเซ เชฎเชพเชเชธ เชธเชพเชฅเซ เชเชตเซเช เชเชฐเชตเซเช เช เชเซเชฌ เชฎเชพเชจเชตเซเชฏ เชจเชฅเซ - เช เชคเซ เชจเชฅเซ เชเซ เชเชชเชฃเซ เชเชฐเชซเซเชฒเซ เชชเชพเชธเซเชฅเซ เช
เชชเซเชเซเชทเชพ เชฐเชพเชเซเช เชเซเช. เชธเซเชตเชพเชญเชพเชตเชฟเช เชฐเซเชคเซ, เช
เชฎเชพเชฐเซ เชชเชพเชธเซ เชธเชพเชฎเซเชนเชฟเช เชตเชฟเชจเชพเชถเชจเชพ เชถเชธเซเชคเซเชฐเซ เชเซ: Browse/Task Instances
เชเชพเชฒเซ เชเช เช เชธเชฎเชฏเซ เชฌเชงเซเช เชชเชธเชเชฆ เชเชฐเซเช เช เชจเซ เชถเซเชจเซเชฏ เชชเชฐ เชซเชฐเซเชฅเซ เชธเซเช เชเชฐเซเช, เชธเชพเชเซ เชเชเชเชฎ เชชเชฐ เชเซเชฒเชฟเช เชเชฐเซ:
เชธเชซเชพเช เชเชฐเซเชฏเชพ เชชเชเซ, เช เชฎเชพเชฐเซ เชเซเชเซเชธเซเช เชเชจเชพ เชเซเชตเซ เชฆเซเชเชพเชฏ เชเซ (เชคเซเช เชชเชนเซเชฒเซเชฅเซ เช เชถเซเชกเซเชฏเซเชฒเชฐ เชฆเซเชตเชพเชฐเชพ เชคเซเชฎเชจเซ เชถเซเชกเซเชฏเซเชฒ เชเชฐเชตเชพ เชฎเชพเชเซ เชฐเชพเชน เชเซเช เชฐเชนเซเชฏเชพ เชเซ):
เชเซเชกเชพเชฃเซ, เชนเซเชเซเชธ เช เชจเซ เช เชจเซเชฏ เชเชฒเซ
เชเชเชพเชฎเซ เชกเซเชเชเซ เชเซเชตเชพเชจเซ เชธเชฎเชฏ เชเชตเซ เชเชฏเซ เชเซ, update_reports.py
:
from collections import namedtuple
from datetime import datetime, timedelta
from textwrap import dedent
from airflow import DAG
from airflow.contrib.operators.vertica_operator import VerticaOperator
from airflow.operators.email_operator import EmailOperator
from airflow.utils.trigger_rule import TriggerRule
from commons.operators import TelegramBotSendMessage
dag = DAG('update_reports',
start_date=datetime(2020, 6, 7, 6),
schedule_interval=timedelta(days=1),
default_args={'retries': 3, 'retry_delay': timedelta(seconds=10)})
Report = namedtuple('Report', 'source target')
reports = [Report(f'{table}_view', table) for table in [
'reports.city_orders',
'reports.client_calls',
'reports.client_rates',
'reports.daily_orders',
'reports.order_duration']]
email = EmailOperator(
task_id='email_success', dag=dag,
to='{{ var.value.all_the_kings_men }}',
subject='DWH Reports updated',
html_content=dedent("""ะะพัะฟะพะดะฐ ั
ะพัะพัะธะต, ะพััะตัั ะพะฑะฝะพะฒะปะตะฝั"""),
trigger_rule=TriggerRule.ALL_SUCCESS)
tg = TelegramBotSendMessage(
task_id='telegram_fail', dag=dag,
tg_bot_conn_id='tg_main',
chat_id='{{ var.value.failures_chat }}',
message=dedent("""
ะะฐัะฐั, ะฟัะพััะฟะฐะนัั, ะผั {{ dag.dag_id }} ััะพะฝะธะปะธ
"""),
trigger_rule=TriggerRule.ONE_FAILED)
for source, target in reports:
queries = [f"TRUNCATE TABLE {target}",
f"INSERT INTO {target} SELECT * FROM {source}"]
report_update = VerticaOperator(
task_id=target.replace('reports.', ''),
sql=queries, vertica_conn_id='dwh',
task_concurrency=1, dag=dag)
report_update >> [email, tg]
เชถเซเช เชฆเชฐเซเช เชตเซเชฏเชเซเชคเชฟเช เชเซเชฏเชพเชฐเซเชฏ เชฐเชฟเชชเซเชฐเซเช เช เชชเชกเซเช เชเชฐเซเชฏเซเช เชเซ? เช เชซเชฐเซเชฅเซ เชคเซเชฃเซ เชเซ: เชกเซเชเชพ เชเซเชฏเชพเชเชฅเซ เชฎเซเชณเชตเชตเซ เชคเซ เชธเซเชคเซเชฐเซเชคเซเชจเซ เชธเซเชเชฟ เชเซ; เชเซเชฏเชพเช เชฎเซเชเชตเซเช เชคเซเชจเซ เชธเซเชเชฟ เชเซ; เชเซเชฏเชพเชฐเซ เชฌเชงเซเช เชฅเชฏเซเช เช เชฅเชตเชพ เชคเซเชเซ เชเชฏเซเช เชคเซเชฏเชพเชฐเซ เชนเซเชเช เชฎเชพเชฐเชตเชพเชจเซเช เชญเซเชฒเชถเซ เชจเชนเซเช (เชธเชพเชฐเซเช, เช เชเชชเชฃเชพ เชตเชฟเชถเซ เชจเชฅเซ, เชจเชพ).
เชเชพเชฒเซ เชซเชฐเซเชฅเซ เชซเชพเชเชฒเชฎเชพเช เชเชเช เช เชจเซ เชจเชตเซ เช เชธเซเชชเชทเซเช เชธเชพเชฎเชเซเชฐเซ เชเซเชเช:
from commons.operators import TelegramBotSendMessage
- เช เชฎเชจเซ เช เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชเชชเชฐเซเชเชฐเซเชธ เชฌเชจเชพเชตเชตเชพเชฅเซ เชเชเช เชฐเซเชเชคเซเช เชจเชฅเซ, เชเซเชจเซ เช เชฎเซ เช เชจเชฌเซเชฒเซเช เชเชฐเซเชฒเชพเชจเซ เชธเชเชฆเซเชถเชพ เชฎเซเชเชฒเชตเชพ เชฎเชพเชเซ เชเช เชจเชพเชจเซเช เชฐเซเชชเชฐ เชฌเชจเชพเชตเซเชจเซ เชฒเชพเชญ เชฒเซเชงเซ เชเซ. (เช เชฎเซ เชจเซเชเซ เช เชเชชเชฐเซเชเชฐ เชตเชฟเชถเซ เชตเชงเซ เชตเชพเชค เชเชฐเซเชถเซเช);default_args={}
- เชกเซเช เชคเซเชจเชพ เชคเชฎเชพเชฎ เชเชชเชฐเซเชเชฐเซเชจเซ เชธเชฎเชพเชจ เชฆเชฒเซเชฒเซ เชตเชฟเชคเชฐเชฟเชค เชเชฐเซ เชถเชเซ เชเซ;to='{{ var.value.all_the_kings_men }}'
- เชเซเชทเซเชคเซเชฐto
เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชนเชพเชฐเซเชกเชเซเชก เชจเชนเซเช เชนเซเชฏ, เชชเชฐเชเชคเซ เชเชฟเชจเซเชเชพเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชคเชฟเชถเซเชฒ เชฐเซเชคเซ เชเชจเชฐเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ เช เชจเซ เชเชฎเซเชเชฒเซเชธเชจเซ เชธเซเชเชฟ เชธเชพเชฅเซเชจเชพ เชเชฒ, เชเซ เชฎเซเช เชเชพเชณเชเซเชชเซเชฐเซเชตเช เชฎเซเชเซเชฏเซเช เชเซAdmin/Variables
;trigger_rule=TriggerRule.ALL_SUCCESS
- เชเชชเชฐเซเชเชฐ เชถเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชถเชฐเชค. เช เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช, เชเซ เชฌเชงเซ เชจเชฟเชฐเซเชญเชฐเชคเชพเช เชเชพเชฎ เชเชฐเซ เชเช เชนเซเชฏ เชคเซ เช เชชเชคเซเชฐ เชฌเซเชธเชจเซ เชเชถเซ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช;tg_bot_conn_id='tg_main'
- เชฆเชฒเซเชฒเซconn_id
เช เชฎเซ เชเซ เชเชจเซเชเซเชถเชจ ID เชฌเชจเชพเชตเซเช เชเซเช เชคเซ เชธเซเชตเซเชเชพเชฐเซเช เชเซเชAdmin/Connections
;trigger_rule=TriggerRule.ONE_FAILED
- เชเซเชฒเชฟเชเซเชฐเชพเชฎเชฎเชพเช เชธเชเชฆเซเชถเชพเช เชซเชเซเชค เชคเซเชฏเชพเชฐเซ เช เชเชกเซ เชเชถเซ เชเซ เชคเซเชฏเชพเช เชชเชกเชคเซ เชเชพเชฐเซเชฏเซ เชนเซเชฏ;task_concurrency=1
- เช เชฎเซ เชเช เชเชพเชฐเซเชฏเชจเชพ เช เชจเซเช เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃเซเชจเชพ เชเชเชธเชพเชฅเซ เชฒเซเชเช เชเชฐเชตเชพ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เชฎเซเชเซเช เชเซเช. เชจเชนเชฟเชเชคเชฐ, เช เชฎเซ เชเช เชธเชพเชฅเซ เช เชจเซเช เชฒเซเชจเซเช เชฎเซเชณเชตเซเชถเซเชVerticaOperator
(เชเช เชเซเชฌเชฒ เชคเชฐเชซ เชเซเชตเซเช);report_update >> [email, tg]
- เชฌเชงเชพVerticaOperator
เชเชจเชพ เชเซเชตเชพ เชชเชคเซเชฐเซ เช เชจเซ เชธเชเชฆเซเชถเชพเช เชฎเซเชเชฒเชตเชพเชฎเชพเช เชเชเชฐเซเชช เชฅเชพเช:
เชชเชฐเชเชคเซ เชจเซเชเชฟเชซเชพเชฏเชฐ เชเชชเชฐเซเชเชฐเซเชจเซ เชฒเซเชเชเชจเซ เชถเชฐเชคเซ เช เชฒเช เชนเซเชตเชพเชฅเซ, เชฎเชพเชคเซเชฐ เชเช เช เชเชพเชฎ เชเชฐเชถเซ. เชเซเชฐเซ เชตเซเชฏเซเชฎเชพเช, เชฌเชงเซเช เชฅเซเชกเซเช เชเชเซเช เชฆเซเชฐเชถเซเชฏ เชฆเซเชเชพเชฏ เชเซ:
เชนเซเช เชตเชฟเชถเซ เชฅเซเชกเชพ เชถเชฌเซเชฆเซ เชเชนเซเชถ เชฎเซเชเซเชฐเซ เช เชจเซ เชคเซเชฎเชจเชพ เชฎเชฟเชคเซเชฐเซ - เชเชฒเซ.
เชฎเซเชเซเชฐเซ เช เชเชฟเชจเซเชเชพ เชชเซเชฒเซเชธเชนเซเชฒเซเชกเชฐเซเชธ เชเซ เชเซ เชเชชเชฐเซเชเชฐ เชฆเชฒเซเชฒเซเชฎเชพเช เชตเชฟเชตเชฟเชง เชเชชเชฏเซเชเซ เชฎเชพเชนเชฟเชคเซเชจเซ เชฌเชฆเชฒเซ เชถเชเซ เชเซ. เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชจเซ เชเซเชฎ:
SELECT
id,
payment_dtm,
payment_type,
client_id
FROM orders.payments
WHERE
payment_dtm::DATE = '{{ ds }}'::DATE
{{ ds }}
เชธเชเชฆเชฐเซเชญ เชตเซเชฐเซเชเชฌเชฒเชจเซ เชธเชพเชฎเชเซเชฐเซ เชธเซเชงเซ เชตเชฟเชธเซเชคเซเชค เชฅเชถเซ execution_date
เชซเซเชฐเซเชฎเซเชเชฎเชพเช YYYY-MM-DD
: 2020-07-14
. เชถเซเชฐเซเชทเซเช เชญเชพเช เช เชเซ เชเซ เชธเชเชฆเชฐเซเชญ เชเชฒเซเชจเซ เชเซเชเซเชเชธ เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃ (เชเซเชฐเซ เชตเซเชฏเซเชฎเชพเช เชเช เชเซเชฐเชธ) เชชเชฐ เชเซเชฒเซ เชจเชพเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เช
เชจเซ เชเซเชฏเชพเชฐเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชคเซเชฏเชพเชฐเซ เชชเซเชฒเซเชธเชนเซเชฒเซเชกเชฐเซเชธ เชธเชฎเชพเชจ เชฎเซเชฒเซเชฏเซ เชธเซเชงเซ เชตเชฟเชธเซเชคเซเชค เชฅเชถเซ.
เชธเซเชเชชเซเชฒ เชฎเซเชฒเซเชฏเซ เชฆเชฐเซเช เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃ เชชเชฐ เชฐเซเชจเซเชกเชฐ เชเชฐเซเชฒ เชฌเชเชจเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเซเช เชถเชเชพเชฏ เชเซ. เช เชฐเซเชคเซ เชชเชคเซเชฐ เชฎเซเชเชฒเชตเชพเชจเซเช เชเชพเชฐเซเชฏ เชเซ:
เช เชจเซ เชคเซเชฅเซ เชธเชเชฆเซเชถ เชฎเซเชเชฒเชตเชพเชจเชพ เชเชพเชฐเซเชฏ เชชเชฐ:
เชจเชตเซเชจเชคเชฎ เชเชชเชฒเชฌเซเชง เชธเชเชธเซเชเชฐเชฃ เชฎเชพเชเซ เชฌเชฟเชฒเซเช-เชเชจ เชฎเซเชเซเชฐเซเชจเซ เชธเชเชชเซเชฐเซเชฃ เชธเซเชเชฟ เช
เชนเซเช เชเชชเชฒเชฌเซเชง เชเซ:
เชตเชงเซเชฎเชพเช, เชชเซเชฒเชเชฟเชจเซเชธเชจเซ เชฎเชฆเชฆเชฅเซ, เช เชฎเซ เช เชฎเชพเชฐเชพ เชชเซเชคเชพเชจเชพ เชฎเซเชเซเชฐเซเชจเซ เชเชพเชนเซเชฐ เชเชฐเซ เชถเชเซเช เชเซเช, เชชเชฐเชเชคเซ เชคเซ เชฌเซเชเซ เชตเชพเชฐเซเชคเชพ เชเซ.
เชชเซเชฐเซเชตเชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค เชตเชธเซเชคเซเช เชเชชเชฐเชพเชเชค, เช
เชฎเซ เช
เชฎเชพเชฐเชพ เชเชฒเซเชจเชพเช เชฎเซเชฒเซเชฏเซเชจเซ เชฌเชฆเชฒเซ เชถเชเซเช เชเซเช (เชฎเซเช เชเชชเชฐเชจเชพ เชเซเชกเชฎเชพเช เชชเชนเซเชฒเซเชฅเซ เช เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเชฏเซ เชเซ). เชเชพเชฒเซ เช
เชเชฆเชฐ เชฌเชจเชพเชตเซเช Admin/Variables
เชฌเซ เชตเชธเซเชคเซเช:
เชคเชฎเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชคเซ เชฌเชงเซเช:
TelegramBotSendMessage(chat_id='{{ var.value.failures_chat }}')
เชฎเซเชฒเซเชฏ เชเช เชธเซเชเซเชฒเชฐ เชนเซเช เชถเชเซ เชเซ เช เชฅเชตเชพ เชคเซ JSON เชชเชฃ เชนเซเช เชถเชเซ เชเซ. JSON เชจเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช:
bot_config
{
"bot": {
"token": 881hskdfASDA16641,
"name": "Verter"
},
"service": "TG"
}
เชซเชเซเชค เชเชเซเชเชฟเชค เชเซเชจเชพ เชชเชพเชฅเชจเซ เชเชชเชฏเซเช เชเชฐเซ: {{ var.json.bot_config.bot.token }}
.
เชนเซเช เชถเชพเชฌเซเชฆเชฟเช เชฐเซเชคเซ เชเช เชถเชฌเซเชฆ เชเชนเซเชถ เช
เชจเซ เชคเซเชจเชพ เชตเชฟเชถเซ เชเช เชธเซเชเซเชฐเซเชจเชถเซเช เชฌเชคเชพเชตเซเชถ เชเซเชกเชพเชฃเซ. เช
เชนเซเช เชฌเชงเซเช เชชเซเชฐเชพเชฅเชฎเชฟเช เชเซ: เชชเซเชทเซเช เชชเชฐ Admin/Connections
เช
เชฎเซ เชเชจเซเชเซเชถเชจ เชฌเชจเชพเชตเซเช เชเซเช, เชคเซเชฏเชพเช เช
เชฎเชพเชฐเชพ เชฒเซเชเชฟเชจ/เชชเชพเชธเชตเชฐเซเชก เช
เชจเซ เชตเชงเซ เชเซเชเซเชเชธ เชชเชฐเชฟเชฎเชพเชฃเซ เชเชฎเซเชฐเซเช เชเซเช. เชเชจเซ เชเซเชฎ:
เชชเชพเชธเชตเชฐเซเชกเซเชธ เชเชจเชเซเชฐเชฟเชชเซเช เชฅเช เชถเชเซ เชเซ (เชกเชฟเชซเซเชฒเซเช เชเชฐเชคเชพเช เชตเชงเซ เชธเชพเชฐเซ เชฐเซเชคเซ), เช
เชฅเชตเชพ เชคเชฎเซ เชเชจเซเชเซเชถเชจ เชชเซเชฐเชเชพเชฐ เชเซเชกเซ เชถเชเซ เชเซ (เชเซเชฎ เชฎเซเช เชเชฐเซเชฏเซเช tg_main
) - เชนเชเซเชเชค เช เชเซ เชเซ เชเชฐเชซเซเชฒเซ เชฎเซเชกเชฒเซเชธเชฎเชพเช เชชเซเชฐเชเชพเชฐเซเชจเซ เชธเซเชเชฟ เชนเชพเชฐเซเชกเชตเชพเชฏเชฐเซเชก เชเซ เช
เชจเซ เชธเซเชฐเซเชค เชเซเชกเชฎเชพเช เชชเซเชฐเชตเซเชถเซเชฏเชพ เชตเชฟเชจเชพ เชตเชฟเชธเซเชคเซเชค เชเชฐเซ เชถเชเชพเชคเซ เชจเชฅเซ (เชเซ เช
เชเชพเชจเช เชฎเซเช เชเชเชเช Google เชจ เชเชฐเซเชฏเซเช เชนเซเชฏ, เชคเซ เชเซเชชเชพ เชเชฐเซเชจเซ เชฎเชจเซ เชธเซเชงเชพเชฐเซ), เชชเชฐเชเชคเซ เชเชเชเชชเชฃ เช
เชฎเชจเซ เชเซเชฐเซเชกเชฟเช เชฎเซเชณเชตเชตเชพเชฅเซ เชฐเซเชเชถเซ เชจเชนเซเช เชจเชพเชฎ
เชคเชฎเซ เชธเชฎเชพเชจ เชจเชพเชฎ เชธเชพเชฅเซ เชเชฃเชพ เชเซเชกเชพเชฃเซ เชชเชฃ เชฌเชจเชพเชตเซ เชถเชเซ เชเซ: เช เชเชฟเชธเซเชธเชพเชฎเชพเช, เชชเชฆเซเชงเชคเชฟ BaseHook.get_connection()
, เชเซ เช
เชฎเชจเซ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชเซเชกเชพเชฃเซ เชฎเซเชณเชตเซ เชเซ, เชเชชเชถเซ เชฐเซเชจเซเชกเชฎ เชเซเชเชฒเชพเช เชจเชพเชฎเซเชฎเชพเชเชฅเซ (เชฐเชพเชเชจเซเชก เชฐเซเชฌเชฟเชจ เชฌเชจเชพเชตเชตเซเช เชตเชงเซ เชคเชพเชฐเซเชเชฟเช เชนเชถเซ, เชชเชฐเชเชคเซ เชเชพเชฒเซ เชคเซเชจเซ เชเชฐเชซเซเชฒเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพเชเชจเชพ เช
เชเชคเชฐเชพเชคเซเชฎเชพ เชชเชฐ เชเซเชกเซ เชฆเชเช).
เชตเซเชฐเชฟเชฏเซเชฌเชฒเซเชธ เช เชจเซ เชเชจเซเชเซเชถเชจเซเชธ เชเซเชเซเชเชธเชชเชฃเซ เชธเชฐเชธ เชธเชพเชงเชจเซ เชเซ, เชชเชฐเชเชคเซ เชธเชเชคเซเชฒเชจ เชจ เชเซเชฎเชพเชตเชตเซเช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ: เชคเชฎเชพเชฐเชพ เชชเซเชฐเชตเชพเชนเชจเชพ เชเชฏเชพ เชญเชพเชเซ เชคเชฎเซ เชเซเชกเชฎเชพเช เช เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซ เชเซ เช เชจเซ เชธเซเชเซเชฐเซเช เชฎเชพเชเซ เชคเชฎเซ เชเชฐเชซเซเชฒเซเชจเซ เชเชฏเชพ เชญเชพเชเซ เชเชชเซ เชเซ. เชเช เชคเชฐเชซ, UI เชฆเซเชตเชพเชฐเชพ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชฎเซเชเชฒเชฟเชเช เชฌเซเชเซเชธ, เชฎเซเชฒเซเชฏเชจเซ เชเชกเชชเชฅเซ เชฌเชฆเชฒเชตเซเช เช เชจเซเชเซเชณ เชนเซเช เชถเชเซ เชเซ. เชฌเซเชเซ เชฌเชพเชเซ, เช เชนเชเซ เชชเชฃ เชฎเชพเชเชธ เชเซเชฒเชฟเช เชชเชฐเชจเซเช เชตเชณเชคเชฐ เชเซ, เชเซเชฎเชพเชเชฅเซ เชเชชเชฃเซ (เชนเซเช) เชเซเชเชเชพเชฐเซ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเชคเชพ เชนเชคเชพ.
เชเชจเซเชเซเชถเชจเซเชธ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเซเช เช เชเชพเชฐเซเชฏเซเชฎเชพเชเชจเซเช เชเช เชเซ เชนเซเชเซเชธ. เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชเชฐเชซเซเชฒเซ เชนเซเชเซเชธ เชคเซเชจเซ เชคเซเชคเซเชฏ-เชชเชเซเชท เชธเซเชตเชพเช เช
เชจเซ เชชเซเชธเซเชคเชเชพเชฒเชฏเซ เชธเชพเชฅเซ เชเชจเซเชเซเช เชเชฐเชตเชพ เชฎเชพเชเซเชจเชพ เชฌเชฟเชเชฆเซเช เชเซ. เชฆเชพ.เชค. JiraHook
เช
เชฎเชพเชฐเชพ เชฎเชพเชเซ เชเซเชฐเชพ (เชคเชฎเซ เชเชพเชฐเซเชฏเซเชจเซ เชเชเชณ เช
เชจเซ เชชเชพเชเชณ เชเชธเซเชกเซ เชถเชเซ เชเซ) เชธเชพเชฅเซ เชธเชเชชเชฐเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชฒเชพเชฏเชจเซเช เชเซเชฒเชถเซ เช
เชจเซ เชคเซเชจเซ เชฎเชฆเชฆเชฅเซ SambaHook
เชคเชฎเซ เชธเซเชฅเชพเชจเชฟเช เชซเชพเชเชฒ เชชเชฐ เชฆเชฌเชพเชฃ เชเชฐเซ เชถเชเซ เชเซ smb
-เชฌเชฟเชเชฆเซ.
เชเชธเซเชเชฎ เชเชชเชฐเซเชเชฐเชจเซเช เชชเชฆเชเซเชเซเชฆเชจ
เช
เชจเซ เช
เชฎเซ เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชฌเชจเซ เชเซ เชคเซ เชเซเชตเชพเชจเซ เชจเชเซเช เชชเชนเซเชเชเซ เชเชฏเชพ TelegramBotSendMessage
เชเซเชก commons/operators.py
เชตเชพเชธเซเชคเชตเชฟเช เชเชชเชฐเซเชเชฐ เชธเชพเชฅเซ:
from typing import Union
from airflow.operators import BaseOperator
from commons.hooks import TelegramBotHook, TelegramBot
class TelegramBotSendMessage(BaseOperator):
"""Send message to chat_id using TelegramBotHook
Example:
>>> TelegramBotSendMessage(
... task_id='telegram_fail', dag=dag,
... tg_bot_conn_id='tg_bot_default',
... chat_id='{{ var.value.all_the_young_dudes_chat }}',
... message='{{ dag.dag_id }} failed :(',
... trigger_rule=TriggerRule.ONE_FAILED)
"""
template_fields = ['chat_id', 'message']
def __init__(self,
chat_id: Union[int, str],
message: str,
tg_bot_conn_id: str = 'tg_bot_default',
*args, **kwargs):
super().__init__(*args, **kwargs)
self._hook = TelegramBotHook(tg_bot_conn_id)
self.client: TelegramBot = self._hook.client
self.chat_id = chat_id
self.message = message
def execute(self, context):
print(f'Send "{self.message}" to the chat {self.chat_id}')
self.client.send_message(chat_id=self.chat_id,
message=self.message)
เช เชนเซเช, เชเชฐเชซเซเชฒเซเชจเซ เช เชจเซเชฏ เชฆเชฐเซเช เชตเชธเซเชคเซเชจเซ เชเซเชฎ, เชฌเชงเซเช เชเซเชฌ เช เชธเชฐเชณ เชเซ:
- เชชเชพเชธเซเชฅเซ เชตเชพเชฐเชธเชพเชฎเชพเช เชฎเชณเซเชฒ เชเซ
BaseOperator
, เชเซ เชฅเซเชกเซเช เชเชฐเชซเซเชฒเซ-เชตเชฟเชถเชฟเชทเซเช เชตเชธเซเชคเซเชเชจเซ เช เชฎเชฒ เชเชฐเซ เชเซ (เชคเชฎเชพเชฐเซ เชฒเซเชเชฐ เชเซเช) - เชเซเชทเชฟเชค เชเซเชทเซเชคเซเชฐเซ
template_fields
, เชเซเชฎเชพเช เชเซเชจเซเชเชพ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพ เชฎเชพเชเซ เชฎเซเชเซเชฐเซเชจเซ เชถเซเชง เชเชฐเชถเซ. - เชฎเชพเชเซ เชฏเซเชเซเชฏ เชฆเชฒเซเชฒเซ เชเซเช เชตเซ
__init__()
, เชเซเชฏเชพเช เชเชฐเซเชฐเซ เชนเซเชฏ เชคเซเชฏเชพเช เชกเชฟเชซเซเชฒเซเช เชธเซเช เชเชฐเซ. - เช เชฎเซ เชชเซเชฐเซเชตเชเชจเซ เชถเชฐเซเชเชค เชตเชฟเชถเซ เชชเชฃ เชญเซเชฒเซเชฏเชพ เชจเชฅเซ.
- เช
เชจเซเชฐเซเชช เชนเซเช เชเซเชฒเซเชฏเซเช
TelegramBotHook
เชคเซเชฎเชพเชเชฅเซ เชเช เชเซเชฒเชพเชฏเชจเซเช เชเชฌเซเชเซเชเซเช เชฎเซเชณเชตเซเชฏเซ. - เชเชตเชฐเชฐเชพเชเชก (เชชเซเชจเชเชตเซเชฏเชพเชเซเชฏเชพเชฏเชฟเชค) เชชเชฆเซเชงเชคเชฟ
BaseOperator.execute()
, เชเซเชฏเชพเชฐเซ เชเชชเชฐเซเชเชฐเชจเซ เชฒเซเชจเซเช เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชเชตเชถเซ เชคเซเชฏเชพเชฐเซ เชเชฐเชซเซเชต เชเซ เชเซเชตเซเช เชเชฐเชถเซ - เชคเซเชฎเชพเช เช เชฎเซ เชฒเซเช เชเชจ เชเชฐเชตเชพเชจเซเช เชญเซเชฒเซเชจเซ เชฎเซเชเซเชฏ เชเซเชฐเชฟเชฏเชพเชจเซ เช เชฎเชฒเชฎเชพเช เชฎเซเชเซเชถเซเช. (เช เชฎเซ เชฒเซเช เชเชจ เชเชฐเซเช เชเซเช, เชฎเชพเชฐเซเช เชฆเซเชตเชพเชฐเชพ, เชธเซเชงเชพ เชstdout
ะธstderr
- เชเชฐเชซเซเชฒเซ เชฆเชฐเซเช เชตเชธเซเชคเซเชจเซ เช เชเชเชพเชตเชถเซ, เชคเซเชจเซ เชธเซเชเชฆเชฐ เชฐเซเชคเซ เชฒเชชเซเชเซ เชฒเซเชถเซ, เชเซเชฏเชพเช เชเชฐเซเชฐเซ เชนเซเชฏ เชคเซเชฏเชพเช เชคเซเชจเซ เชตเชฟเชเชเชฟเชค เชเชฐเชถเซ.)
เชเชพเชฒเซ เชเซเชเช เชเซ เชเชชเชฃเซ เชชเชพเชธเซ เชถเซเช เชเซ commons/hooks.py
. เชซเชพเชเชฒเชจเซ เชชเซเชฐเชฅเชฎ เชญเชพเช, เชนเซเช เชธเชพเชฅเซ เช:
from typing import Union
from airflow.hooks.base_hook import BaseHook
from requests_toolbelt.sessions import BaseUrlSession
class TelegramBotHook(BaseHook):
"""Telegram Bot API hook
Note: add a connection with empty Conn Type and don't forget
to fill Extra:
{"bot_token": "YOuRAwEsomeBOtToKen"}
"""
def __init__(self,
tg_bot_conn_id='tg_bot_default'):
super().__init__(tg_bot_conn_id)
self.tg_bot_conn_id = tg_bot_conn_id
self.tg_bot_token = None
self.client = None
self.get_conn()
def get_conn(self):
extra = self.get_connection(self.tg_bot_conn_id).extra_dejson
self.tg_bot_token = extra['bot_token']
self.client = TelegramBot(self.tg_bot_token)
return self.client
เชฎเชจเซ เช เชนเซเช เชถเซเช เชธเชฎเชเชพเชตเชตเซเช เชคเซ เชชเชฃ เชเชฌเชฐ เชจเชฅเซ, เชนเซเช เชซเชเซเชค เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชฎเซเชฆเซเชฆเชพเช เชจเซเชเชงเซเชถ:
- เช
เชฎเซ เชตเชพเชฐเชธเชพเชฎเชพเช เชเซเช, เชฆเชฒเซเชฒเซ เชตเชฟเชถเซ เชตเชฟเชเชพเชฐเซ - เชฎเซเชเชพเชญเชพเชเชจเชพ เชเชฟเชธเซเชธเชพเชเชฎเชพเช เชคเซ เชเช เชนเชถเซ:
conn_id
; - เชฎเชพเชจเช เชชเชฆเซเชงเชคเชฟเชเชจเซ เชเชตเชฐเชฐเชพเชเชกเชฟเชเช: เชฎเซเช เชฎเชพเชฐเซ เชเชพเชคเชจเซ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชฐเซ เชเซ
get_conn()
, เชเซเชฎเชพเช เชฎเชจเซ เชจเชพเชฎ เชฆเซเชตเชพเชฐเชพ เชเชจเซเชเซเชถเชจ เชชเซเชฐเชพเชฎเซเชเชฐ เชฎเชณเซ เชเซ เช เชจเซ เชฎเชพเชคเซเชฐ เชตเชฟเชญเชพเช เชฎเชณเซ เชเซextra
(เช เชเช JSON เชซเซเชฒเซเชก เชเซ), เชเซเชฎเชพเช เชฎเซเช (เชฎเชพเชฐเซ เชชเซเชคเชพเชจเซ เชธเซเชเชจเชพเช เช เชจเซเชธเชพเชฐ!) เชเซเชฒเชฟเชเซเชฐเชพเชฎ เชฌเซเช เชเซเชเชจ เชฎเซเชเซเชฏเซเช เชเซ:{"bot_token": "YOuRAwEsomeBOtToKen"}
. - เชนเซเช เช
เชฎเชพเชฐเชพ เชเช เชเชฆเชพเชนเชฐเชฃ เชฌเชจเชพเชตเซ
TelegramBot
, เชคเซเชจเซ เชเซเชเซเชเชธ เชเซเชเชจ เชเชชเซเชจเซ.
เชฌเชธ เชเชเชฒเซเช เช. เชคเชฎเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชนเซเชเชฎเชพเชเชฅเซ เชเซเชฒเชพเชฏเชเช เชฎเซเชณเชตเซ เชถเชเซ เชเซ TelegramBotHook().clent
เช
เชฅเชตเชพ TelegramBotHook().get_conn()
.
เช
เชจเซ เชซเชพเชเชฒเชจเซ เชฌเซเชเซ เชญเชพเช, เชเซเชฎเชพเช เชนเซเช เชเซเชฒเชฟเชเซเชฐเชพเชฎ REST API เชฎเชพเชเซ เชฎเชพเชเชเซเชฐเซเชฐเซเชชเชฐ เชฌเชจเชพเชตเซเช เชเซเช, เชเซเชฅเซ เชคเซเชจเซ เชเซเชเชเซ เชจ เชถเชเชพเชฏ. python-telegram-bot
sendMessage
.
class TelegramBot:
"""Telegram Bot API wrapper
Examples:
>>> TelegramBot('YOuRAwEsomeBOtToKen', '@myprettydebugchat').send_message('Hi, darling')
>>> TelegramBot('YOuRAwEsomeBOtToKen').send_message('Hi, darling', chat_id=-1762374628374)
"""
API_ENDPOINT = 'https://api.telegram.org/bot{}/'
def __init__(self, tg_bot_token: str, chat_id: Union[int, str] = None):
self._base_url = TelegramBot.API_ENDPOINT.format(tg_bot_token)
self.session = BaseUrlSession(self._base_url)
self.chat_id = chat_id
def send_message(self, message: str, chat_id: Union[int, str] = None):
method = 'sendMessage'
payload = {'chat_id': chat_id or self.chat_id,
'text': message,
'parse_mode': 'MarkdownV2'}
response = self.session.post(method, data=payload).json()
if not response.get('ok'):
raise TelegramBotException(response)
class TelegramBotException(Exception):
def __init__(self, *args, **kwargs):
super().__init__((args, kwargs))
เชธเชพเชเซ เชฐเซเชค เช เชเซ เชเซ เชคเซ เชฌเชงเซเช เชเชฎเซเชฐเชตเซเช:
TelegramBotSendMessage
,TelegramBotHook
,TelegramBot
- เชชเซเชฒเชเชเชจเชฎเชพเช, เชธเชพเชฐเซเชตเชเชจเชฟเช เชฐเชฟเชชเซเชเซเชเชฐเซเชฎเชพเช เชฎเซเชเซ เช เชจเซ เชคเซเชจเซ เชเชชเชจ เชธเซเชฐเซเชธเชจเซ เชเชชเซ.
เชเซเชฏเชพเชฐเซ เช เชฎเซ เช เชฌเชงเซเช เช เชญเซเชฏเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเชพ เชนเชคเชพ, เชคเซเชฏเชพเชฐเซ เช เชฎเชพเชฐเชพ เชฐเชฟเชชเซเชฐเซเช เช เชชเชกเซเชเซเชธ เชธเชซเชณเชคเชพเชชเซเชฐเซเชตเช เชจเชฟเชทเซเชซเชณ เชฅเชตเชพเชฎเชพเช เชตเซเชฏเชตเชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเชพ เช เชจเซ เชฎเชจเซ เชเซเชจเชฒเชฎเชพเช เชเช เชญเซเชฒ เชธเชเชฆเซเชถ เชฎเซเชเชฒเซเชฏเซ. เชนเซเช เชคเชชเชพเชธ เชเชฐเซเชถ เชเซ เชถเซเช เชคเซ เชเซเชเซเช เชเซ...
เช
เชฎเชพเชฐเชพ เชกเซเชเชฎเชพเช เชเชเชเช เชคเซเชเซ เชเชฏเซเช! เชถเซเช เชเชชเชฃเซ เชเชตเซ เช เช
เชชเซเชเซเชทเชพ เชฐเชพเชเชคเชพ เชจเชฅเซ? เชฌเชฐเชพเชฌเชฐ!
เชถเซเช เชคเชฎเซ เชฐเซเชกเชตเชพเชจเชพ เชเซ?
เชถเซเช เชคเชฎเชจเซ เชฒเชพเชเซ เชเซ เชเซ เชนเซเช เชเชเชเช เชเซเชเซ เชเชฏเซ เชเซเช? เชเชตเซเช เชฒเชพเชเซ เชเซ เชเซ เชคเซเชฃเซ เชเชธเชเซเชฏเซเชเชฒ เชธเชฐเซเชตเชฐเชฅเซ เชตเชฐเซเชเชฟเชเชพเชฎเชพเช เชกเซเชเชพ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเชฐเชตเชพเชจเซเช เชตเชเชจ เชเชชเซเชฏเซเช เชนเชคเซเช, เช เชจเซ เชชเชเซ เชคเซเชฃเซ เชคเซ เชฒเซเชงเซเช เช เชจเซ เชตเชฟเชทเชฏ, เชฌเชฆเชฎเชพเชถเซเชจเซ เชเซเชกเซ เชฆเซเชงเซ!
เช เช เชคเซเชฏเชพเชเชพเชฐ เชเชฐเชพเชฆเชพเชชเซเชฐเซเชตเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ, เชฎเชพเชฐเซ เชคเชฎเชพเชฐเชพ เชฎเชพเชเซ เชเซเชเชฒเซเช เชชเชฐเชฟเชญเชพเชทเชพ เชธเชฎเชเชตเชพเชจเซ เชนเชคเซ. เชนเชตเซ เชคเชฎเซ เชตเชงเซ เชเชเชณ เชตเชงเซ เชถเชเซ เชเซ.
เช เชฎเชพเชฐเซ เชฏเซเชเชจเชพ เช เชนเชคเซ:
- เชกเซเช เชเชฐเซ
- เชเชพเชฐเซเชฏเซ เชฌเชจเชพเชตเซ
- เชเซเช เชเซ เชฌเชงเซเช เชเซเชเชฒเซเช เชธเซเชเชฆเชฐ เชเซ
- เชญเชฐเชตเชพ เชฎเชพเชเซ เชธเชคเซเชฐ เชจเชเชฌเชฐเซ เชธเซเชเชชเซ
- SQL เชธเชฐเซเชตเชฐเชฎเชพเชเชฅเซ เชกเซเชเชพ เชฎเซเชณเชตเซ
- เชตเชฐเซเชเชฟเชเชพเชฎเชพเช เชกเซเชเชพ เชฎเซเชเซ
- เชเชเชเชกเชพ เชเชเชคเซเชฐเชฟเชค เชเชฐเซ
เชคเซเชฅเซ, เช เชฌเชงเซเช เชฎเซเชณเชตเชตเชพ เช
เชจเซ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ, เชฎเซเช เช
เชฎเชพเชฐเชพเชฎเชพเช เชเช เชจเชพเชจเซ เชเชฎเซเชฐเซ เชเชฐเซเชฏเซ docker-compose.yml
:
docker-compose.db.yml
version: '3.4'
x-mssql-base: &mssql-base
image: mcr.microsoft.com/mssql/server:2017-CU21-ubuntu-16.04
restart: always
environment:
ACCEPT_EULA: Y
MSSQL_PID: Express
SA_PASSWORD: SayThanksToSatiaAt2020
MSSQL_MEMORY_LIMIT_MB: 1024
services:
dwh:
image: jbfavre/vertica:9.2.0-7_ubuntu-16.04
mssql_0:
<<: *mssql-base
mssql_1:
<<: *mssql-base
mssql_2:
<<: *mssql-base
mssql_init:
image: mio101/py3-sql-db-client-base
command: python3 ./mssql_init.py
depends_on:
- mssql_0
- mssql_1
- mssql_2
environment:
SA_PASSWORD: SayThanksToSatiaAt2020
volumes:
- ./mssql_init.py:/mssql_init.py
- ./dags/commons/datasources.py:/commons/datasources.py
เชคเซเชฏเชพเช เชเชชเชฃเซ เชเชญเชพ เชเชฐเซเช เชเซเช:
- เชฏเชเชฎเชพเชจ เชคเชฐเซเชเซ เชตเชฐเซเชเซเชเชพ
dwh
เชธเซเชฅเซ เชฎเซเชณเชญเซเชค เชธเซเชเชฟเชเชเซเชธ เชธเชพเชฅเซ, - SQL เชธเชฐเซเชตเชฐเชจเชพ เชคเซเชฐเชฃ เชเชฆเชพเชนเชฐเชฃเซ,
- เช
เชฎเซ เชชเชเซเชจเชพ เชกเซเชเชพเชฌเซเชธเซเชธเชจเซ เชเซเชเชฒเชพเช เชกเซเชเชพ เชธเชพเชฅเซ เชญเชฐเซเช เชเซเช (เชเซเชเชชเชฃ เชเชฟเชธเซเชธเชพเชฎเชพเช เชคเชชเชพเชธ เชเชฐเชถเซ เชจเชนเซเช
mssql_init.py
!)
เช เชฎเซ เชเซเชฒเซเชฒเซ เชตเชเชค เชเชฐเชคเชพเช เชธเชนเซเช เชตเชงเซ เชเชเชฟเชฒ เชเชฆเซเชถเชจเซ เชฎเชฆเชฆเชฅเซ เชคเชฎเชพเชฎ เชธเชพเชฐเชพเชจเซ เชฒเซเชจเซเช เชเชฐเซเช เชเซเช:
$ docker-compose -f docker-compose.yml -f docker-compose.db.yml up --scale worker=3
เช
เชฎเชพเชฐเชพ เชเชฎเชคเซเชเชพเชฐ เชฐเซเชจเซเชกเชฎเชพเชเชเชฐเซ เชถเซเช เชฌเชจเชพเชตเซเชฏเซเช เชเซ, เชคเชฎเซ เชเชเชเชฎเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ Data Profiling/Ad Hoc Query
:
เชฎเซเชเซเชฏ เชตเชธเซเชคเซ เชคเซเชจเซ เชตเชฟเชถเซเชฒเซเชทเชเซเชจเซ เชฌเชคเชพเชตเชตเชพเชจเซ เชจเชฅเซ
เชตเชฟเชธเซเชคเซเชค เชเชฐเซ ETL เชธเชคเซเชฐเซ เชนเซเช เชจเชนเซเช เชเชฐเซเช, เชคเซเชฏเชพเช เชฌเชงเซเช เชคเซเชเซเช เชเซ: เช เชฎเซ เชเช เชเชงเชพเชฐ เชฌเชจเชพเชตเซเช เชเซเช, เชคเซเชฎเชพเช เชเช เชเชฟเชนเซเชจ เชเซ, เช เชฎเซ เชธเชเชฆเชฐเซเชญ เชฎเซเชจเซเชเชฐ เชธเชพเชฅเซ เชฌเชงเซเช เชฒเชชเซเชเซเช เชเซเช, เช เชจเซ เชนเชตเซ เช เชฎเซ เช เชเชฐเซเช เชเซเช:
with Session(task_name) as session:
print('Load', session.id, 'started')
# Load worflow
...
session.successful = True
session.loaded_rows = 15
session.py
from sys import stderr
class Session:
"""ETL workflow session
Example:
with Session(task_name) as session:
print(session.id)
session.successful = True
session.loaded_rows = 15
session.comment = 'Well done'
"""
def __init__(self, connection, task_name):
self.connection = connection
self.connection.autocommit = True
self._task_name = task_name
self._id = None
self.loaded_rows = None
self.successful = None
self.comment = None
def __enter__(self):
return self.open()
def __exit__(self, exc_type, exc_val, exc_tb):
if any(exc_type, exc_val, exc_tb):
self.successful = False
self.comment = f'{exc_type}: {exc_val}n{exc_tb}'
print(exc_type, exc_val, exc_tb, file=stderr)
self.close()
def __repr__(self):
return (f'<{self.__class__.__name__} '
f'id={self.id} '
f'task_name="{self.task_name}">')
@property
def task_name(self):
return self._task_name
@property
def id(self):
return self._id
def _execute(self, query, *args):
with self.connection.cursor() as cursor:
cursor.execute(query, args)
return cursor.fetchone()[0]
def _create(self):
query = """
CREATE TABLE IF NOT EXISTS sessions (
id SERIAL NOT NULL PRIMARY KEY,
task_name VARCHAR(200) NOT NULL,
started TIMESTAMPTZ NOT NULL DEFAULT current_timestamp,
finished TIMESTAMPTZ DEFAULT current_timestamp,
successful BOOL,
loaded_rows INT,
comment VARCHAR(500)
);
"""
self._execute(query)
def open(self):
query = """
INSERT INTO sessions (task_name, finished)
VALUES (%s, NULL)
RETURNING id;
"""
self._id = self._execute(query, self.task_name)
print(self, 'opened')
return self
def close(self):
if not self._id:
raise SessionClosedError('Session is not open')
query = """
UPDATE sessions
SET
finished = DEFAULT,
successful = %s,
loaded_rows = %s,
comment = %s
WHERE
id = %s
RETURNING id;
"""
self._execute(query, self.successful, self.loaded_rows,
self.comment, self.id)
print(self, 'closed',
', successful: ', self.successful,
', Loaded: ', self.loaded_rows,
', comment:', self.comment)
class SessionError(Exception):
pass
class SessionClosedError(SessionError):
pass
เชธเชฎเชฏ เชเชตเซ เชเชฏเซ เชเซ เช เชฎเชพเชฐเซ เชกเซเชเชพ เชเชเชคเซเชฐเชฟเชค เชเชฐเซ เช เชฎเชพเชฐเชพ เชฆเซเชขเชธเซ เชเซเชฌเชฒเชฎเชพเชเชฅเซ. เชเชพเชฒเซ เช เชเซเชฌ เช เช เชญเซเชคเชชเซเชฐเซเชต เชฐเซเชเชพเชเชจเซ เชฎเชฆเชฆเชฅเซ เชเชฐเซเช:
source_conn = MsSqlHook(mssql_conn_id=src_conn_id, schema=src_schema).get_conn()
query = f"""
SELECT
id, start_time, end_time, type, data
FROM dbo.Orders
WHERE
CONVERT(DATE, start_time) = '{dt}'
"""
df = pd.read_sql_query(query, source_conn)
- เชนเซเชเชจเซ เชฎเชฆเชฆเชฅเซ เชเชชเชฃเซ เชเชฐเชซเซเชฒเซเชฎเชพเชเชฅเซ เชฎเซเชณเชตเซเช เชเซเช
pymssql
-เชเซเชกเชพเชตเชพ - เชเชพเชฒเซ เชตเชฟเชจเชเชคเซเชฎเชพเช เชคเชพเชฐเซเชเชจเชพ เชธเซเชตเชฐเซเชชเชฎเชพเช เชชเซเชฐเชคเชฟเชฌเชเชงเชจเซ เชฌเชฆเชฒเซเช - เชคเซ เชเซเชฎเซเชชเชฒเซเช เชเชจเซเชเชฟเชจ เชฆเซเชตเชพเชฐเชพ เชเชพเชฐเซเชฏเชฎเชพเช เชจเชพเชเชตเชพเชฎเชพเช เชเชตเชถเซ.
- เช
เชฎเชพเชฐเซ เชตเชฟเชจเชเชคเซเชจเซ เชเซเชฐเชพเช เชเชชเชตเซ
pandas
เช เชฎเชจเซ เชเซเชฃ เชฎเชณเชถเซDataFrame
- เชคเซ เชญเชตเชฟเชทเซเชฏเชฎเชพเช เชเชชเชฃเชพ เชฎเชพเชเซ เชเชชเชฏเซเชเซ เชฅเชถเซ.
เชนเซเช เช เชตเซเชเซเชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช
{dt}
เชตเชฟเชจเชเชคเซ เชชเชฐเชฟเชฎเชพเชฃเชจเซ เชฌเชฆเชฒเซ%s
เชเชเชฒเชพ เชฎเชพเชเซ เชจเชนเซเช เชเซ เชนเซเช เชฆเซเชทเซเช เชชเชฟเชจเซเชเชฟเช เชเซเช, เชชเชฃ เชเชเชฒเชพ เชฎเชพเชเซpandas
เชธเชเชญเชพเชณเซ เชถเชเชคเชพ เชจเชฅเซpymssql
เช เชจเซ เชเซเชฒเซเชฒเชพ เชเช เชธเชฐเชเซ เชเชพเชฏ เชเซparams: List
เชเซเชเซ เชคเซ เชเชฐเซเชเชฐ เชเชเซเชเซ เชเซtuple
.
เช เชชเชฃ เชจเซเชเชง เชเชฐเซ เชเซ เชตเชฟเชเชพเชธเชเชฐเซเชคเชพpymssql
เชนเชตเซ เชคเซเชจเซ เชเซเชเซ เชจ เชเชชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช, เช เชจเซ เชคเซ เชฌเชนเชพเชฐ เชเชตเชพเชจเซ เชธเชฎเชฏ เชเซpyodbc
.
เชเชพเชฒเซ เชเซเชเช เชเซ เชเชฐเชซเซเชฒเซเช เช เชฎเชพเชฐเชพ เชเชพเชฐเซเชฏเซเชจเซ เชฆเชฒเซเชฒเซ เชถเซเช เชญเชฐเซเชฒเซ เชเซ:
เชเซ เชคเซเชฏเชพเช เชเซเช เชกเซเชเชพ เชจเชฅเซ, เชคเซ เชชเชเซ เชเชพเชฒเซ เชฐเชพเชเชตเชพเชจเซ เชเซเช เช เชฐเซเชฅ เชจเชฅเซ. เชชเชฐเชเชคเซ เชญเชฐเชฃเชจเซ เชธเชซเชณ เชเชฃเชตเซเช เชชเชฃ เชตเชฟเชเชฟเชคเซเชฐ เชเซ. เชชเชฐเชเชคเซ เช เชเซเช เชญเซเชฒ เชจเชฅเซ. เช-เชเชน-เชเชน, เชถเซเช เชเชฐเชตเซเช ?! เช เชจเซ เช เชนเซเช เชถเซเช เชเซ:
if df.empty:
raise AirflowSkipException('No rows to load')
AirflowSkipException
เชเชฐเชซเซเชฒเซเชจเซ เชเชนเซ เชเซ เชเซ เชคเซเชฏเชพเช เชเซเช เชญเซเชฒเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เช
เชฎเซ เชเชพเชฐเซเชฏ เชเซเชกเซ เชฆเชเช เชเซเช. เชเชจเซเชเชฐเชซเซเชธเชฎเชพเช เชฒเซเชฒเซ เช
เชฅเชตเชพ เชฒเชพเชฒ เชเซเชฐเชธ เชจเชนเซเช, เชชเชฐเชเชคเซ เชเซเชฒเชพเชฌเซ เชนเชถเซ.
เชเชพเชฒเซ เชเชชเชฃเซ เชกเซเชเชพ เชเซเชธ เชเชฐเซเช เชฌเชนเซเชตเชฟเชง เชเซเชฒเชฎ:
df['etl_source'] = src_schema
df['etl_id'] = session.id
df['hash_id'] = hash_pandas_object(df[['etl_source', 'id']])
เชจเชพเชฎ:
- เชกเซเชเชพเชฌเซเช เชเซเชฎเชพเชเชฅเซ เช เชฎเซ เชเชฐเซเชกเชฐ เชฒเซเชงเซ เชนเชคเซ,
- เช เชฎเชพเชฐเชพ เชชเซเชฐ เชธเชคเซเชฐเชจเซเช ID (เชคเซ เช เชฒเช เชนเชถเซ เชฆเชฐเซเช เชเชพเชฐเซเชฏ เชฎเชพเชเซ),
- เชธเซเชคเซเชฐเซเชค เช เชจเซ เชเชฐเซเชกเชฐ ID เชฎเชพเชเชฅเซ เชนเซเชถ - เชเซเชฅเซ เชเชฐเซเชจเซ เช เชเชคเชฟเชฎ เชกเซเชเชพเชฌเซเชเชฎเชพเช (เชเซเชฏเชพเช เชฌเชงเซเช เชเช เชเซเชฌเชฒเชฎเชพเช เชฐเซเชกเชตเชพเชฎเชพเช เชเชตเซ เชเซ) เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชเช เช เชจเชจเซเชฏ เชเชฐเซเชกเชฐ ID เชเซ.
เช เชเชคเชฟเชฎ เชชเชเชฒเซเช เชฌเชพเชเซ เชเซ: เชตเชฐเซเชเชฟเชเชพเชฎเชพเช เชฌเชงเซเช เชฐเซเชกเชตเซเช. เช เชจเซ, เชตเชฟเชเชฟเชคเซเชฐ เชฐเซเชคเซ, เช เชเชฐเชตเชพ เชฎเชพเชเซเชจเซ เชธเซเชฅเซ เช เชฆเชญเซเชค เช เชจเซ เชเชพเชฐเซเชฏเชเซเชทเชฎ เชฐเซเชคเซเชฎเชพเชเชจเซ เชเช CSV เชฆเซเชตเชพเชฐเชพ เชเซ!
# Export data to CSV buffer
buffer = StringIO()
df.to_csv(buffer,
index=False, sep='|', na_rep='NUL', quoting=csv.QUOTE_MINIMAL,
header=False, float_format='%.8f', doublequote=False, escapechar='\')
buffer.seek(0)
# Push CSV
target_conn = VerticaHook(vertica_conn_id=target_conn_id).get_conn()
copy_stmt = f"""
COPY {target_table}({df.columns.to_list()})
FROM STDIN
DELIMITER '|'
ENCLOSED '"'
ABORT ON ERROR
NULL 'NUL'
"""
cursor = target_conn.cursor()
cursor.copy(copy_stmt, buffer)
- เช
เชฎเซ เชเช เชเชพเชธ เชฐเซเชธเซเชตเชฐ เชฌเชจเชพเชตเซ เชฐเชนเซเชฏเชพ เชเซเช
StringIO
. pandas
เชเซเชชเชพ เชเชฐเซเชจเซ เช เชฎเชพเชฐเชพ เชฎเซเชเชตเชพเชฎเชพเช เชเชตเชถเซDataFrame
เชซเซเชฐเซเชฎเชฎเชพเชCSV
-เชฒเชพเชเชจเซเชธ.- เชเชพเชฒเซ เชนเซเช เชตเชกเซ เช เชฎเชพเชฐเชพ เชฎเชจเชชเชธเชเชฆ เชตเชฐเซเชเชฟเชเชพเชจเซ เชเชจเซเชเซเชถเชจ เชเซเชฒเซเช.
- เช
เชจเซ เชนเชตเซ เชฎเชฆเชฆ เชธเชพเชฅเซ
copy()
เช เชฎเชพเชฐเซ เชกเซเชเชพ เชธเซเชงเซ เชตเชฐเซเชเชฟเชเชพเชฎเชพเช เชฎเซเชเชฒเซ!
เช เชฎเซ เชกเซเชฐเชพเชเชตเชฐ เชชเชพเชธเซเชฅเซ เชฒเชเชถเซเช เชเซ เชเซเชเชฒเซ เชฒเชพเชเชจเซ เชญเชฐเชพเช เชเซ, เช เชจเซ เชธเซเชถเชจ เชฎเซเชจเซเชเชฐเชจเซ เชเชนเซเชถเซเช เชเซ เชฌเชงเซเช เชฌเชฐเชพเชฌเชฐ เชเซ:
session.loaded_rows = cursor.rowcount
session.successful = True
เชฌเชธ เชเชเชฒเซเช เช.
เชตเซเชเชพเชฃ เชชเชฐ, เช เชฎเซ เชฒเชเซเชทเซเชฏ เชชเซเชฒเซเช เชเชพเชคเซ เชฌเชจเชพเชตเซเช เชเซเช. เช เชนเซเช เชฎเซเช เชฎเชพเชฐเซ เชเชพเชคเชจเซ เชเช เชจเชพเชจเซ เชฎเชถเซเชจเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ:
create_schema_query = f'CREATE SCHEMA IF NOT EXISTS {target_schema};'
create_table_query = f"""
CREATE TABLE IF NOT EXISTS {target_schema}.{target_table} (
id INT,
start_time TIMESTAMP,
end_time TIMESTAMP,
type INT,
data VARCHAR(32),
etl_source VARCHAR(200),
etl_id INT,
hash_id INT PRIMARY KEY
);"""
create_table = VerticaOperator(
task_id='create_target',
sql=[create_schema_query,
create_table_query],
vertica_conn_id=target_conn_id,
task_concurrency=1,
dag=dag)
เชนเซเช เชตเชพเชชเชฐเซเช เชเซเช
VerticaOperator()
เชนเซเช เชกเซเชเชพเชฌเซเช เชธเซเชเซเชฎเชพ เช เชจเซ เชเซเชฌเชฒ เชฌเชจเชพเชตเซเช เชเซเช (เชเซ เชคเซ เชชเชนเซเชฒเชพเชฅเซ เช เชธเซเชคเชฟเชคเซเชตเชฎเชพเช เชจเชฅเซ, เช เชฒเชฌเชคเซเชค). เชฎเซเชเซเชฏ เชตเชธเซเชคเซ เชจเชฟเชฐเซเชญเชฐเชคเชพเชจเซ เชฏเซเชเซเชฏ เชฐเซเชคเซ เชเซเช เชตเชตเชพเชจเซเช เชเซ:
for conn_id, schema in sql_server_ds:
load = PythonOperator(
task_id=schema,
python_callable=workflow,
op_kwargs={
'src_conn_id': conn_id,
'src_schema': schema,
'dt': '{{ ds }}',
'target_conn_id': target_conn_id,
'target_table': f'{target_schema}.{target_table}'},
dag=dag)
create_table >> load
เชเชเชคเซเชฐ เชเชฐเชตเซเช
- เชธเชพเชฐเซเช, - เชจเชพเชจเชพ เชเชเชฆเชฐเซ เชเชนเซเชฏเซเช, - เชคเซ เชนเชตเซ เชจเชฅเซ
เชถเซเช เชคเชฎเชจเซ เชเชพเชคเชฐเซ เชเซ เชเซ เชนเซเช เชเชเชเชฒเชจเซ เชธเซเชฅเซ เชญเชฏเชเชเชฐ เชชเซเชฐเชพเชฃเซ เชเซเช?
เชเซเชฒเชฟเชฏเชพ เชกเซเชจเชพเชฒเซเชกเชธเชจ, เชง เชเซเชฐเซเชซเชพเชฒเซ
เชฎเชจเซ เชฒเชพเชเซ เชเซ เชเซ เชเซ เชฎเชพเชฐเชพ เชธเชพเชฅเซเชฆเชพเชฐเซ เช เชจเซ เชฎเชพเชฐเซ เชตเชเซเชเซ เชธเซเชชเชฐเซเชงเชพ เชนเซเชฏ: เชเซเชฃ เชเชกเชชเชฅเซ เชถเชฐเซเชเชคเชฅเซ ETL เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชฌเชจเชพเชตเชถเซ เช เชจเซ เชฒเซเชจเซเช เชเชฐเชถเซ: เชคเซเช เชคเซเชฎเชจเชพ SSIS เช เชจเซ เชฎเชพเชเชธ เชธเชพเชฅเซ เช เชจเซ เชนเซเช เชเชฐเชซเซเชฒเซ เชธเชพเชฅเซ... เช เชจเซ เชชเชเซ เช เชฎเซ เชเชพเชณเชตเชฃเซเชจเซ เชธเชฐเชณเชคเชพเชจเซ เชชเชฃ เชคเซเชฒเชจเชพ เชเชฐเซเชถเซเช ... เชตเชพเชน, เชฎเชจเซ เชฒเชพเชเซ เชเซ เชเซ เชคเชฎเซ เชธเชเชฎเชค เชฅเชถเซ เชเซ เชนเซเช เชคเซเชฎเชจเซ เชคเชฎเชพเชฎ เชฎเซเชฐเชเซ เชนเชฐเชพเชตเซเชถ!
เชเซ เชฅเซเชกเซ เชตเชงเซ เชเชเชญเซเชฐเชคเชพเชฅเซ, เชคเซ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ - เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเซเชกเชจเชพ เชฐเซเชชเชฎเชพเช เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเซเชจเซ - เชฎเชพเชฐเซเช เชเชพเชฎ เชเชฐเซเชฏเซเช เชเชฃเซเช เชตเชงเซ เชเชฐเชพเชฎเชฆเชพเชฏเช เช เชจเซ เชเชจเชเชฆเชชเซเชฐเชฆ.
เชคเซเชจเซ เช เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชเชเซเชธเซเชเซเชจเซเชธเชฟเชฌเชฟเชฒเชฟเชเซ, เชชเซเชฒเช-เชเชจเซเชธเชจเซ เชฆเซเชฐเชทเซเชเชฟเช เช เชจเซ เชฎเชพเชชเชจเซเชฏเชคเชพเชจเชพ เชตเชฒเชฃ เชฌเชเชจเซเชฎเชพเช, เชคเชฎเชจเซ เชฒเชเชญเช เชเซเชเชชเชฃ เชเซเชทเซเชคเซเชฐเชฎเชพเช เชเชฐเชซเซเชฒเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชคเช เชเชชเซ เชเซ: เชกเซเชเชพ เชเชเชคเซเชฐเชฟเชค เชเชฐเชตเชพ, เชคเซเชฏเชพเชฐ เชเชฐเชตเชพ เช เชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเชพ เชธเชเชชเซเชฐเซเชฃ เชเชเซเชฐเชฎเชพเช เชชเชฃ, เชฐเซเชเซเช เชฒเซเชจเซเช เชเชฐเชตเชพเชฎเชพเช เชชเชฃ (เชฎเชเชเชณ เชชเชฐ, เชเซเชฐเซเชธ).
เชญเชพเช เช เชเชคเชฟเชฎ, เชธเชเชฆเชฐเซเชญ เช เชจเซ เชฎเชพเชนเชฟเชคเซ
เชฆเชพเชเชคเซ เช เชฎเซ เชคเชฎเชพเชฐเชพ เชฎเชพเชเซ เชเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ
start_date
. เชนเชพ, เช เชชเชนเซเชฒเซเชฅเซ เช เชธเซเชฅเชพเชจเชฟเช เชฎเซเชฎ เชเซ. เชตเชพเชฏเชพ เชกเซเชเชจเซ เชฎเซเชเซเชฏ เชฆเชฒเซเชฒstart_date
เชฌเชงเชพ เชชเชพเชธ. เชธเชเชเซเชทเชฟเชชเซเชคเชฎเชพเช, เชเซ เชคเชฎเซ เชธเซเชชเชทเซเช เชเชฐเซ เชเซstart_date
เชตเชฐเซเชคเชฎเชพเชจ เชคเชพเชฐเซเช, เช เชจเซschedule_interval
- เชเช เชฆเชฟเชตเชธ, เชชเชเซ เชกเซเชเชเซ เชเชพเชฒเซ เชถเชฐเซ เชฅเชถเซ, เชตเชนเซเชฒเซเช เชจเชนเซเช.start_date = datetime(2020, 7, 7, 0, 1, 2)
เช เชจเซ เชเซเช เชตเชงเซ เชธเชฎเชธเซเชฏเชพ เชจเชฅเซ.
เชคเซเชจเซ เชธเชพเชฅเซ เชธเชเชเชณเชพเชฏเซเชฒ เชฌเซเชเซ เชฐเชจเชเชพเชเชฎ เชญเซเชฒ เชเซ:
Task is missing the start_date parameter
, เชเซ เชฎเซเชเซ เชญเชพเชเซ เชธเซเชเชตเซ เชเซ เชเซ เชคเชฎเซ เชกเซเช เชเชชเชฐเซเชเชฐ เชธเชพเชฅเซ เชเซเชกเชตเชพเชจเซเช เชญเซเชฒเซ เชเชฏเชพ เชเซ.- เชฌเชงเชพ เชเช เชฎเชถเซเชจ เชชเชฐ. เชนเชพ, เช เชจเซ เชชเชพเชฏเชพ (เชเชฐเชซเซเชฒเซ เชชเซเชคเซ เช เชจเซ เช เชฎเชพเชฐเซเช เชเซเชเชฟเชเช), เช เชจเซ เชตเซเชฌ เชธเชฐเซเชตเชฐ, เช เชจเซ เชถเซเชกเซเชฏเซเชฒเชฐ เช เชจเซ เชเชพเชฎเชฆเชพเชฐเซ. เช เชจเซ เชคเซ เชเชพเชฎ เชชเชฃ เชเชฐเซเชฏเซเช. เชชเชฐเชเชคเซ เชธเชฎเชฏ เชเชคเชพเช, เชธเซเชตเชพเช เชฎเชพเชเซเชจเชพ เชเชพเชฐเซเชฏเซเชจเซ เชธเชเชเซเชฏเชพเชฎเชพเช เชตเชงเชพเชฐเซ เชฅเชคเซ เชเชฏเซ, เช เชจเซ เชเซเชฏเชพเชฐเซ PostgreSQL เช 20 ms เชจเซ เชฌเชฆเชฒเซ 5 s เชฎเชพเช เช เชจเซเชเซเชฐเชฎเชฃเชฟเชเชพเชจเซ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชเชชเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซเชฏเซเช, เชคเซเชฏเชพเชฐเซ เช เชฎเซ เชคเซเชจเซ เชฒเช เชฒเซเชงเซเช เช เชจเซ เชฒเช เชเชฏเชพ.
- LocalExecutor. เชนเชพ, เช เชฎเซ เชนเชเซ เชชเชฃ เชคเซเชจเชพ เชชเชฐ เชฌเซเช เชพ เชเซเช, เช เชจเซ เช เชฎเซ เชชเชนเซเชฒเซเชฅเซ เช เชชเชพเชคเชพเชณเชจเซ เชงเชพเชฐ เชชเชฐ เชเชตเซ เชเชฏเชพ เชเซเช. LocalExecutor เช เชคเซเชฏเชพเชฐ เชธเซเชงเซ เช เชฎเชพเชฐเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซเช เชนเชคเซเช, เชชเชฐเชเชคเซ เชนเชตเซ เชเชเชพเชฎเชพเช เชเชเชพ เชเช เชเชพเชฐเซเชฏเชเชฐ เชธเชพเชฅเซ เชตเชฟเชธเซเชคเชฐเชฃ เชเชฐเชตเชพเชจเซ เชธเชฎเชฏ เชเชตเซ เชเชฏเซ เชเซ เช เชจเซ CeleryExecutor เชชเชฐ เชเชตเชพ เชฎเชพเชเซ เช เชฎเชพเชฐเซ เชธเชเชค เชฎเชนเซเชจเชค เชเชฐเชตเซ เชชเชกเชถเซ. เช เชจเซ เช เชนเชเซเชเชคเชจเซ เชงเซเชฏเชพเชจเชฎเชพเช เชฐเชพเชเซเชจเซ เชเซ เชคเชฎเซ เชคเซเชจเซ เชธเชพเชฅเซ เชเช เชฎเชถเซเชจ เชชเชฐ เชเชพเชฎ เชเชฐเซ เชถเชเซ เชเซ, เชธเชฐเซเชตเชฐ เชชเชฐ เชชเชฃ เชธเซเชฒเชฐเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฅเซ เชคเชฎเชจเซ เชเชเชเชชเชฃ เชฐเซเชเชคเซเช เชจเชฅเซ, เชเซ "เช เชฒเชฌเชคเซเชค, เชชเซเชฐเชฎเชพเชฃเชฟเชเชชเชฃเซ เชเซเชฏเชพเชฐเซเชฏ เชเชคเซเชชเชพเชฆเชจเชฎเชพเช เชเชถเซ เชจเชนเซเช!"
- เชฌเชฟเชจ-เชเชชเชฏเซเช เชฌเชฟเชฒเซเช-เชเชจ เชธเชพเชงเชจเซ:
- เชเชจเซเชเซเชถเชจเซเชธ เชธเซเชตเชพ เชเชณเชเชชเชคเซเชฐเซ เชธเชเชเซเชฐเชนเชตเชพ เชฎเชพเชเซ,
- SLA เชเซเชเซ เชเชพเชฏ เชเซ เชธเชฎเชฏเชธเชฐ เชเชพเชฎ เชจ เชเชฐเชคเชพ เชเชพเชฐเซเชฏเซเชจเซ เชเชตเชพเชฌ เชเชชเชตเชพ เชฎเชพเชเซ,
- เชเชเซเชธเชเซเชฎ เชฎเซเชเชพเชกเซเชเชพ เชตเชฟเชจเชฟเชฎเชฏ เชฎเชพเชเซ (เชฎเซเช เชเชนเซเชฏเซเช เชฎเซเชเชพเชกเซเชเชพ!) เชกเซเช เชเชพเชฐเซเชฏเซ เชตเชเซเชเซ.
- เชฎเซเชฒ เชฆเซเชฐเซเชชเชฏเซเช. เชธเชพเชฐเซเช, เชนเซเช เชถเซเช เชเชนเซ เชถเชเซเช? เชเชเซ เชเชฏเซเชฒเชพ เชเชพเชฐเซเชฏเซเชจเชพ เชคเชฎเชพเชฎ เชชเซเชจเชฐเชพเชตเชฐเซเชคเชจ เชฎเชพเชเซ เชเซเชคเชตเชฃเซเช เชเซเช เชตเชตเชพเชฎเชพเช เชเชตเซ เชนเชคเซ. เชนเชตเซ เชฎเชพเชฐเซเช เชเชพเชฐเซเชฏ Gmail เชฎเชพเช เชเชฐเชซเซเชฒเซ เชคเชฐเชซเชฅเซ >90k เชเชฎเซเชเชฒเซเชธ เชเซ, เช เชจเซ เชตเซเชฌ เชฎเซเชเชฒ เชฎเชเชฒ เชเช เชธเชฎเชฏเซ 100 เชฅเซ เชตเชงเซ เชเชชเชพเชกเชตเชพเชจเซ เช เชจเซ เชเชพเชขเซ เชจเชพเชเชตเชพเชจเซ เชเชจเชเชพเชฐ เชเชฐเซ เชเซ.
เชตเชงเซ เชฎเซเชถเซเชเซเชฒเซเช:
เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชชเชฟเชเชซเซเชฒเซเชธ
เชตเชงเซ เชเชเซเชฎเซเชถเชจ เชธเชพเชงเชจเซ
เช เชฎเซ เช เชฎเชพเชฐเชพ เชนเชพเชฅเชฅเซ เชจเชนเซเช เชชเชฃ เช เชฎเชพเชฐเชพ เชฎเชพเชฅเชพเชฅเซ เชตเชงเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชฐเชซเซเชฒเซเช เช เชฎเชพเชฐเชพ เชฎเชพเชเซ เช เชคเซเชฏเชพเชฐ เชเชฐเซเชฏเซเช เชเซ:
REST API - เชคเซเชจเซ เชชเชพเชธเซ เชนเชเซ เชชเชฃ เชชเซเชฐเชพเชฏเซเชเชฟเช เชธเซเชฅเชฟเชคเชฟ เชเซ, เชเซ เชคเซเชจเซ เชเชพเชฎ เชเชฐเชคเชพ เช เชเชเชพเชตเชคเซ เชจเชฅเซ. เชคเซเชจเซ เชธเชพเชฅเซ, เชคเชฎเซ เชฎเชพเชคเซเชฐ เชกเซ เชเซเชธ เช เชจเซ เชเชพเชฐเซเชฏเซ เชตเชฟเชถเซ เช เชฎเชพเชนเชฟเชคเซ เชฎเซเชณเชตเซ เชถเชเชคเชพ เชจเชฅเซ, เชชเชฐเชเชคเซ เชกเซเชเชจเซ เชฌเชเชง/เชถเชฐเซ เชเชฐเซ เชถเชเซ เชเซ, DAG เชฐเชจ เช เชฅเชตเชพ เชชเซเชฒ เชฌเชจเชพเชตเซ เชถเชเซ เชเซ.CLI - เชเชฆเซเชถ เชตเชพเชเซเชฏ เชฆเซเชตเชพเชฐเชพ เชเชฃเชพ เชธเชพเชงเชจเซ เชเชชเชฒเชฌเซเชง เชเซ เชเซ เชซเชเซเชค WebUI เชฆเซเชตเชพเชฐเชพ เชเชชเชฏเซเชเชฎเชพเช เชฒเซเชตเชพ เชฎเชพเชเซ เช เชธเซเชตเชฟเชงเชพเชเชจเช เชจเชฅเซ, เชชเชฐเชเชคเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชเซเชฐเชนเชพเชเชฐ เชเซ. เชฆเชพเชเซเชฒเชพ เชคเชฐเซเชเซ:backfill
เชเชพเชฐเซเชฏ เชเชฆเชพเชนเชฐเชฃเซ เชชเซเชจเชเชชเซเชฐเชพเชฐเชเชญ เชเชฐเชตเชพ เชฎเชพเชเซ เชเชฐเซเชฐเซ เชเซ.
เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชตเชฟเชถเซเชฒเซเชทเชเซ เชเชตเซเชฏเชพ เช เชจเซ เชเชนเซเชฏเซเช: โเช เชจเซ เชคเชฎเซ, เชธเชพเชฅเซ, 1 เชฅเซ 13 เชเชพเชจเซเชฏเซเชเชฐเซ เชธเซเชงเซเชจเชพ เชกเซเชเชพเชฎเชพเช เชฌเชเชตเชพเชธ เชเซ! เชคเซเชจเซ เช เซเช เชเชฐเซ, เชคเซเชจเซ เช เซเช เชเชฐเซ, เชคเซเชจเซ เช เซเช เชเชฐเซ, เชคเซเชจเซ เช เซเช เชเชฐเซ!" เช เชจเซ เชคเชฎเซ เชเชตเชพ เชนเซเชฌ เชเซ:airflow backfill -s '2020-01-01' -e '2020-01-13' orders
- เชเชงเชพเชฐ เชธเซเชตเชพ:
initdb
,resetdb
,upgradedb
,checkdb
. run
, เชเซ เชคเชฎเชจเซ เชเช เชเชฆเชพเชนเชฐเชฃ เชเชพเชฐเซเชฏ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชชเชฐเชตเชพเชจเชเซ เชเชชเซ เชเซ, เช เชจเซ เชคเชฎเชพเชฎ เชจเชฟเชฐเซเชญเชฐเชคเชพเช เชชเชฐ เชชเชฃ เชธเซเชเซเชฐ เชเชฐเซ เชเซ. เชตเชงเซเชฎเชพเช, เชคเชฎเซ เชคเซเชจเซ เชฎเชพเชฐเชซเชคเซ เชเชฒเชพเชตเซ เชถเชเซ เชเซLocalExecutor
, เชญเชฒเซ เชคเชฎเชพเชฐเซ เชชเชพเชธเซ เชธเซเชฒเชฐเซ เชเซเชฒเชธเซเชเชฐ เชนเซเชฏ.- เชฒเชเชญเช เชเช เช เชตเชธเซเชคเซ เชเชฐเซ เชเซ
test
, เชซเชเซเชค เชชเชพเชฏเชพเชฎเชพเช เชชเชฃ เชเชเช เชฒเชเชคเซเช เชจเชฅเซ. connections
เชถเซเชฒเชฎเชพเชเชฅเซ เชเชจเซเชเซเชถเชจ เชธเชพเชฎเซเชนเชฟเช เชฌเชจเชพเชตเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ.
เชชเชพเชฏเชฅเซเชจ API - เชเซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเชเซเชฐเชฟเชฏเชพ เชเชฐเชตเชพเชจเซ เชเช เชเชเซเชฏเชพเช เชนเชพเชฐเซเชกเชเซเชฐ เชฐเซเชค, เชเซ เชชเซเชฒเชเชเชจเซเชธ เชฎเชพเชเซ เชฌเชจเชพเชตเชพเชฏเซเชฒ เชเซ, เช เชจเซ เชคเซเชฎเชพเช เชจเชพเชจเชพ เชนเชพเชฅเชฅเซ เชเซเชฎเชคเชพ เชจเชฅเซ. เชชเชฃ เช เชฎเชจเซ เชเชคเชพ เชเซเชฃ เชฐเซเชเซ/home/airflow/dags
, เชเชฒเชพเชตเซipython
เช เชจเซ เชเชธเชชเชพเชธ เชเชกเชฌเชก เชถเชฐเซ? เชคเชฎเซ, เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชจเซเชเซเชจเชพ เชเซเชก เชธเชพเชฅเซ เชคเชฎเชพเชฎ เชเชจเซเชเซเชถเชจเซเชธ เชจเชฟเชเชพเชธ เชเชฐเซ เชถเชเซ เชเซ:from airflow import settings from airflow.models import Connection fields = 'conn_id conn_type host port schema login password extra'.split() session = settings.Session() for conn in session.query(Connection).order_by(Connection.conn_id): d = {field: getattr(conn, field) for field in fields} print(conn.conn_id, '=', d)
- เชเชฐเชซเซเชฒเซ เชฎเซเชเชพเชกเซเชเชพเชฌเซเช เชธเชพเชฅเซ เชเชจเซเชเซเช เชฅเช เชฐเชนเซเชฏเซเช เชเซ. เชนเซเช เชคเซเชจเซ เชฒเชเชตเชพเชจเซ เชญเชฒเชพเชฎเชฃ เชเชฐเชคเซ เชจเชฅเซ, เชชเชฐเชเชคเซ เชตเชฟเชตเชฟเชง เชตเชฟเชถเชฟเชทเซเช เชฎเซเชเซเชฐเชฟเชเซเชธ เชฎเชพเชเซ เชเชพเชฐเซเชฏ เชธเซเชฅเชฟเชคเชฟเช เชฎเซเชณเชตเชตเซ เช เชเซเชเชชเชฃ API เชจเซ เชเชชเชฏเซเช เชเชฐเชคเชพเช เชตเชงเซ เชเชกเชชเซ เช
เชจเซ เชธเชฐเชณ เชนเซเช เชถเชเซ เชเซ.
เชเชพเชฒเซ เชเชชเชฃเซ เชเชนเซเช เชเซ เชเชชเชฃเชพเช เชฌเชงเชพเช เชเชพเชฐเซเชฏเซ เชจเชฟเชฐเชพเชงเชพเชฐ เชจเชฅเซ, เชชเชฐเชเชคเซ เชคเซ เชเซเชฏเชพเชฐเซเช เชชเชกเซ เชถเชเซ เชเซ, เช เชจเซ เช เชธเชพเชฎเชพเชจเซเชฏ เชเซ. เชชเชฐเชเชคเซ เชฅเซเชกเชพ เช เชตเชฐเซเชงเซ เชชเชนเซเชฒเซเชฅเซ เช เชถเชเชเชพเชธเซเชชเชฆ เชเซ, เช เชจเซ เชคเซ เชคเชชเชพเชธเชตเซเช เชเชฐเซเชฐเซ เชเซ.
เชเชธเชเซเชฏเซเชเชฒ เชธเชพเชตเชเซเชค เชฐเชนเซ!
WITH last_executions AS ( SELECT task_id, dag_id, execution_date, state, row_number() OVER ( PARTITION BY task_id, dag_id ORDER BY execution_date DESC) AS rn FROM public.task_instance WHERE execution_date > now() - INTERVAL '2' DAY ), failed AS ( SELECT task_id, dag_id, execution_date, state, CASE WHEN rn = row_number() OVER ( PARTITION BY task_id, dag_id ORDER BY execution_date DESC) THEN TRUE END AS last_fail_seq FROM last_executions WHERE state IN ('failed', 'up_for_retry') ) SELECT task_id, dag_id, count(last_fail_seq) AS unsuccessful, count(CASE WHEN last_fail_seq AND state = 'failed' THEN 1 END) AS failed, count(CASE WHEN last_fail_seq AND state = 'up_for_retry' THEN 1 END) AS up_for_retry FROM failed GROUP BY task_id, dag_id HAVING count(last_fail_seq) > 0
เชธเชเชฆเชฐเซเชญเซ
เช เชจเซ เช เชฒเชฌเชคเซเชค, Google เชจเชพ เชเชถเซเชฏเซเชจเซ เชชเซเชฐเชฅเชฎ เชฆเชธ เชฒเชฟเชเชเซเชธ เชฎเชพเชฐเชพ เชฌเซเชเชฎเชพเชฐเซเชเซเชธเชฎเชพเชเชฅเซ เชเชฐเชซเซเชฒเซ เชซเซเชฒเซเชกเชฐเชจเซ เชธเชพเชฎเชเซเชฐเซ เชเซ.
เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ - เช เชฒเชฌเชคเซเชค, เชเชชเชฃเซ เชเชซเชฟเชธเชฅเซ เชถเชฐเซเชเชค เชเชฐเชตเซ เชเซเชเช. เชฆเชธเซเชคเชพเชตเซเชเซเชเชฐเชฃ, เชชเชฐเชเชคเซ เชธเซเชเชจเชพเช เชเซเชฃ เชตเชพเชเชเซ เชเซ?เชถเซเชฐเซเชทเซเช เชชเซเชฐเชฏเชพเชธเซ - เชธเชพเชฐเซเช, เชเชเชพเชฎเชพเช เชเชเซเช เชธเชฐเซเชเชเซเชจเซ เชญเชฒเชพเชฎเชฃเซ เชตเชพเชเชเซ.เชเชฐเชซเซเชฒเซ UI - เชเซเชฌ เช เชถเชฐเซเชเชค: เชเชฟเชคเซเชฐเซเชฎเชพเช เชตเชชเชฐเชพเชถเชเชฐเซเชคเชพ เชเชจเซเชเชฐเชซเซเชธเช เชชเชพเชเซ เชเชฐเชซเซเชฒเซเชจเชพ เชฎเซเชเซเชฏ เชเซเชฏเชพเชฒเซเชจเซ เชธเชฎเชเชตเซเช - เชฎเซเชณเชญเซเชค เชเซเชฏเชพเชฒเซ เชธเชพเชฐเซ เชฐเซเชคเซ เชตเชฐเซเชฃเชตเซเชฒ เชเซ, เชเซ (เช เชเชพเชจเช!) เชคเชฎเซ เชฎเชพเชฐเชพ เชคเชฐเชซเชฅเซ เชเชเชเช เชธเชฎเชเซ เชถเชเซเชฏเชพ เชจเชฅเซ.เชคเชฟเชฏเชพเชจเชฒเซเชเชเชจเซ เชฌเซเชฒเซเช โ เชเชฐเชซเซเชฒเซ เชธเชฐเซเชตเชฐ/เชเซเชฒเชธเซเชเชฐ เชเซเชตเซ เชฐเซเชคเซ เชฌเชจเชพเชตเชตเซเช เชคเซเชจเซ เชฎเชพเชฐเซเชเชฆเชฐเซเชถเชฟเชเชพ - เชเชฐเชซเซเชฒเซ เชเซเชฒเชธเซเชเชฐ เชธเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชเชเซ เชฎเชพเชฐเซเชเชฆเชฐเซเชถเชฟเชเชพ.Lyft เชชเชฐ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชเชพเชฒเซ เชฐเชนเซเชฏเซ เชเซ - เชฒเชเชญเช เชธเชฎเชพเชจ เชฐเชธเชชเซเชฐเชฆ เชฒเซเช, เชเชฆเชพเช เชตเชงเซ เชเชชเชเชพเชฐเชฟเชเชคเชพ เช เชจเซ เชเชเชพ เชเชฆเชพเชนเชฐเชฃเซ เชธเชฟเชตเชพเชฏ.เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ เชธเซเชฒเชฐเซ เชเชพเชฎเชฆเชพเชฐเซ เชชเชฐ เชจเซเชเชฐเซเชเชจเซเช เชตเชฟเชคเชฐเชฃ เชเซเชตเซ เชฐเซเชคเซ เชเชฐเซ เชเซ - เชธเซเชฒเชฐเซ เชธเชพเชฅเซ เชเซเชกเชพเชฃเชฎเชพเช เชเชพเชฎ เชเชฐเชตเชพ เชตเชฟเชถเซ.เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซเชฎเชพเช DAG เชฒเซเชเชจ เชถเซเชฐเซเชทเซเช เชชเซเชฐเซเชเซเชเชฟเชธ - เชเชพเชฐเซเชฏเซเชจเซ เชเซเชทเชฎเชคเชพ เชตเชฟเชถเซ, เชคเชพเชฐเซเชเชจเซ เชฌเชฆเชฒเซ ID เชฆเซเชตเชพเชฐเชพ เชฒเซเชก เชเชฐเชตเซเช, เชชเชฐเชฟเชตเชฐเซเชคเชจ, เชซเชพเชเชฒ เชฎเชพเชณเชเซเช เช เชจเซ เช เชจเซเชฏ เชฐเชธเชชเซเชฐเชฆ เชตเชธเซเชคเซเช.เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซเชฎเชพเช เชจเชฟเชฐเซเชญเชฐเชคเชพเชจเซเช เชธเชเชเชพเชฒเชจ - เชเชพเชฐเซเชฏเซเชจเซ เช เชตเชฒเชเชฌเชจ เช เชจเซ เชเซเชฐเชฟเชเชฐ เชจเชฟเชฏเชฎ, เชเซเชจเซ เชฎเซเช เชซเชเซเชค เชชเชพเชธเชฟเชเชเชฎเชพเช เชเชฒเซเชฒเซเช เชเชฐเซเชฏเซ เชเซ.เชเชฐเชซเซเชฒเซ: เชเซเชฏเชพเชฐเซ เชคเชฎเชพเชฐเซเช DAG เชถเซเชกเซเชฏเซเชฒเชจเซ เชชเชพเชเชณ เชเซ - เชถเซเชกเซเชฏเซเชฒเชฐเชฎเชพเช เชเซเชเชฒเชพเช "เชเชเซเชเชฟเชค เชเชพเชฐเซเชฏเซ" เชชเชฐ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฌเซ เชฎเซเชณเชตเชตเซ, เชเซเชตเชพเชฏเซเชฒ เชกเซเชเชพ เชฒเซเชก เชเชฐเซ เช เชจเซ เชเชพเชฐเซเชฏเซเชจเซ เชชเซเชฐเชพเชฅเชฎเชฟเชเชคเชพ เชเชชเซ.Apache Airflow เชฎเชพเชเซ เชเชชเชฏเซเชเซ SQL เชเซเชตเซเชฐเซเช - เชเชฐเชซเซเชฒเซ เชฎเซเชเชพเชกเซเชเชพ เชฎเชพเชเซ เชเชชเชฏเซเชเซ SQL เชเซเชตเซเชฐเซเช.Apache Airflow เชธเชพเชฅเซ เชตเชฐเซเชเชซเซเชฒเซ เชตเชฟเชเชธเชพเชตเชตเชพเชจเซเช เชถเชฐเซ เชเชฐเซ - เชเชธเซเชเชฎ เชธเซเชจเซเชธเชฐ เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ เชเช เชเชชเชฏเซเชเซ เชตเชฟเชญเชพเช เชเซ.เชชเซเชฐเซเชธเซเชเซ เช เชจเซ เชเชฐเชซเซเชฒเซ เชธเชพเชฅเซ AWS เชชเชฐ Fetchr เชกเซเชเชพ เชธเชพเชฏเชจเซเชธ เชเชจเซเชซเซเชฐเชพเชจเซเช เชจเชฟเชฐเซเชฎเชพเชฃ - เชกเซเชเชพ เชธเชพเชฏเชจเซเชธ เชฎเชพเชเซ AWS เชชเชฐ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ เชเช เชฐเชธเชชเซเชฐเชฆ เชเซเชเชเซ เชจเซเชเชง.เชเชฐเชซเซเชฒเซ เชกเซเชเชเซ เชกเซเชฌเช เชเชฐเชคเซ เชตเชเชคเซ เชคเชชเชพเชธเชตเชพ เชฎเชพเชเซเชจเซ 7 เชธเชพเชฎเชพเชจเซเชฏ เชญเซเชฒเซ - เชธเชพเชฎเชพเชจเซเชฏ เชญเซเชฒเซ (เชเซเชฏเชพเชฐเซ เชเซเช เชนเชเซ เชชเชฃ เชธเซเชเชจเชพเช เชตเชพเชเชเชคเซเช เชจเชฅเซ).Apache Airflow เชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชชเชพเชธเชตเชฐเซเชก เชธเซเชเซเชฐ เชเชฐเซ เช เชจเซ เชเชเซเชธเซเชธ เชเชฐเซ - เชธเซเชฎเชฟเชค เชเชฐเซ เชเซ เชฒเซเชเซ เชเซเชตเซ เชฐเซเชคเซ เชชเชพเชธเชตเชฐเซเชกเซเชธ เชธเชเชเซเชฐเชนเชฟเชค เชเชฐเซ เชเซ, เชเซ เชเซ เชคเชฎเซ เชซเชเซเชค เชเซเชกเชพเชฃเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ.เชชเชพเชฏเชฅเซเชจ เช เชจเซ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซเชจเซ เชเซเชจ - เชเชฐเซเชญเชฟเชค DAG เชซเซเชฐเชตเชฐเซเชกเชฟเชเช, เชซเชเชเซเชถเชจเชฎเชพเช เชธเชเชฆเชฐเซเชญ เชซเซเชเชเชตเซเช, เชซเชฐเซเชฅเซ เชจเชฟเชฐเซเชญเชฐเชคเชพ เชตเชฟเชถเซ, เช เชจเซ เชเชพเชฐเซเชฏ เชฒเซเชจเซเชเชจเซ เชเซเชกเชตเชพ เชตเชฟเชถเซ เชชเชฃ.เชเชฐเชซเซเชฒเซ: เชเชเซ เชเชพเชฃเซเชคเซ เชเชฟเชชเซเชธ, เชฏเซเชเซเชคเชฟเช เช เชจเซ เชถเซเชฐเซเชทเซเช เชตเซเชฏเชตเชนเชพเชฐเซ - เชเชชเชฏเซเช เชตเชฟเชถเซdefault arguments
ะธparams
เชเซเชฎเซเชชเชฒเซเชเซเชธเชฎเชพเช, เชคเซเชฎเช เชตเซเชฐเชฟเชฏเซเชฌเชฒเซเชธ เช เชจเซ เชเชจเซเชเซเชถเชจเซเชธเชฎเชพเช.เชเชฐเชซเซเชฒเซ เชถเซเชกเซเชฏเซเชฒเชฐเชจเซ เชชเซเชฐเซเชซเชพเชเชฒเชฟเชเช - เชเชฏเซเชเช เชเชฐเชซเซเชฒเซ 2.0 เชฎเชพเชเซ เชเซเชตเซ เชฐเซเชคเซ เชคเซเชฏเชพเชฐเซ เชเชฐเซ เชฐเชนเซเชฏเซ เชเซ เชคเซ เชตเชฟเชถเซเชจเซ เชตเชพเชฐเซเชคเชพ.เชกเซเชเชฐ-เชเชเชชเซเชเชฎเชพเช 3 เชธเซเชฒเชฐเซ เชเชพเชฎเชฆเชพเชฐเซ เชธเชพเชฅเซ เช เชชเชพเชเซ เชเชฐเชซเซเชฒเซ - เชฎเชพเช เช เชฎเชพเชฐเชพ เชเซเชฒเชธเซเชเชฐเชจเซ เชเชฎเชพเชตเชตเชพ เชตเชฟเชถเซ เชฅเซเชกเซ เชเซเชจเซ เชฒเซเชdocker-compose
.เชเชฐเชซเซเชฒเซ เชธเชเชฆเชฐเซเชญเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ 4 เชเซเชฎเซเชชเชฒเซเชเซเชเช เชเชพเชฐเซเชฏเซ - เชเซเชฎเซเชชเชฒเซเชเซเชธ เช เชจเซ เชธเชเชฆเชฐเซเชญ เชซเซเชฐเชตเชฐเซเชกเชฟเชเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชเชคเชฟเชถเซเชฒ เชเชพเชฐเซเชฏเซ.เชเชฐเชซเซเชฒเซเชฎเชพเช เชญเซเชฒ เชธเซเชเชจเชพเช - เชฎเซเชเชฒ เช เชจเซ เชธเซเชฒเซเช เชฆเซเชตเชพเชฐเชพ เชฎเชพเชจเช เช เชจเซ เชเชธเซเชเชฎ เชธเซเชเชจเชพเช.เชเชฐเชซเซเชฒเซ เชตเชฐเซเชเชถเซเชช: เชเซเชฐเซเช เชตเชฟเชจเชพ เชเชเชฟเชฒ เชกเซเชเชเซ - เชถเชพเชเชพเชจเชพ เชเชพเชฐเซเชฏเซ, เชฎเซเชเซเชฐเซ เช เชจเซ XCom.
เช เชจเซ เชฒเซเชเชฎเชพเช เชตเชชเชฐเชพเชฏเซเชฒ เชฒเชฟเชเชเซเชธ:
เชฎเซเชเซเชฐเซ เชธเชเชฆเชฐเซเชญ - เชจเชฎเซเชจเชพเชเชฎเชพเช เชเชชเชฏเซเช เชฎเชพเชเซ เชชเซเชฒเซเชธเชนเซเชฒเซเชกเชฐเซเชธ เชเชชเชฒเชฌเซเชง เชเซ.เชธเชพเชฎเชพเชจเซเชฏ เชฎเซเชถเซเชเซเชฒเซเช - เชเชฐเชซเซเชฒเซ - เชกเซเช เชฌเชจเชพเชตเชคเซ เชตเชเชคเซ เชธเชพเชฎเชพเชจเซเชฏ เชญเซเชฒเซ.puckel/docker-airflow: Docker Apache Airflow -docker-compose
เชชเซเชฐเชฏเซเชเซ, เชกเซเชฌเชเซเชเช เช เชจเซ เชตเชงเซ เชฎเชพเชเซ.python-telegram-bot/python-telegram-bot: เช เชฎเซ เชคเชฎเชจเซ เชเช เชเชตเชฐเชฃ เชฌเชจเชพเชตเซเชฏเซเช เชเซ เชเซเชจเซ เชคเชฎเซ เชจเชพ เชชเชพเชกเซ เชถเชเซ - เชเซเชฒเชฟเชเซเชฐเชพเชฎ REST API เชฎเชพเชเซ เชชเชพเชฏเชฅเซเชจ เชฐเซเชชเชฐ.
เชธเซเชฐเซเชธ: www.habr.com