เจนเฉเจฒเฉ, เจฎเฉเจ เจฆเจฎเจฟเจคเจฐเฉ เจฒเฉเจเจตเจฟเจจเฉเจจเจเฉ เจนเจพเจ - เจตเฉเจเจผเฉเจ เจเจฐเฉเฉฑเจช เจเจซเจผ เจเฉฐเจชเจจเฉเจเจ เจฆเฉ เจตเจฟเจธเจผเจฒเฉเจธเจผเจฃ เจตเจฟเจญเจพเจ เจฆเจพ เจกเฉเจเจพ เจเฉฐเจเฉเจจเฉเจ เจฐเฅค
เจฎเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเจเฉเจเจฒ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจฆเฉ เจตเจฟเจเจพเจธ เจฒเจ เจเฉฑเจ เจธเจผเจพเจจเจฆเจพเจฐ เจเฉเจฒ เจฌเจพเจฐเฉ เจฆเฉฑเจธเจพเจเจเจพ - เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ. เจชเจฐ เจเจ เจฐเจซเจฒเฉ เจเฉฐเจจเจพ เจฌเจนเฉเจชเฉฑเจเฉ เจ เจคเฉ เจฌเจนเฉเจชเฉฑเจเฉ เจนเฉ เจเจฟ เจคเฉเจนเจพเจจเฉเฉฐ เจเจธ 'เจคเฉ เจกเฉเฉฐเจเจพเจ เจจเจพเจฒ เจตเจฟเจเจพเจฐ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจญเจพเจตเฉเจ เจคเฉเจธเฉเจ เจกเฉเจเจพ เจฆเฉ เจชเฉเจฐเจตเจพเจน เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจจเจพ เจนเฉเจตเฉ, เจชเจฐ เจธเจฎเฉเจ-เจธเจฎเฉเจ 'เจคเฉ เจเจฟเจธเฉ เจตเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจจ เจ เจคเฉ เจเจนเจจเจพเจ เจฆเฉ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
เจ เจคเฉ เจนเจพเจ, เจฎเฉเจ เจจเจพ เจธเจฟเจฐเจซ เจฆเฉฑเจธเจพเจเจเจพ, เจฌเจฒเจเจฟ เจเจน เจตเฉ เจฆเจฟเจเจพเจตเจพเจเจเจพ: เจชเฉเจฐเฉเจเจฐเจพเจฎ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจเฉเจก, เจธเจเฉเจฐเฉเจจเจธเจผเจพเจ เจ เจคเฉ เจธเจฟเจซเจผเจพเจฐเจธเจผเจพเจ เจนเจจ.
เจเจฆเฉเจ เจคเฉเจธเฉเจ เจเจ
เจฐเจซเจฒเฉ / เจตเจฟเจเฉเจฎเฉเจกเฉเจ เจเจพเจฎเจจเจเจผ เจธเจผเจฌเจฆ เจจเฉเฉฐ เจเฉเจเจฒ เจเจฐเจฆเฉ เจนเฉ เจคเจพเจ เจคเฉเจธเฉเจ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเฉ เจฆเฉเจเจฆเฉ เจนเฉ
เจตเจฟเจธเจผเจพ-เจธเฉเจเฉ
เจเจพเจฃ เจชเจเจพเจฃ เจฎเฉเฉฑเจ เจนเจฟเฉฑเจธเจพ, เจตเจฟเจนเจพเจฐเจ (เจ เจคเฉ เจฅเฉเฉเจพ เจธเจฟเจงเจพเจเจคเจ) เจ เจธเฉเจ (เจ เจคเฉ เจคเฉเจธเฉเจ) เจเจฟเจเจ เจเจฐเจฆเฉ เจนเจพเจ เจเจฒเฉฑเจธเจเจฐ เจจเฉเฉฐ เจเจเฉฑเจ เจพ เจเจฐเจจเจพ เจฌเฉเจธเจฟเจ เจงเจพเจฐเจจเจพ เจ เจธเฉเจ เจเจพเจฐเจ เจคเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจพเจ เจซเฉเฉฑเจฒ เจฌเจพเจฐเฉ เจฅเฉเฉเจพ เจเจฟเจนเจพ เจ เจธเฉเจ เจ เฉฐเจกเจฐเจฒเฉเจก เจฒเฉเจก เจเจฐเจฆเฉ เจนเจพเจ เจเจจเฉเจเจธเจผเจจ, เจนเฉเฉฑเจ เจ เจคเฉ เจนเฉเจฐ เจตเฉเจฐเฉเจเจฌเจฒ เจเจธเจเจฎ เจเจชเจฐเฉเจเจฐ เจจเฉเฉฐ เจชเจพเจฐเจธ เจเจฐ เจฐเจฟเจนเจพ เจนเฉ เจเฉ เจคเฉเจธเฉเจ เจกเฉเจฒเฉเจนเจฃ เจเจพ เจฐเจนเฉ เจนเฉ? เจธเฉฐเจเฉเจช
เจญเจพเจ เจซเจพเจเจจเจฒ, เจนเจตเจพเจฒเจพ เจ เจคเฉ เจเจพเจฃเจเจพเจฐเฉ เจนเจตเจพเจฒเฉ
เจเจพเจฃ เจชเจเจพเจฃ
เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจเฉเจเจเฉ เจตเจพเจเจ เจนเฉ:
- python เจตเจฟเฉฑเจ เจฒเจฟเจเจฟเจ
- เจเฉฑเจ เจตเจงเฉเจ เจเจกเจฎเจฟเจจ เจชเฉเจจเจฒ เจนเฉ,
- เจ เจจเจฟเจธเจผเจเจฟเจค เจธเจฎเฉเจ เจฒเจ เจตเจฟเจธเจคเจพเจฐเจฏเฉเจ
- เจธเจฟเจฐเจซ เจฌเจฟเจนเจคเจฐ, เจ เจคเฉ เจเจน เจฌเจฟเจฒเจเฉเจฒ เจตเฉฑเจเจฐเฉ เจเจฆเฉเจธเจผเจพเจ เจฒเจ เจฌเจฃเจพเจเจ เจเจฟเจ เจธเฉ, เจ เจฐเจฅเจพเจค (เจเจฟเจตเฉเจ เจเจฟ เจเจน เจเจพเจเจพ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ เจฒเจฟเจเจฟเจ เจเจฟเจ เจนเฉ):
- เจ เจธเฉเจฎเจค เจเจฟเจฃเจคเฉ เจฆเฉเจเจ เจฎเจธเจผเฉเจจเจพเจ 'เจคเฉ เจเฉฐเจฎ เจเจฒเจพเจเจฃเจพ เจ เจคเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจจเจพ (เจเจฟเฉฐเจจเฉ เจธเฉเจฒเจฐเฉ / เจเฉเจฌเจฐเจจเฉเจเจธ เจ เจคเฉ เจคเฉเจนเจพเจกเฉ เจเจผเจฎเฉเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจเจเจพเจเจผเจค เจฆเฉเจตเฉเจเฉ)
- เจชเจพเจเจฅเจจ เจเฉเจก เจจเฉเฉฐ เจฒเจฟเจเจฃ เจ เจคเฉ เจธเจฎเจเจฃ เจฒเจ เจฌเจนเฉเจค เจนเฉ เจเจธเจพเจจ เจคเฉเจ เจกเจพเจเจจเจพเจฎเจฟเจ เจตเจฐเจเจซเจฒเฉ เจชเฉเฉเฉเจนเฉ เจฆเฉ เจจเจพเจฒ
- เจ เจคเฉ เจเจฟเจธเฉ เจตเฉ เจกเฉเจเจพเจฌเฉเจธ เจ เจคเฉ API เจจเฉเฉฐ เจเฉฑเจ เจฆเฉเจเฉ เจจเจพเจฒ เจคเจฟเจเจฐ เจเฉเจคเฉ เจญเจพเจเจพเจ เจ เจคเฉ เจเจฐเฉเจฒเฉ-เจฌเจฃเฉ เจชเจฒเฉฑเจเจเจจเจพเจ (เจเฉ เจเจฟ เจฌเจนเฉเจค เจนเฉ เจธเจงเจพเจฐเจจ เจนเฉ) เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉฑเจ เจฆเฉเจเฉ เจจเจพเจฒ เจเฉเฉเจจ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจนเฉเฅค
เจ เจธเฉเจ เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจจเฉเฉฐ เจเจธ เจคเจฐเฉเจนเจพเจ เจตเจฐเจคเจฆเฉ เจนเจพเจ:
- เจ เจธเฉเจ DWH เจ เจคเฉ ODS (เจธเจพเจกเฉ เจเฉเจฒ Vertica เจ เจคเฉ Clickhouse เจนเฉ) เจตเจฟเฉฑเจ เจตเฉฑเจ-เจตเฉฑเจ เจธเจฐเฉเจคเจพเจ (เจฌเจนเฉเจค เจธเจพเจฐเฉ SQL เจธเจฐเจตเจฐ เจ เจคเฉ PostgreSQL เจเจฆเจพเจนเจฐเจจเจพเจ, เจเจชเจฒเฉเจเฉเจธเจผเจจ เจฎเฉเจเฉเจฐเจฟเจเจธ เจฆเฉ เจจเจพเจฒ เจตเฉฑเจ-เจตเฉฑเจ API, เจเฉฑเจฅเฉเจ เจคเฉฑเจ เจเจฟ 1C) เจคเฉเจ เจกเจพเจเจพ เจเจเฉฑเจ เจพ เจเจฐเจฆเฉ เจนเจพเจเฅค
- เจเจฟเฉฐเจจเจพ เจเฉฑเจจเจค
cron
, เจเฉ เจเจฟ ODS 'เจคเฉ เจกเจพเจเจพ เจเจเจธเฉเจฐเจคเจพ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจจเฉเฉฐ เจธเจผเฉเจฐเฉ เจเจฐเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจนเจจเจพเจ เจฆเฉ เจฐเฉฑเจ-เจฐเจเจพเจ เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจตเฉ เจเจฐเจฆเจพ เจนเฉเฅค
เจนเจพเจฒ เจนเฉ เจตเจฟเฉฑเจ, เจธเจพเจกเฉเจเจ เจฒเฉเฉเจพเจ เจจเฉเฉฐ 32 เจเฉเจฐ เจ เจคเฉ 50 GB RAM เจตเจพเจฒเฉ เจเฉฑเจ เจเฉเจเฉ เจธเจฐเจตเจฐ เจฆเฉเจเจฐเจพ เจเจตเจฐ เจเฉเจคเจพ เจเจฟเจ เจธเฉเฅค เจเจ เจฐเจซเจฒเฉ เจตเจฟเฉฑเจ, เจเจน เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ:
- เจนเฉเจฐ 200 เจกเจพเจเจธ (เจ เจธเจฒ เจตเจฟเฉฑเจ เจตเจฐเจเจซเจฒเฉ, เจเจฟเจธ เจตเจฟเฉฑเจ เจ เจธเฉเจ เจเฉฐเจฎ เจญเจฐเจฆเฉ เจนเจพเจ),
- เจเจธเจค 'เจคเฉ เจนเจฐ เจตเจฟเฉฑเจ 70 เจเจพเจฐเจ,
- เจเจน เจเฉฐเจเจฟเจเจ เจธเจผเฉเจฐเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ (เจเจธเจคเจจ เจตเฉ) เจเฉฑเจ เจเฉฐเจเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจตเจพเจฐ.
เจ เจคเฉ เจเจธ เจฌเจพเจฐเฉ เจเจฟ เจ เจธเฉเจ เจเจฟเจตเฉเจ เจตเจฟเจธเจคเจพเจฐ เจเฉเจคเจพ, เจฎเฉเจ เจนเฉเจ เจพเจ เจฒเจฟเจเจพเจเจเจพ, เจชเจฐ เจนเฉเจฃ เจ เจธเฉเจ รผber-เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจเจฐเฉเจ เจเจฟเจธ เจจเฉเฉฐ เจ เจธเฉเจ เจนเฉฑเจฒ เจเจฐเจพเจเจเฉ:
เจเฉฑเจฅเฉ เจคเจฟเฉฐเจจ เจ เจธเจฒเฉ SQL เจธเจฐเจตเจฐ เจนเจจ, เจนเจฐ เจเฉฑเจ เจตเจฟเฉฑเจ 50 เจกเฉเจเจพเจฌเฉเจธ เจนเจจ - เจเฉฑเจ เจชเฉเจฐเฉเจเฉเจเจ เจฆเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ, เจเฉเจฐเจฎเจตเจพเจฐ, เจเจนเจจเจพเจ เจเฉเจฒ เจเฉฑเจเฉ เจขเจพเจเจเจพ เจนเฉ (เจฒเจเจญเจ เจนเจฐ เจฅเจพเจ, เจฎเฉเจ-เจนเจพ-เจนเจพ), เจเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจนเจฐเฉเจ เจเฉเจฒ เจเฉฑเจ เจเจฐเจกเจฐ เจเฉเจฌเจฒ เจนเฉ (เจเฉเจธเจผเจเจฟเจธเจฎเจคเฉ เจจเจพเจฒ, เจเจธ เจจเจพเจฒ เจเฉฑเจ เจธเจพเจฐเจฃเฉ) เจจเจพเจฎ เจจเฉเฉฐ เจเจฟเจธเฉ เจตเฉ เจเจพเจฐเฉเจฌเจพเจฐ เจตเจฟเฉฑเจ เจงเฉฑเจเจฟเจ เจเจพ เจธเจเจฆเจพ เจนเฉ) เจ เจธเฉเจ เจธเฉเจตเจพ เจเฉเจคเจฐเจพเจ (เจธเจฐเฉเจค เจธเจฐเจตเจฐ, เจธเจฐเฉเจค เจกเฉเจเจพเจฌเฉเจธ, ETL เจเจพเจธเจ เจเจเจกเฉ) เจจเฉเฉฐ เจเฉเฉ เจเฉ เจกเฉเจเจพ เจฒเฉเจเจฆเฉ เจนเจพเจ เจ เจคเฉ เจเจนเจจเจพเจ เจจเฉเฉฐ เจจเจฟเจฐเจชเฉฑเจเจคเจพ เจจเจพเจฒ เจตเจฐเจเฉเจเจพ เจตเจฟเฉฑเจ เจธเฉเฉฑเจ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจเฅค
เจเฉฑเจฒเฉเจ!
เจฎเฉเฉฑเจ เจนเจฟเฉฑเจธเจพ, เจตเจฟเจนเจพเจฐเจ (เจ เจคเฉ เจฅเฉเฉเจพ เจธเจฟเจงเจพเจเจคเจ)
เจ เจธเฉเจ (เจ เจคเฉ เจคเฉเจธเฉเจ) เจเจฟเจเจ เจเจฐเจฆเฉ เจนเจพเจ
เจเจฆเฉเจ เจฐเฉเฉฑเจ เจตเฉฑเจกเฉ เจธเจจ เจคเฉ เจฎเฉเจ เจธเจพเจฆเจพ เจธเฉ SQL
-เจเฉฑเจ เจฐเฉเจธเฉ เจฐเจฟเจเฉเจฒ เจตเจฟเฉฑเจ, เจ
เจธเฉเจ เจธเจพเจกเฉ เจฒเจ เจเจชเจฒเจฌเจง เจฆเฉ เจเฉเจฒเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ ETL เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจเจฐเจซเจผ เจกเจพเจเจพ เจชเฉเจฐเจตเจพเจน เจจเจพเจฒ เจเจชเจฒเจพ เจเฉเจคเจพ:
- เจธเฉเจเจจเจพ เจธเจผเจเจคเฉ เจเฉเจเจฆเจฐ - เจเฉฑเจ เจฌเจนเฉเจค เจนเฉ เจซเฉเจฒเจฃ เจตเจพเจฒเจพ เจธเจฟเจธเจเจฎ, เจฌเจนเฉเจค เจฒเจพเจญเจเจพเจฐเฉ, เจเจธเจฆเฉ เจเจชเจฃเฉ เจนเจพเจฐเจกเจตเฉเจ
เจฐ เจฆเฉ เจจเจพเจฒ, เจเจธเจฆเจพ เจเจชเจฃเจพ เจธเฉฐเจธเจเจฐเจฃเฅค เจฎเฉเจ เจเจธเจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ เจฆเจพ 1% เจชเฉเจฐเจฎเจพเจคเจฎเจพ เจตเจฐเจเจฟเจ เจนเฉเฅค เจเจฟเจเจ? เจเฉเจฐ, เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจเจน เจเฉฐเจเจฐเจซเฉเจธ, เจเจฟเจคเฉ 380 เจฆเฉ เจฆเจนเจพเจเฉ เจคเฉเจ, เจฎเจพเจจเจธเจฟเจ เจคเฉเจฐ 'เจคเฉ เจธเจพเจกเฉ 'เจคเฉ เจฆเจฌเจพเจ
เจชเจพเจเจเจฆเจพ เจนเฉ. เจฆเฉเจเจพ, เจเจน เจเฉฐเจเจฐเฉเจชเจธเจผเจจ เจฌเจนเฉเจค เจนเฉ เจธเจผเจพเจจเจฆเจพเจฐ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ, เจเฉเฉฑเจธเฉ เจตเจพเจฒเฉ เจนเจฟเฉฑเจธเฉ เจฆเฉ เจฎเฉเฉ เจตเจฐเจคเฉเจ เจ
เจคเฉ เจนเฉเจฐ เจฌเจนเฉเจค เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ-เจเจฆเจฎ-เจเจพเจฒเจพเจ เจฒเจ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจเจ
เจฐเจฌเฉฑเจธ เจXNUMX / เจธเจพเจฒ เจฆเฉ เจตเจฟเฉฐเจ เจตเจพเจเจ เจเจธเจฆเฉ เจเฉเจฎเจค เจเฉ เจนเฉ, เจ
เจธเฉเจ เจเฉเจ เจจเจนเฉเจ เจเจนเจพเจเจเฉเฅค
เจธเจพเจตเจงเจพเจจ, เจเฉฑเจ เจธเจเฉเจฐเฉเจจเจธเจผเฉเจ 30 เจธเจพเจฒ เจคเฉเจ เจเฉฑเจ เจเจฎเจฐ เจฆเฉ เจฒเฉเจเจพเจ เจจเฉเฉฐ เจฅเฉเฉเจพ เจเจฟเจนเจพ เจจเฉเจเจธเจพเจจ เจชเจนเฉเฉฐเจเจพ เจธเจเจฆเจพ เจนเฉ
- SQL เจธเจฐเจตเจฐ เจเจเฉเจเจฐเจฃ เจธเจฐเจตเจฐ - เจ
เจธเฉเจ เจเจชเจฃเฉ เจเฉฐเจเจฐเจพ-เจชเฉเจฐเฉเจเฉเจเจ เจชเฉเจฐเจตเจพเจน เจตเจฟเฉฑเจ เจเจธ เจเจพเจฎเจฐเฉเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉเฅค เจเฉเจฐ, เจตเจพเจธเจคเจต เจตเจฟเฉฑเจ: เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ SQL เจธเจฐเจตเจฐ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ, เจ
เจคเฉ เจเจธเจฆเฉ ETL เจธเจพเจงเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจจเจพ เจเจฐเจจเจพ เจเจฟเจธเฉ เจคเจฐเฉเจนเจพเจ เจเฉเจฐเจตเจพเจเจฌ เจนเฉเจตเฉเจเจพ. เจเจธ เจตเจฟเฉฑเจ เจธเจญ เจเฉเจ เจตเจงเฉเจ เจนเฉ: เจฆเฉเจตเฉเจ เจเฉฐเจเจฐเจซเฉเจธ เจธเฉเฉฐเจฆเจฐ เจนเจจ, เจ
เจคเฉ เจชเฉเจฐเจเจคเฉ เจฐเจฟเจชเฉเจฐเจเจพเจ ... เจชเจฐ เจเจน เจเจธ เจฒเจ เจจเจนเฉเจ เจนเฉ เจเจฟ เจ
เจธเฉเจ เจธเจพเจซเจเจตเฉเจ
เจฐ เจเจคเจชเจพเจฆเจพเจ เจจเฉเฉฐ เจชเจฟเจเจฐ เจเจฐเจฆเฉ เจนเจพเจ, เจ, เจเจธเจฆเฉ เจฒเจ เจจเจนเฉเจ. เจเจธเจฆเจพ เจธเฉฐเจธเจเจฐเจฃ
dtsx
(เจเฉ เจเจฟ เจจเฉเจกเจธ เจจเฉเฉฐ เจธเฉเจต เจเจฐเจจ 'เจคเฉ เจฌเจฆเจฒเจฟเจ เจนเฉเจเจ XML เจนเฉ) เจ เจธเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ, เจชเจฐ เจเจธ เจฆเจพ เจเฉ เจฎเจคเจฒเจฌ เจนเฉ? เจเฉฑเจ เจเจพเจธเจ เจชเฉเจเฉเจ เจฌเจฃเจพเจเจฃ เจฌเจพเจฐเฉ เจเฉ เจนเฉ เจเฉ เจเฉฑเจ เจธเจฐเจตเจฐ เจคเฉเจ เจฆเฉเจเฉ เจธเจฐเจตเจฐ เจตเจฟเฉฑเจ เจธเฉเจเจเฉเฉ เจเฉเจฌเจฒเจพเจ เจจเฉเฉฐ เจเจฟเฉฑเจเฉเจเจพ? เจนเจพเจ, เจเฉ เจธเฉ, เจคเฉเจนเจพเจกเฉ เจเฉฐเจกเฉเจเจธ เจซเจฟเฉฐเจเจฐ เจตเฉเจน เจเฉเจเฉเจฟเจเจ เจคเฉเจ เจกเจฟเฉฑเจ เจเจพเจตเฉเจเฉ, เจฎเจพเจเจธ เจฌเจเจจ 'เจคเฉ เจเจฒเจฟเฉฑเจ เจเจฐเฉ. เจชเจฐ เจเจน เจฏเจเฉเจจเฉ เจคเฉเจฐ 'เจคเฉ เจตเจงเฉเจฐเฉ เจซเฉเจธเจผเจจเฉเจฌเจฒ เจฆเจฟเจเจพเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ:
เจ เจธเฉเจ เจจเจฟเจธเจผเจเจค เจคเฉเจฐ 'เจคเฉ เจฌเจพเจนเจฐ เจฆเฉ เจคเจฐเฉเจเจฟเจเจ เจฆเฉ เจญเจพเจฒ เจเฉเจคเฉ. เจเฉเจธ เจตเฉ เจฒเจเจญเจ เจฒเจเจญเจ เจเฉฑเจ เจธเจตเฉ-เจฒเจฟเจเจค SSIS เจชเฉเจเฉเจ เจเจจเจฐเฉเจเจฐ เจคเฉ เจเจเจ ...
โฆเจ เจคเฉ เจซเจฟเจฐ เจฎเฉเจจเฉเฉฐ เจเฉฑเจ เจจเจตเฉเจ เจจเฉเจเจฐเฉ เจฎเจฟเจฒเฉเฅค เจ เจคเฉ เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจจเฉ เจฎเฉเจจเฉเฉฐ เจเจธ 'เจคเฉ เจชเจเจพเฉ เจฆเจฟเฉฑเจคเจพ.
เจเจฆเฉเจ เจฎเฉเจจเฉเฉฐ เจชเจคเจพ เจฒเฉฑเจเจพ เจเจฟ ETL เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเฉ เจตเจฐเจฃเจจ เจธเจงเจพเจฐเจจ เจชเจพเจเจฅเจจ เจเฉเจก เจนเจจ, เจคเจพเจ เจฎเฉเจ เจเฉเจธเจผเฉ เจฒเจ เจจเฉฑเจเจฟเจ เจจเจนเฉเจ เจธเฉ. เจเจธ เจคเจฐเฉเจนเจพเจ เจกเฉเจเจพ เจธเจเฉเจฐเฉเจฎเจพเจ เจฆเจพ เจธเฉฐเจธเจเจฐเจฃ เจ เจคเฉ เจตเฉฑเจเจฐเจพ เจเฉเจคเจพ เจเจฟเจ เจธเฉ, เจ เจคเฉ เจธเฉเจเจเฉเฉ เจกเฉเจเจพเจฌเฉเจธ เจคเฉเจ เจเฉฑเจ เจธเจฟเฉฐเจเจฒ เจขเจพเจเจเฉ เจฆเฉ เจจเจพเจฒ เจเฉเจฌเจฒ เจจเฉเฉฐ เจเฉฑเจ เจเฉเจเฉ เจตเจฟเฉฑเจ เจชเจพเจเจฃเจพ เจกเฉเจข เจเจพเจ เจฆเฉ 13 โเจธเจเฉเจฐเฉเจจเจพเจ เจตเจฟเฉฑเจ เจชเจพเจเจฅเจจ เจเฉเจก เจฆเจพ เจฎเจพเจฎเจฒเจพ เจฌเจฃ เจเจฟเจ เจธเฉเฅค
เจเจฒเฉฑเจธเจเจฐ เจจเฉเฉฐ เจเจเฉฑเจ เจพ เจเจฐเจจเจพ
เจเจ เจเฉฑเจ เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ เจเจฟเฉฐเจกเจฐเจเจพเจฐเจเจจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจจเจพ เจเจฐเฉเจ, เจ เจคเฉ เจเฉฑเจฅเฉ เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ เจธเจชเฉฑเจธเจผเจ เจเฉเจเจผเจพเจ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจจเจพ เจเจฐเฉเจ, เจเจฟเจตเฉเจ เจเจฟ เจเจ เจฐเจซเจฒเฉ เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเจจเจพ, เจคเฉเจนเจพเจกเฉ เจเฉเจฃเฉ เจนเฉเจ เจกเฉเจเจพเจฌเฉเจธ, เจธเฉเจฒเจฐเฉ เจ เจคเฉ เจกเฉเจเจธ เจตเจฟเฉฑเจ เจตเจฐเจฃเจฟเจค เจนเฉเจฐ เจเฉเจธเฅค
เจคเจพเจ เจเฉ เจ
เจธเฉเจ เจคเฉเจฐเฉฐเจค เจชเฉเจฐเจฏเฉเจ เจธเจผเฉเจฐเฉ เจเจฐ เจธเจเฉเจ, เจฎเฉเจ เจธเจเฉเจ เจเฉเจคเจพ docker-compose.yml
เจเจฟเจธ เจตเจฟเฉฑเจ:
- เจฆเฉ เจ
เจธเจฒ เจตเจฟเฉฑเจ เจเจ เจพเจเจฃ เจเจฐเฉเจ airflow: เจธเจผเจกเจฟเจเจฒเจฐ, เจตเฉเจฌเจธเจฐเจตเจฐเฅค เจธเฉเจฒเจฐเฉ เจฆเฉ เจเฉฐเจฎเจพเจ เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจจ เจฒเจ เจซเจฒเจพเจตเจฐ เจตเฉ เจเฉฑเจฅเฉ เจเฉเฉฐเจฎ เจฐเจฟเจนเจพ เจนเฉเจตเฉเจเจพ (เจเจฟเจเจเจเจฟ เจเจน เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเจธ เจตเจฟเฉฑเจ เจงเฉฑเจเจฟเจ เจเจพ เจเฉเฉฑเจเจพ เจนเฉ
apache/airflow:1.10.10-python3.7
, เจชเจฐ เจธเจพเจจเฉเฉฐ เจเฉเจ เจเจคเจฐเจพเจเจผ เจจเจนเฉเจ เจนเฉ) - PostgreSQL, เจเจฟเจธ เจตเจฟเฉฑเจ เจเจ เจฐเจซเจฒเฉ เจเจชเจฃเฉ เจธเฉเจตเจพ เจเจพเจฃเจเจพเจฐเฉ (เจธเจผเจกเจฟเจเจฒเจฐ เจกเฉเจเจพ, เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจธเจเฉเจเจฟเจธเจเจฟเจเจธ, เจเจฆเจฟ) เจฒเจฟเจเฉเจเจพ, เจ เจคเฉ เจธเฉเจฒเจฐเฉ เจชเฉเจฐเฉ เจเฉเจคเฉ เจเฉฐเจฎเจพเจ เจจเฉเฉฐ เจเจฟเฉฐเจจเฉเจนเจฟเจค เจเจฐเฉเจเฉ;
- เจฐเฉเจกเจฟเจธ, เจเฉ เจธเฉเจฒเจฐเฉ เจฒเจ เจเจพเจธเจ เจฌเฉเจฐเฉเจเจฐ เจตเจเฉเจ เจเฉฐเจฎ เจเจฐเฉเจเจพ;
- เจธเฉเจฒเจฐเฉ เจตเจฐเจเจฐ, เจเฉ เจเจฟ เจเฉฐเจฎเจพเจ เจฆเฉ เจธเจฟเฉฑเจงเฉ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจตเจฟเฉฑเจ เจฒเฉฑเจเฉเจเจพเฅค
- เจซเฉเจฒเจกเจฐ เจจเฉเฉฐ
./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
เจเจฟเฉฑเจชเจฃเฉ:
- เจฐเจเจจเจพ เจฆเฉ เจ
เจธเฉเจเจฌเจฒเฉ เจตเจฟเฉฑเจ, เจฎเฉเจ เจเจพเจซเจผเฉ เจนเฉฑเจฆ เจคเฉฑเจ เจเจพเจฃเฉ-เจชเจเจพเจฃเฉ เจเจฟเฉฑเจคเจฐ 'เจคเฉ เจญเจฐเฉเจธเจพ เจเฉเจคเจพ
puckel/docker- airflow - เจเจธเจฆเฉ เจเจพเจเจ เจเจฐเจจเจพ เจฏเจเฉเจจเฉ เจฌเจฃเจพเจเฅค เจนเฉ เจธเจเจฆเจพ เจนเฉ เจเจฟ เจคเฉเจนเจพเจจเฉเฉฐ เจเจชเจฃเฉ เจเจผเจฟเฉฐเจฆเจเฉ เจตเจฟเฉฑเจ เจนเฉเจฐ เจเจฟเจธเฉ เจเฉเจเจผ เจฆเฉ เจฒเฉเฉ เจจเจพ เจนเฉเจตเฉเฅค - เจธเจพเจฐเฉเจเจ เจเจ
เจฐเจซเจฒเฉ เจธเฉเจเจฟเฉฐเจเจพเจ เจจเจพ เจธเจฟเจฐเจซเจผ เจฐเจพเจนเฉเจ เจเจชเจฒเจฌเจง เจนเจจ
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
, เจเฉ เจเจฟเจธเฉ เจตเฉ (เจตเฉเจง) เจชเจพเจเจฅเจจ เจเฉเจก เจจเฉเฉฐ เจเจฒเจพ เจธเจเจฆเจพ เจนเฉ; - เจเฉเจฐเจพเจเจธเจซเจฐ, เจเฉ เจกเฉเจเจพ เจจเฉเฉฐ เจฅเจพเจ-เจฅเจพเจ เจเฉเจฐเจพเจเจธเจชเฉเจฐเจ เจเจฐเจฆเฉ เจนเจจ, เจเจนเจฟเฉฐเจฆเฉ เจนเจจ,
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)
เจเจ เจเจธเจฆเจพ เจชเจคเจพ เจเจฐเฉเจ:
- เจชเจนเจฟเจฒเจพเจ, เจ เจธเฉเจ เจฒเฉเฉเฉเจเจฆเฉ libs เจ เจคเฉ เจเจฏเจพเจค เจเจฐเจฆเฉ เจนเจพเจ เจเฉเจ เจนเฉเจฐ;
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
เจธเจพเจกเฉ เจเจฟเจเจฒเฉเจฌ 'เจคเฉ, เจ เจคเฉ เจเจฟเจเจฒเฉเจฌ เจธเฉเจเจ เจฎเจธเจผเฉเจจเจพเจ เจจเฉเฉฐ เจ เฉฑเจชเจกเฉเจ เจตเฉฐเจกเจฆเจพ เจนเฉ เจเจฆเฉเจ เจเจธ เจตเจฟเฉฑเจ เจ เจญเฉเจฆ เจนเฉเฉฐเจฆเจพ เจนเฉ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={}
- dag เจเจชเจฃเฉ เจธเจพเจฐเฉ เจเจชเจฐเฉเจเจฐเจพเจ เจจเฉเฉฐ เจเฉฑเจเฉ เจเจฟเจนเฉเจเจ เจฆเจฒเฉเจฒเจพเจ เจตเฉฐเจก เจธเจเจฆเจพ เจนเฉ;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
) - เจคเฉฑเจฅ เจเจน เจนเฉ เจเจฟ เจเจฟเจธเจฎเจพเจ เจฆเฉ เจธเฉเจเฉ เจเจ
เจฐเจซเจฒเฉ เจฎเจพเจกเจฒเจพเจ เจตเจฟเฉฑเจ เจนเจพเจฐเจกเจตเจพเจเจฐเจก เจนเฉ เจ
เจคเฉ เจธเจฐเฉเจค เจเฉเจกเจพเจ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเฉเจคเฉ เจฌเจฟเจจเจพเจ เจตเจฟเจธเจคเจพเจฐ เจจเจนเฉเจ เจเฉเจคเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ (เจเฉ เจ
เจเจพเจจเจ เจฎเฉเจ เจเฉเจ เจเฉเจเจฒ เจจเจนเฉเจ เจเฉเจคเจพ, เจคเจพเจ เจเจฟเจฐเจชเจพ เจเจฐเจเฉ เจฎเฉเจจเฉเฉฐ เจ เฉเจ เจเจฐเฉ), เจชเจฐ เจเฉเจ เจตเฉ เจธเจพเจจเฉเฉฐ เจเฉเจฐเฉเจกเจฟเจ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจคเฉเจ เจฐเฉเจ เจจเจนเฉเจ เจธเจเฉเจเจพ เจจเจพเจฎ
เจคเฉเจธเฉเจ เจเฉฑเจเฉ เจจเจพเจฎ เจฆเฉ เจจเจพเจฒ เจเจ เจเฉเจจเฉเจเจธเจผเจจ เจตเฉ เจฌเจฃเจพ เจธเจเจฆเฉ เจนเฉ: เจเจธ เจเฉเจธ เจตเจฟเฉฑเจ, เจตเจฟเจงเฉ 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
, เจเจฟเจธ เจตเจฟเฉฑเจ Jinja เจชเฉเจฐเจเจฟเจฐเจฟเจ เจเจฐเจจ เจฒเจ เจฎเฉเจเจฐเฉ เจฆเฉ เจเฉเจ เจเจฐเฉเจเจพเฅค - เจฒเจ เจธเจนเฉ เจฆเจฒเฉเจฒเจพเจ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจง เจเฉเจคเจพ
__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 เจธเจฐเจตเจฐ เจคเฉเจ เจตเจฐเจเจฟเจเจพ เจตเจฟเฉฑเจ เจกเฉเจเจพ เจเฉเจฐเจพเจเจธเจซเจฐ เจเจฐเจจ เจฆเจพ เจตเจพเจ เจฆเจพ เจเฉเจคเจพ เจธเฉ, เจ เจคเฉ เจซเจฟเจฐ เจเจธเจจเฉ เจเจธเจจเฉเฉฐ เจฒเจฟเจ เจ เจคเฉ เจตเจฟเจธเจผเฉ เจจเฉเฉฐ เจเฉฑเจก เจฆเจฟเฉฑเจคเจพ, เจฌเจฆเจจเจพเจฎ!
เจเจน เจ เฉฑเจคเจฟเจเจเจพเจฐ เจเจพเจฃเจฌเฉเฉฑเจ เจเฉ เจเฉเจคเจพ เจเจฟเจ เจธเฉ, เจฎเฉเจจเฉเฉฐ เจคเฉเจนเจพเจกเฉ เจฒเจ เจเฉเจ เจธเจผเจฌเจฆเจพเจตเจฒเฉ เจธเจฎเจเจฃเฉ เจธเฉเฅค เจนเฉเจฃ เจคเฉเจธเฉเจ เจนเฉเจฐ เจ เฉฑเจเฉ เจเจพ เจธเจเจฆเฉ เจนเฉเฅค
เจธเจพเจกเฉ เจฏเฉเจเจจเจพ เจเจน เจธเฉ:
- เจกเจพเจ เจเจฐเฉ
- เจเจพเจฐเจ เจคเจฟเจเจฐ เจเจฐเฉ
- เจฆเฉเจเฉ เจเจฟ เจนเจฐ เจเฉเจเจผ เจเจฟเฉฐเจจเฉ เจธเฉเฉฐเจฆเจฐ เจนเฉ
- เจญเจฐเจจ เจฒเจ เจธเฉเจธเจผเจจ เจจเฉฐเจฌเจฐ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐเฉ
- SQL เจธเจฐเจตเจฐ เจคเฉเจ เจกเจพเจเจพ เจชเฉเจฐเจพเจชเจค เจเจฐเฉ
- Vertica เจตเจฟเฉฑเจ เจกเฉเจเจพ เจชเจพเจ
- เจ เฉฐเจเฉเฉ เจเจเฉฑเจ เฉ เจเจฐเฉ
เจเจธ เจฒเจ, เจเจธ เจธเจญ เจจเฉเฉฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจ
เจคเฉ เจเจฒเจพเจเจฃ เจฒเจ, เจฎเฉเจ เจธเจพเจกเฉ เจตเจฟเฉฑเจ เจเฉฑเจ เจเฉเจเจพ เจเจฟเจนเจพ เจตเจพเจงเจพ เจเฉเจคเจพ 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
เจเฉฑเจฅเฉ เจ เจธเฉเจ เจเจ เจพเจเจเจฆเฉ เจนเจพเจ:
- เจฎเฉเจเจผเจฌเจพเจจ เจตเจเฉเจ Vertica
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
.
เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเจ เจฐเจซเจฒเฉ เจจเฉ เจธเจพเจกเฉ เจซเฉฐเจเจธเจผเจจเจพเจ เจฆเฉเจเจ เจฆเจฒเฉเจฒเจพเจ เจจเฉเฉฐ เจเจฟเจธ เจจเจพเจฒ เจญเจฐเจฟเจ เจนเฉ:
เจเฉเจเจฐ เจเฉเจ เจกเจพเจเจพ เจจเจนเฉเจ เจนเฉ, เจคเจพเจ เจเจพเจฐเฉ เจฐเฉฑเจเจฃ เจฆเจพ เจเฉเจ เจฎเจคเจฒเจฌ เจจเจนเฉเจ เจนเฉ. เจชเจฐ เจญเจฐเจจ เจจเฉเฉฐ เจธเจซเจฒ เจฎเฉฐเจจเจฃเจพ เจตเฉ เจ เจเฉเจฌ เจนเฉเฅค เจชเจฐ เจเจน เจเฉเจ เจเจฒเจคเฉ เจจเจนเฉเจ เจนเฉเฅค A-ah-ah, เจเฉ เจเจฐเจจเจพ เจนเฉ ?! เจ เจคเฉ เจเฉฑเจฅเฉ เจเฉ เจนเฉ:
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 (เจเจน เจตเฉฑเจเจฐเจพ เจนเฉเจตเฉเจเจพ เจนเจฐ เจเฉฐเจฎ เจฒเจ),
- เจธเจฐเฉเจค เจ เจคเฉ เจเจฐเจกเจฐ เจเจเจกเฉ เจคเฉเจ เจเฉฑเจ เจนเฉเจธเจผ - เจคเจพเจ เจเฉ เจ เฉฐเจคเจฎ เจกเฉเจเจพเจฌเฉเจธ เจตเจฟเฉฑเจ (เจเจฟเฉฑเจฅเฉ เจธเจญ เจเฉเจ เจเฉฑเจ เจเฉเจฌเจฒ เจตเจฟเฉฑเจ เจชเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ) เจธเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจตเจฟเจฒเฉฑเจเจฃ เจเจฐเจกเจฐ เจเจเจกเฉ เจนเฉ.
เจ เฉฐเจคเจฎ เจชเฉเจพเจ เจฌเจพเจเฉ เจนเฉ: เจนเจฐ เจเฉเจเจผ เจจเฉเฉฐ เจตเจฐเจเฉเจเจพ เจตเจฟเฉฑเจ เจกเฉเจฒเฉเจน เจฆเจฟเจเฅค เจ เจคเฉ, เจ เจเฉเจฌ เจคเฉเจฐ 'เจคเฉ, เจ เจเจฟเจนเจพ เจเจฐเจจ เจฆเฉ เจธเจญ เจคเฉเจ เจธเจผเจพเจจเจฆเจพเจฐ เจ เจคเฉ เจเฉเจธเจผเจฒ เจคเจฐเฉเจเจฟเจเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจนเฉ 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 เจนเฉเจฃ เจคเฉฑเจ เจธเจพเจกเฉ เจฒเจ เจเจพเจซเฉ เจฐเจฟเจนเจพ เจนเฉ, เจชเจฐ เจนเฉเจฃ เจธเจฎเจพเจ เจ เจเจฟเจ เจนเฉ เจเจฟ เจเฉฑเจเฉ-เจเฉฑเจ เจเฉฑเจ เจตเจฐเจเจฐ เจจเจพเจฒ เจตเจฟเจธเจคเจพเจฐ เจเฉเจคเจพ เจเจพเจตเฉ, เจ เจคเฉ เจธเจพเจจเฉเฉฐ CeleryExecutor เจตเจฟเฉฑเจ เจเจพเจฃ เจฒเจ เจธเจเจผเจค เจฎเจฟเจนเจจเจค เจเจฐเจจเฉ เจชเจตเฉเจเฉเฅค เจ เจคเฉ เจเจธ เจคเฉฑเจฅ เจฆเฉ เจฎเฉฑเจฆเฉเจจเจเจผเจฐ เจเจฟ เจคเฉเจธเฉเจ เจเฉฑเจ เจฎเจธเจผเฉเจจ 'เจคเฉ เจเจธ เจจเจพเจฒ เจเฉฐเจฎ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจคเฉเจนเจพเจจเฉเฉฐ เจธเจฐเจตเจฐ 'เจคเฉ เจตเฉ เจธเฉเจฒเจฐเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจคเฉเจ เจเฉเจ เจจเจนเฉเจ เจฐเฉเจเจฆเจพ, เจเฉ เจเจฟ "เจฌเฉเจธเจผเจ, เจเจฆเฉ เจตเฉ เจเจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจ เจจเจนเฉเจ เจเจพเจตเฉเจเจพ, เจเจฎเจพเจจเจฆเจพเจฐเฉ เจจเจพเจฒ!"
- เจเฉเจฐ-เจตเจฐเจคเฉเจ เจฌเจฟเจฒเจ-เจเจจ เจเฉเจฒ:
- เจเฉเจจเฉเจเจธเจผเจจ เจธเฉเจตเจพ เจชเฉเจฐเจฎเจพเจฃ เจชเฉฑเจคเจฐเจพเจ เจจเฉเฉฐ เจธเจเฉเจฐ เจเจฐเจจ เจฒเจ,
- SLA เจฎเจฟเจธ เจธเจฎเฉเจ เจธเจฟเจฐ เจเฉฐเจฎ เจจเจพ เจเจฐเจจ เจตเจพเจฒเฉ เจเฉฐเจฎเจพเจ เจฆเจพ เจเจตเจพเจฌ เจฆเฉเจฃ เจฒเจ,
- xcom เจฎเฉเจเจพเจกเฉเจเจพ เจเจเจธเจเฉเจเจ เจฒเจ (เจฎเฉเจ เจเจฟเจนเจพ เจฎเฉเจเจพเจกเจพเจเจพ!) เจกเฉเจ เจเฉฐเจฎเจพเจ เจฆเฉ เจตเจฟเจเจเจพเจฐเฅค
- เจฎเฉเจฒ เจฆเฉเจฐเจตเจฟเจตเจนเจพเจฐเฅค เจเฉเจฐ, เจฎเฉเจ เจเฉ เจเจนเจฟ เจธเจเจฆเจพ เจนเจพเจ? เจกเจฟเฉฑเจเฉ เจนเฉเจ เจเฉฐเจฎเจพเจ เจฆเฉ เจธเจพเจฐเฉ เจฆเฉเจนเจฐเจพเจ เจฒเจ เจ เจฒเจฐเจ เจธเจฅเจพเจชเจค เจเฉเจคเฉ เจเจ เจธเจจเฅค เจนเฉเจฃ เจฎเฉเจฐเจพ เจเฉฐเจฎ Gmail เจตเจฟเฉฑเจ เจเจ เจฐเจซเจฒเฉ เจคเฉเจ >90k เจเจฎเฉเจฒเจพเจ เจนเจจ, เจ เจคเฉ เจตเฉเจฌ เจฎเฉเจฒ เจฎเจเจผเจฒ เจเฉฑเจ เจธเจฎเฉเจ เจตเจฟเฉฑเจ 100 เจคเฉเจ เจตเฉฑเจง เจจเฉเฉฐ เจเฉเฉฑเจเจฃ เจ เจคเฉ เจฎเจฟเจเจพเจเจฃ เจคเฉเจ เจเจจเจเจพเจฐ เจเจฐเจฆเจพ เจนเฉเฅค
เจนเฉเจฐ เจจเฉเจเจธเจพเจจ:
เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจชเจฟเจเจซเฉเจฒเจเจผ
เจนเฉเจฐ เจเจเฉเจฎเฉเจธเจผเจจ เจเฉเจฒ
เจธเจพเจกเฉ เจนเฉฑเจฅเจพเจ เจจเจพเจฒ เจจเจนเฉเจ, เจธเจพเจกเฉ เจธเจฟเจฐเจพเจ เจจเจพเจฒ เจนเฉเจฐ เจตเฉ เจเฉฐเจฎ เจเจฐเจจ เจฒเจ, เจเจ เจฐเจซเจฒเฉ เจจเฉ เจธเจพเจกเฉ เจฒเจ เจเจน เจคเจฟเจเจฐ เจเฉเจคเจพ เจนเฉ:
REST API - เจเจธ เจเฉเจฒ เจ เจเฉ เจตเฉ เจชเฉเจฐเจฏเฉเจเจพเจคเจฎเจ เจฆเจพ เจฆเจฐเจเจพ เจนเฉ, เจเฉ เจเจธเจจเฉเฉฐ เจเฉฐเจฎ เจเจฐเจจ เจคเฉเจ เจจเจนเฉเจ เจฐเฉเจเจฆเจพเฅค เจเจธ เจฆเฉ เจจเจพเจฒ, เจคเฉเจธเฉเจ เจจเจพ เจธเจฟเจฐเจซเจผ เจกเฉเจ เจ เจคเฉ เจเฉฐเจฎเจพเจ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจชเฉเจฐเจพเจชเจค เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจธเจเฉเจ เจเฉฑเจ เจกเฉเจ เจจเฉเฉฐ เจฐเฉเจ/เจธเจผเฉเจฐเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเฉฑเจ เจกเฉเจเจเฉ เจฐเจจ เจเจพเจ เจเฉฑเจ เจชเฉเจฒ เจฌเจฃเจพ เจธเจเจฆเฉ เจนเฉเฅคCLI - เจเจฎเจพเจเจก เจฒเจพเจเจจ เจฐเจพเจนเฉเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจเฉเจฒ เจเจชเจฒเจฌเจง เจนเจจ เจเฉ WebUI เจฐเจพเจนเฉเจ เจตเจฐเจคเจฃ เจฒเจ เจ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจจเจนเฉเจ เจนเจจ, เจชเจฐ เจเจฎ เจคเฉเจฐ 'เจคเฉ เจเฉเจฐเจนเจพเจเจผเจฐ เจนเจจเฅค เจเจฆเจพเจนเจฐเจฃ เจฒเจ:backfill
เจเจพเจฐเจ เจเจฆเจพเจนเจฐเจจเจพเจ เจจเฉเฉฐ เจฎเฉเฉ เจเจพเจฒเฉ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
เจเจฆเจพเจนเจฐเจฃ เจตเจเฉเจ, เจตเจฟเจธเจผเจฒเฉเจธเจผเจ เจเจ เจ เจคเฉ เจเจฟเจนเจพ: โเจ เจคเฉ เจคเฉเจธเฉเจ, เจเจพเจฎเจฐเฉเจก, 1 เจคเฉเจ 13 เจเจจเจตเจฐเฉ เจคเฉฑเจ เจฆเฉ เจ เฉฐเจเฉเจฟเจเจ เจตเจฟเฉฑเจ เจฌเจเจตเจพเจธ เจนเฉ! เจเจธเจจเฉเฉฐ เจ เฉเจ เจเจฐเฉ, เจเจธเจจเฉเฉฐ เจ เฉเจ เจเจฐเฉ, เจเจธเจจเฉเฉฐ เจ เฉเจ เจเจฐเฉ, เจเจธเจจเฉเฉฐ เจ เฉเจ เจเจฐเฉ!" เจ เจคเฉ เจคเฉเจธเฉเจ เจ เจเจฟเจนเฉ เจนเฉเจฌ เจนเฉ:airflow backfill -s '2020-01-01' -e '2020-01-13' orders
- เจ
เจงเจพเจฐ เจธเฉเจตเจพ:
initdb
,resetdb
,upgradedb
,checkdb
. run
, เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจเจพเจฐเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ, เจ เจคเฉ เจธเจพเจฐเฉเจเจ เจจเจฟเจฐเจญเจฐเจคเจพเจตเจพเจ 'เจคเฉ เจตเฉ เจธเจเฉเจฐ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจคเฉเจธเฉเจ เจเจธเจจเฉเฉฐ เจฆเฉเจเจฐเจพ เจเจฒเจพ เจธเจเจฆเฉ เจนเฉLocalExecutor
, เจญเจพเจตเฉเจ เจคเฉเจนเจพเจกเฉ เจเฉเจฒ เจธเฉเจฒเจฐเฉ เจเจฒเฉฑเจธเจเจฐ เจนเฉเฅค- เจชเจฐเฉเจเฉ เจฌเจนเฉเจค เจเฉเจ เจเจนเฉ เจเจฐเจฆเจพ เจนเฉ
test
, เจธเจฟเจฐเจซเจผ เจเจงเจพเจฐเจพเจ เจตเจฟเฉฑเจ เจตเฉ เจเฉเจ เจจเจนเฉเจ เจฒเจฟเจเจฆเจพเฅค connections
เจธเจผเฉเฉฑเจฒ เจคเฉเจ เจเฉเจจเฉเจเจธเจผเจจ เจฌเจฃเจพเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค
เจชเจพเจเจฅเจจ เจเจชเฉเจเจ - เจชเจฐเจธเจชเจฐ เจเฉเจฐเจฟเจ เจเจฐเจจ เจฆเจพ เจเฉฑเจ เจธเจเจผเจค เจคเจฐเฉเจเจพ, เจเฉ เจชเจฒเฉฑเจเจเจจเจพเจ เจฒเจ เจนเฉ, เจ เจคเฉ เจเจธ เจตเจฟเฉฑเจ เจเฉเจเฉ เจนเฉฑเจฅเจพเจ เจจเจพเจฒ เจเฉเจเจฃเจพ เจจเจนเฉเจ เจนเฉเฅค เจชเจฐ เจธเจพเจจเฉเฉฐ เจเจพเจฃ เจคเฉเจ เจเฉเจฃ เจฐเฉเจเจฆเจพ เจนเฉ/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 เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจจเจพเจฒเฉเจ เจฌเจนเฉเจค เจคเฉเจเจผ เจ
เจคเฉ เจเจธเจพเจจ เจนเฉ เจธเจเจฆเจพ เจนเฉ.
เจฆเฉฑเจธ เจฆเฉเจเจ เจเจฟ เจธเจพเจกเฉ เจธเจพเจฐเฉ เจเฉฐเจฎ เจฌเฉเจเจพเจฌเฉ เจจเจนเฉเจ เจนเฉเฉฐเจฆเฉ, เจชเจฐ เจเจน เจเจ เจตเจพเจฐ เจกเจฟเฉฑเจ เจธเจเจฆเฉ เจนเจจ, เจ เจคเฉ เจเจน เจเจฎ เจเฉฑเจฒ เจนเฉเฅค เจชเจฐ เจเฉเจ เจฐเฉเจเจพเจตเจเจพเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจธเจผเฉฑเจเฉ เจนเจจ, เจ เจคเฉ เจเจธเจฆเฉ เจเจพเจเจ เจเจฐเจจเฉ เจเจผเจฐเฉเจฐเฉ เจนเฉเจตเฉเจเฉเฅค
SQL เจธเจพเจตเจงเจพเจจ!
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
เจนเจตเจพเจฒเฉ
เจ เจคเฉ เจฌเฉเจธเจผเฉฑเจ, เจเฉเจเจฒ เจฆเฉ เจเจพเจฐเฉ เจนเฉเจฃ เจคเฉเจ เจชเจนเจฟเจฒเฉ เจฆเจธ เจฒเจฟเฉฐเจ เจฎเฉเจฐเฉ เจฌเฉเฉฑเจเจฎเจพเจฐเจเจธ เจคเฉเจ เจเจ เจฐเจซเจฒเฉ เจซเฉเจฒเจกเจฐ เจฆเฉ เจธเจฎเฉฑเจเจฐเฉ เจนเจจ.
เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจฆเจธเจคเจพเจตเฉเจเจผ - เจฌเฉเจธเจผเฉฑเจ, เจธเจพเจจเฉเฉฐ เจฆเจซเจผเจคเจฐ เจจเจพเจฒ เจธเจผเฉเจฐเฉ เจเจฐเจจเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ. เจฆเจธเจคเจพเจตเฉเจเจผ, เจชเจฐ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจจเฉเฉฐ เจเฉเจฃ เจชเฉเฉเจนเจฆเจพ เจนเฉ?เจตเจงเฉเจ เจชเฉเจฐเฉเจเจเจฟเจธ - เจ เฉเจ เจนเฉ, เจเฉฑเจเฉ-เจเฉฑเจ เจธเจฟเจฐเจเจฃเจนเจพเจฐเจพเจ เจฆเฉเจเจ เจธเจฟเจซเจผเจพเจฐเจธเจผเจพเจ เจชเฉเฉเจนเฉเฅคเจเจ เจฐเจซเจฒเฉ UI - เจฌเจนเฉเจค เจนเฉ เจธเจผเฉเจฐเฉเจเจค: เจคเจธเจตเฉเจฐเจพเจ เจตเจฟเฉฑเจ เจเจชเจญเฉเจเจคเจพ เจเฉฐเจเจฐเจซเฉเจธเจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจฆเฉ เจฎเฉเฉฑเจ เจธเฉฐเจเจฒเจชเจพเจ เจจเฉเฉฐ เจธเจฎเจเจฃเจพ - เจฌเฉเจจเจฟเจเจฆเฉ เจธเฉฐเจเจฒเจชเจพเจ เจฆเจพ เจเฉฐเจเฉ เจคเจฐเฉเจนเจพเจ เจตเจฐเจฃเจจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจเฉเจเจฐ (เจ เจเจพเจจเจ!) เจคเฉเจธเฉเจ เจฎเฉเจฐเฉ เจคเฉเจ เจเฉเจ เจจเจนเฉเจ เจธเจฎเจเจฟเจ.เจเจฟเจเจจเจฒเฉเจเจ เจฆเจพ เจฌเจฒเฉเจ - เจเฉฑเจ เจเจ เจฐเจซเจฒเฉ เจธเจฐเจตเจฐ/เจเจฒเฉฑเจธเจเจฐ เจเจฟเจตเฉเจ เจฌเจฃเจพเจเจฃเจพ เจนเฉ เจฌเจพเจฐเฉ เจเฉฑเจ เจเจพเจเจก - เจเฉฑเจ เจเจ เจฐเจซเจฒเฉ เจเจฒเฉฑเจธเจเจฐ เจธเจฅเจพเจชเจค เจเจฐเจจ เจฒเจ เจเฉฑเจ เจเฉเจเฉ เจเจพเจเจกเฅคเจฒเจฟเจซเจ 'เจคเฉ เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉ - เจฒเจเจญเจ เจเจนเฉ เจฆเจฟเจฒเจเจธเจช เจฒเฉเจ, เจธเจผเจพเจเจฆ เจตเจงเฉเจฐเฉ เจฐเจธเจฎเฉเจตเจพเจฆ, เจ เจคเฉ เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจจเฉเฉฐ เจเฉฑเจก เจเฉเฅคเจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจธเฉเจฒเจฐเฉ เจตเจฐเจเจฐเจพเจ 'เจคเฉ เจจเฉเจเจฐเฉเจเจ เจเจฟเจตเฉเจ เจตเฉฐเจกเจฆเจพ เจนเฉ - เจธเฉเจฒเจฐเฉ เจฆเฉ เจจเจพเจฒ เจฎเจฟเจฒ เจเฉ เจเฉฐเจฎ เจเจฐเจจ เจฌเจพเจฐเฉเฅคDAG เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจตเจฟเฉฑเจ เจตเจงเฉเจ เจ เจญเจฟเจเจธ เจฒเจฟเจเจฃเจพ - เจเจพเจฐเจเจพเจ เจฆเฉ เจธเฉเจคเฉฐเจคเจฐเจคเจพ เจฌเจพเจฐเฉ, เจฎเจฟเจคเฉ เจฆเฉ เจฌเจเจพเจ เจเจเจกเฉ เจฆเฉเจเจฐเจพ เจฒเฉเจก เจเจฐเจจเจพ, เจชเจฐเจฟเจตเจฐเจคเจจ, เจซเจพเจเจฒ เจฌเจฃเจคเจฐ เจ เจคเฉ เจนเฉเจฐ เจฆเจฟเจฒเจเจธเจช เจเฉเจเจผเจพเจ.เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจตเจฟเฉฑเจ เจจเจฟเจฐเจญเจฐเจคเจพ เจฆเจพ เจชเฉเจฐเจฌเฉฐเจงเจจ เจเจฐเจจเจพ - เจเจพเจฐเจเจพเจ เจฆเฉ เจจเจฟเจฐเจญเจฐเจคเจพ เจ เจคเฉ เจเจฐเจฟเฉฑเจเจฐ เจจเจฟเจฏเจฎ, เจเจฟเจธเจฆเจพ เจฎเฉเจ เจธเจฟเจฐเจซ เจชเจพเจธ เจเจฐเจจ เจตเจฟเฉฑเจ เจเจผเจฟเจเจฐ เจเฉเจคเจพ เจนเฉเฅคเจเจ เจฐเจซเจฒเฉ: เจเจฆเฉเจ เจคเฉเจนเจพเจกเจพ DAG เจ เจจเฉเจธเฉเจเฉ เจคเฉเจ เจฌเจนเฉเจค เจชเจฟเฉฑเจเฉ เจนเฉ - เจธเจผเจกเจฟเจเจฒเจฐ เจตเจฟเฉฑเจ เจเฉเจ "เจเจฐเจพเจฆเฉ เจ เจจเฉเจธเจพเจฐ เจเฉฐเจฎ" เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฆเฉเจฐ เจเจฐเจจเจพ เจนเฉ, เจเฉเฉฐเจฎ เจนเฉเจ เจกเฉเจเจพ เจจเฉเฉฐ เจฒเฉเจก เจเจฐเฉ เจ เจคเฉ เจเจพเจฐเจเจพเจ เจจเฉเฉฐ เจคเจฐเจเฉเจน เจฆเจฟเจเฅคApache Airflow เจฒเจ เจเจชเจฏเฉเจเฉ SQL เจธเจตเจพเจฒ - เจเจ เจฐเจซเจฒเฉ เจฎเฉเจเจพเจกเฉเจเจพ เจฒเจ เจเจชเจฏเฉเจเฉ SQL เจธเจตเจพเจฒเฅคเจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจจเจพเจฒ เจตเจฐเจเจซเจฒเฉ เจตเจฟเจเจธเจฟเจค เจเจฐเจจเจพ เจธเจผเฉเจฐเฉ เจเจฐเฉ - เจเฉฑเจ เจเจธเจเจฎ เจธเฉเจเจธเจฐ เจฌเจฃเจพเจเจฃ เจฌเจพเจฐเฉ เจเฉฑเจ เจเจชเจฏเฉเจเฉ เจญเจพเจ เจนเฉเฅคPresto เจ เจคเฉ Airflow เจฆเฉ เจจเจพเจฒ AWS 'เจคเฉ Fetchr เจกเจพเจเจพ เจธเจพเจเฉฐเจธ เจเจจเจซเจฐเจพ เจฌเจฃเจพเจเจฃเจพ - เจกเฉเจเจพ เจธเจพเจเฉฐเจธ เจฒเจ AWS 'เจคเฉ เจเฉฑเจ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเจพ เจฌเจฃเจพเจเจฃ เจฌเจพเจฐเฉ เจเฉฑเจ เจฆเจฟเจฒเจเจธเจช เจเฉเจเจพ เจจเฉเจเฅคเจเจ เจฐเจซเจฒเฉ DAGs เจจเฉเฉฐ เจกเฉเจฌเฉฑเจ เจเจฐเจจ เจตเฉเจฒเฉ เจเจพเจเจ เจเจฐเจจ เจฒเจ 7 เจเจฎ เจเจฒเจคเฉเจเจ - เจเจฎ เจเจฒเจคเฉเจเจ (เจเจฆเฉเจ เจเฉเจ เจตเจฟเจ เจเจคเฉ เจ เจเฉ เจตเฉ เจจเจฟเจฐเจฆเฉเจธเจผเจพเจ เจจเฉเฉฐ เจจเจนเฉเจ เจชเฉเฉเจนเจฆเจพ).เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจชเจพเจธเจตเจฐเจก เจธเจเฉเจฐ เจ เจคเฉ เจเจเจธเฉเจธ เจเจฐเฉ - เจฎเฉเจธเจเจฐเจพเจ เจเจฟ เจเจฟเจตเฉเจ เจฒเฉเจ เจชเจพเจธเจตเจฐเจก เจธเจเฉเจฐ เจเจฐเจฆเฉ เจนเจจ, เจนเจพเจฒเจพเจเจเจฟ เจคเฉเจธเฉเจ เจธเจฟเจฐเจซเจผ เจเจจเฉเจเจธเจผเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅคเจชเจพเจเจฅเจจ เจ เจคเฉ เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ เจฆเจพ เจเจผเฉเจจ - เจ เจชเฉเจฐเจคเฉฑเจ DAG เจซเจพเจฐเจตเจฐเจกเจฟเฉฐเจ, เจซเฉฐเจเจธเจผเจจเจพเจ เจตเจฟเฉฑเจ เจธเฉฐเจฆเจฐเจญ เจธเฉเฉฑเจเจฃเจพ, เจฎเฉเฉ เจจเจฟเจฐเจญเจฐเจคเจพ เจฌเจพเจฐเฉ, เจ เจคเฉ เจเจพเจธเจ เจฒเจพเจเจเจพเจ เจจเฉเฉฐ เจเฉฑเจกเจฃ เจฌเจพเจฐเฉ เจตเฉเฅคเจเจ เจฐเจซเจฒเฉ: เจเฉฑเจ เจเจพเจฃเฉ-เจชเจเจพเจฃเฉ เจธเฉเจเจพเจ , เจเฉเจฐเจฟเจเจธ เจ เจคเฉ เจตเจงเฉเจ เจ เจญเจฟเจเจธ - เจตเจฐเจคเฉเจ เจฌเจพเจฐเฉdefault arguments
ะธparams
เจเฉเจเจชเจฒเฉเจเจพเจ เจตเจฟเฉฑเจ, เจจเจพเจฒ เจนเฉ เจตเฉเจฐเฉเจเจฌเจฒ เจ เจคเฉ เจเจจเฉเจเจธเจผเจจเจพเจ เจตเจฟเฉฑเจเฅคเจเจ เจฐเจซเจฒเฉ เจธเจผเจกเจฟเจเจฒเจฐ เจฆเฉ เจชเจฐเฉเจซเจพเจเจฒเจฟเฉฐเจ - เจเจธ เจฌเจพเจฐเฉ เจเฉฑเจ เจเจนเจพเจฃเฉ เจเจฟ เจเจฟเจตเฉเจ เจฏเฉเจเจจเจพเจเจพเจฐ เจเจ เจฐเจซเจฒเฉ 2.0 เจฒเจ เจคเจฟเจเจฐเฉ เจเจฐ เจฐเจฟเจนเจพ เจนเฉเฅคเจกเฉเจเจฐ-เจเฉฐเจชเฉเจเจผ เจตเจฟเฉฑเจ 3 เจธเฉเจฒเจฐเฉ เจตเจฐเจเจฐเจพเจ เจจเจพเจฒ เจ เจชเจพเจเฉ เจเจ เจฐเจซเจฒเฉ - เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจเจฒเฉฑเจธเจเจฐ เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเจจ เจฌเจพเจฐเฉ เจเฉฑเจ เจฅเฉเฉเฉเจนเจพ เจชเฉเจฐเจพเจฃเจพ เจฒเฉเจdocker-compose
.เจเจ เจฐเจซเจฒเฉ เจธเฉฐเจฆเจฐเจญ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ 4 เจเฉเจเจชเจฒเฉเจเจฟเฉฐเจ เจเจพเจธเจ - เจเฉเจเจชเจฒเฉเจเจธ เจ เจคเฉ เจธเฉฐเจฆเจฐเจญ เจซเจพเจฐเจตเจฐเจกเจฟเฉฐเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจเจคเฉเจธเจผเฉเจฒ เจเจพเจฐเจเฅคเจเจ เจฐเจซเจฒเฉ เจตเจฟเฉฑเจ เจเจฒเจคเฉ เจธเฉเจเจจเจพเจตเจพเจ - เจฎเฉเจฒ เจ เจคเฉ เจธเจฒเฉเจ เจฆเฉเจเจฐเจพ เจฎเจฟเจเจฐเฉ เจ เจคเฉ เจเจธเจเจฎ เจธเฉเจเจจเจพเจตเจพเจเฅคเจเจ เจฐเจซเจฒเฉ เจตเจฐเจเจธเจผเจพเจช: เจฌเจฟเจจเจพเจ เจฌเฉเจธเจพเจเฉเจเจ เจฆเฉ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจกเฉเจเจเฉ - เจฌเฉเจฐเจพเจเจเจฟเฉฐเจ เจเจพเจธเจ, เจฎเฉเจเจฐเฉ เจ เจคเฉ เจเจเจธเจเจพเจฎเฅค
เจ เจคเฉ เจฒเฉเจ เจตเจฟเฉฑเจ เจตเจฐเจคเฉ เจเจ เจฒเจฟเฉฐเจ:
เจฎเฉเจเจฐเฉ เจนเจตเจพเจฒเจพ - เจเฉเจเจชเจฒเฉเจเจธ เจตเจฟเฉฑเจ เจตเจฐเจคเจฃ เจฒเจ เจชเจฒเฉเจธเจนเฉเจฒเจกเจฐ เจเจชเจฒเจฌเจง เจนเจจเฅคเจเจฎ เจจเฉเจเจธเจพเจจ - เจเจ เจฐเจซเจฒเฉ - เจกเฉเจ เจฌเจฃเจพเจเจฃ เจตเฉเจฒเฉ เจเจฎ เจเจฒเจคเฉเจเจเฅคpuckel/docker-airflow: Docker Apache Airflow -docker-compose
เจชเฉเจฐเจฏเฉเจ, เจกเฉเจฌเฉฑเจเจฟเฉฐเจ เจ เจคเฉ เจนเฉเจฐ เจฒเจเฅคpython-telegram-bot/python-telegram-bot: เจ เจธเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉฑเจ เจฐเฉเจชเจฐ เจฌเจฃเจพเจเจ เจนเฉ เจเจฟเจธ เจคเฉเจ เจคเฉเจธเฉเจ เจเจจเจเจพเจฐ เจจเจนเฉเจ เจเจฐ เจธเจเจฆเฉ - เจเฉเจฒเฉเจเฉเจฐเจพเจฎ REST API เจฒเจ เจชเจพเจเจฅเจจ เจฐเฉเจชเจฐเฅค
เจธเจฐเฉเจค: www.habr.com