Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ, แƒ›แƒ” แƒ•แƒแƒ  แƒ“แƒ˜แƒ›แƒ˜แƒขแƒ แƒ˜ แƒšแƒแƒ’แƒ•แƒ˜แƒœแƒ”แƒœแƒ™แƒ - แƒ™แƒแƒ›แƒžแƒแƒœแƒ˜แƒ Vezet แƒฏแƒ’แƒฃแƒคแƒ˜แƒก แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒ˜แƒก แƒ“แƒ”แƒžแƒแƒ แƒขแƒแƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ˜แƒœแƒŸแƒ˜แƒœแƒ”แƒ แƒ˜.

แƒ›แƒ” แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ— ETL แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ• แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ–แƒ” - Apache Airflow. แƒ›แƒแƒ’แƒ แƒแƒ› Airflow แƒ˜แƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒ›แƒ แƒแƒ•แƒแƒšแƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜ แƒ“แƒ แƒ›แƒ แƒแƒ•แƒแƒšแƒ›แƒฎแƒ แƒ˜แƒ•แƒ˜แƒ, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒ™แƒ•แƒ˜แƒ แƒ“แƒ”แƒ— แƒ›แƒแƒก แƒ›แƒแƒจแƒ˜แƒœแƒแƒช แƒ™แƒ˜, แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒฎแƒแƒ แƒ— แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒแƒ“แƒ”แƒ‘แƒจแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— แƒžแƒ”แƒ แƒ˜แƒแƒ“แƒฃแƒšแƒแƒ“ แƒ“แƒแƒ˜แƒฌแƒงแƒแƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜ แƒ“แƒ แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒแƒ— แƒ›แƒแƒ—แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ.

แƒ“แƒ˜แƒแƒฎ, แƒ›แƒ” แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ—, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ•แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘: แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒแƒก แƒแƒฅแƒ•แƒก แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ™แƒแƒ“แƒ˜, แƒ”แƒ™แƒ แƒแƒœแƒ˜แƒก แƒกแƒฃแƒ แƒแƒ—แƒ˜ แƒ“แƒ แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜.

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ
แƒ แƒแƒกแƒแƒช แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒฎแƒ”แƒ“แƒแƒ•แƒ— แƒกแƒ˜แƒขแƒงแƒ•แƒ Airflow / Wikimedia Commons-แƒจแƒ˜ google-แƒจแƒ˜

แƒกแƒแƒ แƒฉแƒ”แƒ•แƒ˜

แƒจแƒ”แƒกแƒแƒ•แƒแƒšแƒ˜

Apache Airflow แƒ˜แƒกแƒ”แƒ—แƒ˜แƒ•แƒ”แƒ, แƒ แƒแƒ’แƒแƒ แƒช Django:

  • แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜
  • แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒ˜ แƒแƒ“แƒ›แƒ˜แƒœแƒ˜แƒกแƒขแƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒžแƒแƒœแƒ”แƒšแƒ˜,
  • แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒœแƒฃแƒกแƒแƒ–แƒฆแƒ•แƒ แƒ”แƒšแƒ˜ แƒ•แƒแƒ“แƒ˜แƒ—

- แƒ›แƒฎแƒแƒšแƒแƒ“ แƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ˜, แƒ“แƒ แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒ˜แƒ–แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ™แƒ”แƒ แƒซแƒแƒ“ (แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒแƒขแƒแƒก แƒฌแƒ˜แƒœ แƒฌแƒ”แƒ แƒ˜แƒ):

  • แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒ˜ แƒจแƒ”แƒฃแƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒ˜ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ” (แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒœแƒ˜แƒแƒฎแƒฃแƒ แƒ˜/แƒ™แƒฃแƒ‘แƒ”แƒ แƒœแƒ”แƒขแƒ˜ แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒ˜แƒœแƒ“แƒ˜แƒกแƒ˜ แƒ›แƒแƒ’แƒชแƒ”แƒ›แƒ— แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก)
  • แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒ˜ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ— แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ“แƒแƒกแƒแƒฌแƒ”แƒ แƒ˜ แƒ“แƒ แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒ“แƒแƒœ
  • แƒ“แƒ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก แƒ“แƒ API-แƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ—แƒ›แƒแƒœแƒ”แƒ—แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ–แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒกแƒแƒฎแƒšแƒจแƒ˜ แƒ“แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— (แƒ แƒแƒช แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ).

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— Apache Airflow แƒแƒกแƒ”:

  • แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ (แƒ‘แƒ”แƒ•แƒ แƒ˜ SQL Server แƒ“แƒ PostgreSQL แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ API แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ˜แƒ—, แƒ—แƒฃแƒœแƒ“แƒแƒช 1C) DWH-แƒจแƒ˜ แƒ“แƒ ODS-แƒจแƒ˜ (แƒ’แƒ•แƒแƒฅแƒ•แƒก Vertica แƒ“แƒ Clickhouse).
  • แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ” cron, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜แƒ“แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒก ODS-แƒ–แƒ” แƒ“แƒ แƒแƒกแƒ”แƒ•แƒ” แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒก แƒ›แƒแƒ— แƒจแƒ”แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒแƒก.

แƒ‘แƒแƒšแƒ แƒ“แƒ แƒแƒ›แƒ“แƒ” แƒฉแƒ•แƒ”แƒœแƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒคแƒแƒ แƒแƒ•แƒ“แƒ แƒ”แƒ แƒ—แƒ˜ แƒžแƒแƒขแƒแƒ แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ 32 แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒ— แƒ“แƒ 50 GB แƒแƒžแƒ”แƒ แƒแƒขแƒ˜แƒฃแƒšแƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒ—. Airflow-แƒจแƒ˜ แƒ”แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก:

  • แƒ›แƒ”แƒขแƒ˜ 200 แƒ“แƒแƒ’แƒ˜ (แƒ แƒ”แƒแƒšแƒฃแƒ แƒแƒ“ แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒœแƒแƒ™แƒแƒ“แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒจแƒ˜แƒช แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ— แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜),
  • แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒจแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒแƒ“ 70 แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ,
  • แƒ”แƒก แƒกแƒ˜แƒ™แƒ”แƒ—แƒ” แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ (แƒแƒกแƒ”แƒ•แƒ” แƒกแƒแƒจแƒฃแƒแƒšแƒแƒ“) แƒกแƒแƒแƒ—แƒจแƒ˜ แƒ”แƒ แƒ—แƒฎแƒ”แƒš.

แƒ“แƒ แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒคแƒแƒ แƒ—แƒแƒ•แƒ“แƒ˜แƒ—, แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ“แƒแƒ•แƒฌแƒ”แƒ , แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ แƒ’แƒแƒœแƒ•แƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— รผber-แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ’แƒแƒ“แƒแƒ•แƒญแƒ แƒ˜แƒ—:

แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒกแƒแƒ›แƒ˜ แƒฌแƒงแƒแƒ แƒ SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒก แƒแƒฅแƒ•แƒก 50 แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ - แƒ”แƒ แƒ—แƒ˜ แƒžแƒ แƒแƒ”แƒฅแƒขแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒแƒ“, แƒ›แƒแƒ— แƒแƒฅแƒ•แƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ (แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ’แƒแƒœ, mua-ha-ha), แƒ แƒแƒช แƒœแƒ˜แƒจแƒœแƒแƒ•แƒก, แƒ แƒแƒ› แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒก แƒแƒฅแƒ•แƒก Orders แƒชแƒฎแƒ แƒ˜แƒšแƒ˜ (แƒกแƒแƒ‘แƒ”แƒ“แƒœแƒ˜แƒ”แƒ แƒแƒ“, แƒชแƒฎแƒ แƒ˜แƒšแƒ˜ แƒแƒ› แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ‘แƒ˜แƒ–แƒœแƒ”แƒกแƒจแƒ˜ แƒ˜แƒงแƒแƒก แƒฉแƒแƒ แƒ—แƒฃแƒšแƒ˜). แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— (แƒฌแƒงแƒแƒ แƒแƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜, แƒฌแƒงแƒแƒ แƒแƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ, ETL แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก ID) แƒ“แƒ แƒ’แƒฃแƒšแƒฃแƒ‘แƒ แƒงแƒ•แƒ˜แƒšแƒแƒ“ แƒ•แƒงแƒ แƒ˜แƒ— แƒ›แƒแƒ—, แƒ•แƒ—แƒฅแƒ•แƒแƒ—, Vertica-แƒจแƒ˜.

แƒ›แƒแƒ“แƒ˜แƒ— แƒฌแƒแƒ•แƒ˜แƒ“แƒ”แƒ—!

แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ (แƒ“แƒ แƒชแƒแƒขแƒ แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒ˜)

แƒ แƒแƒขแƒแƒ› แƒฉแƒ•แƒ”แƒœ (แƒ“แƒ แƒ—แƒฅแƒ•แƒ”แƒœ)

แƒ แƒแƒชแƒ แƒฎแƒ”แƒ”แƒ‘แƒ˜ แƒ“แƒ˜แƒ“แƒ˜ แƒ˜แƒงแƒ แƒ“แƒ แƒ›แƒ” แƒฃแƒ‘แƒ แƒแƒšแƒ SQLแƒ”แƒ แƒ— แƒ แƒฃแƒกแƒฃแƒš แƒกแƒแƒชแƒแƒšแƒ แƒ•แƒแƒญแƒ แƒแƒ‘แƒแƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ›แƒแƒ•แƒแƒขแƒงแƒฃแƒ”แƒ— ETL แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜, แƒแƒœแƒฃ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒแƒ“แƒ”แƒ‘แƒ˜, แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒแƒ แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—:

  • Informatica Power Center - แƒฃแƒ™แƒ˜แƒ“แƒฃแƒ แƒ”แƒกแƒแƒ“ แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ, แƒฃแƒ™แƒ˜แƒ“แƒฃแƒ แƒ”แƒกแƒแƒ“ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ˜แƒฃแƒšแƒ˜, แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒแƒžแƒแƒ แƒแƒขแƒฃแƒ แƒ˜แƒ—, แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒ—. แƒฆแƒ›แƒ”แƒ แƒ—แƒ›แƒ แƒฅแƒœแƒแƒก แƒ›แƒ˜แƒกแƒ˜ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก 1% แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”. แƒ แƒแƒขแƒแƒ›? แƒ˜แƒกแƒ”, แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ”แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜, แƒกแƒแƒ“แƒฆแƒแƒช 380-แƒ˜แƒแƒœแƒ˜ แƒฌแƒšแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ, แƒ’แƒแƒœแƒ”แƒ‘แƒ แƒ˜แƒ•แƒแƒ“ แƒ–แƒ”แƒฌแƒแƒšแƒแƒก แƒแƒฎแƒ“แƒ”แƒœแƒก แƒฉแƒ•แƒ”แƒœแƒ–แƒ”. แƒ›แƒ”แƒแƒ แƒ”แƒช, แƒ”แƒก แƒ™แƒแƒœแƒขแƒ แƒแƒฅแƒชแƒ˜แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜แƒ แƒฃแƒ™แƒ˜แƒ“แƒฃแƒ แƒ”แƒกแƒแƒ“ แƒšแƒแƒ›แƒแƒ–แƒ˜ แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒจแƒคแƒแƒ—แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒกแƒแƒฌแƒแƒ แƒ›แƒแƒก แƒฎแƒ แƒ˜แƒ™แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ แƒแƒ› แƒฆแƒ˜แƒ แƒก, แƒ˜แƒกแƒ”แƒ•แƒ” แƒ แƒแƒ’แƒแƒ แƒช Airbus AXNUMX แƒคแƒ แƒ—แƒ / แƒฌแƒ”แƒšแƒ˜แƒฌแƒแƒ“แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒแƒ แƒแƒคแƒ”แƒ แƒก แƒ•แƒ˜แƒขแƒงแƒ•แƒ˜แƒ—.

    แƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒแƒ“, แƒกแƒ™แƒ แƒ˜แƒœแƒจแƒแƒขแƒ›แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ“แƒœแƒแƒ• แƒ“แƒแƒแƒ–แƒแƒ แƒแƒšแƒแƒก 30 แƒฌแƒšแƒแƒ›แƒ“แƒ” แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜

    Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

  • SQL Server แƒ˜แƒœแƒขแƒ”แƒ’แƒ แƒแƒชแƒ˜แƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ - แƒ”แƒก แƒแƒ›แƒฎแƒแƒœแƒแƒ’แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ˜แƒ“แƒแƒžแƒ แƒแƒ”แƒฅแƒขแƒฃแƒš แƒœแƒแƒ™แƒแƒ“แƒ”แƒ‘แƒจแƒ˜. แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜: แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— SQL Server-แƒก แƒ“แƒ แƒ แƒแƒขแƒแƒ›แƒฆแƒแƒช แƒแƒ แƒแƒ’แƒแƒœแƒ˜แƒ•แƒ แƒฃแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ›แƒ˜แƒกแƒ˜ ETL แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜. แƒ›แƒแƒกแƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ™แƒแƒ แƒ’แƒ˜แƒ: แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒช แƒšแƒแƒ›แƒแƒ–แƒ˜แƒ แƒ“แƒ แƒžแƒ แƒแƒ’แƒ แƒ”แƒกแƒ˜แƒก แƒแƒœแƒ’แƒแƒ แƒ˜แƒจแƒ”แƒ‘แƒ˜... แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜, แƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒช แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒงแƒ•แƒแƒ แƒก แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ”แƒ‘แƒ˜, แƒแƒฐ, แƒแƒ แƒ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒ˜แƒกแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ dtsx (แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก XML แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜แƒ— แƒจแƒ”แƒ แƒฌแƒงแƒ›แƒฃแƒšแƒ˜ แƒจแƒ”แƒœแƒแƒฎแƒ•แƒแƒ–แƒ”) แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒ แƒแƒ–แƒ แƒ˜ แƒแƒฅแƒ•แƒก? แƒ แƒแƒก แƒ˜แƒขแƒงแƒ•แƒ˜แƒ— แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ“แƒแƒ˜แƒขแƒแƒœแƒก แƒแƒกแƒแƒ‘แƒ˜แƒ— แƒชแƒฎแƒ แƒ˜แƒšแƒก แƒ”แƒ แƒ—แƒ˜ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ›แƒ”แƒแƒ แƒ”แƒ–แƒ”? แƒ“แƒ˜แƒแƒฎ, แƒ แƒ แƒแƒกแƒ˜แƒ, แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ—แƒ˜แƒ—แƒ˜ แƒแƒชแƒ˜ แƒชแƒแƒšแƒ˜แƒ“แƒแƒœ แƒฉแƒแƒ›แƒแƒ•แƒแƒ แƒ“แƒ”แƒ‘แƒ, แƒ›แƒแƒฃแƒกแƒ˜แƒก แƒฆแƒ˜แƒšแƒแƒ™แƒ–แƒ” แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒ—. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ˜แƒก แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒฃแƒคแƒ แƒ แƒ›แƒแƒ“แƒฃแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:

    Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ•แƒ”แƒซแƒ”แƒ‘แƒ“แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒก. แƒกแƒแƒฅแƒ›แƒ” แƒ™แƒ˜ ะฟะพั‡ั‚ะธ แƒ›แƒ˜แƒ•แƒ˜แƒ“แƒ แƒ—แƒ•แƒ˜แƒ—แƒœแƒแƒฌแƒ”แƒ แƒ˜ SSIS แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ—แƒแƒœ ...

โ€ฆแƒ“แƒ แƒ›แƒ”แƒ แƒ” แƒแƒฎแƒแƒšแƒ˜ แƒกแƒแƒ›แƒกแƒแƒฎแƒฃแƒ แƒ˜ แƒ›แƒ˜แƒžแƒแƒ•แƒ. แƒ“แƒ Apache Airflow-แƒ›แƒ แƒ’แƒแƒ›แƒแƒกแƒฌแƒ แƒ แƒ›แƒแƒกแƒ–แƒ”.

แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒ”, แƒ แƒแƒ› ETL แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒ, แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒแƒ  แƒ•แƒชแƒ”แƒ™แƒ•แƒแƒ•แƒ“แƒ˜ แƒกแƒ˜แƒฎแƒแƒ แƒฃแƒšแƒ˜แƒกแƒ’แƒแƒœ. แƒแƒกแƒ” แƒฎแƒ“แƒ”แƒ‘แƒแƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒœแƒแƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒแƒกแƒแƒ‘แƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ แƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ˜ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒชแƒฎแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ”แƒ แƒ— แƒกแƒแƒ›แƒ˜แƒ–แƒœแƒ”แƒจแƒ˜ แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒžแƒ˜แƒ—แƒแƒœแƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒ˜ แƒ’แƒแƒฎแƒ“แƒ แƒ”แƒ แƒ—แƒœแƒแƒฎแƒ”แƒ•แƒแƒ  แƒแƒœ แƒแƒ  13 แƒ“แƒ˜แƒฃแƒ›แƒ˜แƒแƒœ แƒ”แƒ™แƒ แƒแƒœแƒ–แƒ”.

แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ˜แƒก แƒแƒฌแƒงแƒแƒ‘แƒ

แƒœแƒฃ แƒ›แƒแƒ•แƒแƒฌแƒงแƒแƒ‘แƒ— แƒ›แƒ—แƒšแƒ˜แƒแƒœแƒแƒ“ แƒกแƒแƒ‘แƒแƒ•แƒจแƒ•แƒ แƒ‘แƒแƒฆแƒก แƒ“แƒ แƒแƒ  แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒแƒ— แƒแƒฅ แƒกแƒ แƒฃแƒšแƒ˜แƒแƒ“ แƒชแƒฎแƒแƒ“ แƒ แƒแƒฆแƒแƒชแƒ”แƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ Airflow-แƒ˜แƒก, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ”แƒ  แƒแƒ แƒฉแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒก, Celery-แƒ˜แƒก แƒ“แƒ แƒ“แƒแƒ™แƒ”แƒ‘แƒจแƒ˜ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒกแƒฎแƒ•แƒ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ.

แƒ แƒแƒ—แƒ แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜, แƒ“แƒแƒ•แƒฎแƒแƒขแƒ” แƒ”แƒกแƒ™แƒ˜แƒ–แƒ˜ docker-compose.yml แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช:

  • แƒ แƒ”แƒแƒšแƒฃแƒ แƒแƒ“ แƒแƒ•แƒฌแƒ˜แƒแƒ— แƒฐแƒแƒ”แƒ แƒ˜แƒก: แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒ˜, แƒ•แƒ”แƒ‘แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜. แƒงแƒ•แƒแƒ•แƒ˜แƒšแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒขแƒ แƒ˜แƒแƒšแƒ”แƒ‘แƒก แƒ˜แƒฅ แƒœแƒ˜แƒแƒฎแƒฃแƒ แƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒฃแƒ™แƒ•แƒ” แƒฉแƒแƒกแƒ›แƒฃแƒšแƒ˜แƒ apache/airflow:1.10.10-python3.7, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’แƒ˜ แƒแƒ  แƒ•แƒแƒ แƒ—)
  • PostgreSQL, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช Airflow แƒฉแƒแƒฌแƒ”แƒ แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒแƒก (แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒก, แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒแƒก แƒ“แƒ แƒ.แƒจ.), แƒฎแƒแƒšแƒ Celery แƒ›แƒแƒœแƒ˜แƒจแƒœแƒแƒ•แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒš แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก;
  • Redis, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ‘แƒ แƒแƒ™แƒ”แƒ แƒก Celery-แƒกแƒ—แƒ•แƒ˜แƒก;
  • แƒœแƒ˜แƒแƒฎแƒฃแƒ แƒ˜แƒก แƒ›แƒฃแƒจแƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒฃแƒจแƒฃแƒแƒšแƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒแƒจแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ“แƒแƒ™แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜.
  • แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ ./dags แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒก dags-แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒ—. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒ˜แƒงแƒ•แƒแƒœแƒ”แƒœ แƒคแƒ แƒ”แƒœแƒ˜แƒก แƒ“แƒ แƒแƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒ“แƒแƒชแƒ”แƒ›แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ“แƒแƒกแƒขแƒแƒ–แƒ” แƒŸแƒแƒœแƒ’แƒšแƒ˜แƒ แƒ”แƒ‘แƒ.

แƒ–แƒแƒ’แƒ˜แƒ”แƒ แƒ— แƒแƒ“แƒ’แƒ˜แƒšแƒแƒก, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒจแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒแƒ“ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜ (แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒแƒ  แƒ›แƒแƒฎแƒ“แƒ”แƒก แƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ“แƒแƒ‘แƒ˜แƒœแƒซแƒฃแƒ แƒ”แƒ‘แƒ), แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒแƒ“แƒฆแƒแƒช แƒ˜แƒ’แƒ˜ แƒจแƒ”แƒชแƒ•แƒšแƒ˜แƒšแƒ˜แƒ แƒžแƒ แƒแƒชแƒ”แƒกแƒจแƒ˜. แƒกแƒแƒ›แƒฃแƒจแƒแƒ แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒกแƒแƒชแƒแƒ•แƒจแƒ˜ https://github.com/dm-logv/airflow-tutorial.

docker-compose.yml

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, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— (แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒฌแƒงแƒแƒšแƒแƒ‘แƒ˜แƒ—), แƒ แƒแƒ›แƒšแƒ˜แƒ—แƒแƒช แƒ›แƒ” แƒ›แƒแƒ•แƒœแƒ”แƒ“ แƒ•แƒ˜แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ”.
  • แƒ‘แƒฃแƒœแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜แƒ, แƒ˜แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒ›แƒ–แƒแƒ“ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก: แƒ›แƒ” แƒ’แƒแƒœแƒ–แƒ แƒแƒฎ แƒแƒ  แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ” แƒ’แƒฃแƒšแƒ˜แƒกแƒชแƒ”แƒ›แƒ แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ”แƒ‘แƒ–แƒ”, แƒแƒ  แƒจแƒ”แƒ•แƒแƒฌแƒฃแƒฎแƒ” แƒฃแƒกแƒแƒคแƒ แƒ—แƒฎแƒแƒ”แƒ‘แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ” แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒกแƒแƒคแƒ”แƒ แƒ˜แƒกแƒ˜ แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ แƒ˜.
  • แฒฉแƒแƒ˜แƒœแƒ˜แƒจแƒœแƒ”:
    • dag แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ แƒแƒ’แƒแƒ แƒช แƒ“แƒแƒ›แƒ’แƒ”แƒ’แƒ›แƒแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒฃแƒจแƒแƒ™แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.
    • แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ”แƒฎแƒ”แƒ‘แƒ แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ›แƒฎแƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒแƒก - แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ”, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒแƒฅแƒ•แƒ— แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜ แƒ“แƒ แƒ›แƒฃแƒจแƒ”แƒ‘แƒ˜.

แƒ˜แƒกแƒ”, แƒแƒฎแƒšแƒ แƒ”แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ:

$ docker-compose up --scale worker=3

แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ แƒแƒช แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ“แƒแƒฎแƒ”แƒ“แƒแƒ— แƒ•แƒ”แƒ‘ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ”แƒ‘แƒก:

แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒชแƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ•แƒ”แƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒแƒ˜แƒ’แƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒ แƒแƒ› "แƒ“แƒแƒ’แƒจแƒ˜", แƒ›แƒแƒจแƒ˜แƒœ แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ›แƒแƒ™แƒšแƒ” แƒšแƒ”แƒฅแƒกแƒ˜แƒ™แƒแƒœแƒ˜:

  • Scheduler - แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜ แƒ‘แƒ˜แƒซแƒ Airflow-แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒก, แƒ แƒแƒ› แƒ แƒแƒ‘แƒแƒขแƒ”แƒ‘แƒ˜ แƒ‘แƒ”แƒ•แƒ แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ”แƒœ แƒ“แƒ แƒแƒ แƒ แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒ˜: แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒก แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒก, แƒ’แƒแƒœแƒแƒแƒฎแƒšแƒ”แƒ‘แƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก, แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก.

    แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒซแƒ•แƒ”แƒš แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒจแƒ˜ แƒ›แƒแƒก แƒฐแƒฅแƒแƒœแƒ“แƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒกแƒ—แƒแƒœ (แƒแƒ แƒ, แƒแƒ แƒ แƒแƒ›แƒœแƒ”แƒ–แƒ˜แƒ, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ’แƒแƒŸแƒแƒœแƒ•แƒ) แƒ“แƒ แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒจแƒ˜แƒช แƒ™แƒ˜ แƒ“แƒแƒ แƒฉแƒ run_duration - แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ™แƒแƒ แƒ’แƒแƒ“แƒแƒ.

  • DAG (aka "dag") - "แƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒแƒชแƒ˜แƒ™แƒšแƒฃแƒ แƒ˜ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜", แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒกแƒ”แƒ—แƒ˜ แƒ’แƒแƒœแƒ›แƒแƒ แƒขแƒ”แƒ‘แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒ“แƒแƒ›แƒ˜แƒแƒœแƒก แƒ”แƒขแƒงแƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜ แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒ˜แƒœแƒ”แƒ แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒฃแƒ แƒ—แƒ˜แƒ”แƒ แƒ—แƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒœ แƒ”แƒ แƒ—แƒ›แƒแƒœแƒ”แƒ—แƒ—แƒแƒœ (แƒ˜แƒฎ. แƒฅแƒ•แƒ”แƒ›แƒแƒ—) แƒแƒœ แƒžแƒแƒ™แƒ”แƒขแƒ˜แƒก แƒแƒœแƒแƒšแƒแƒ’แƒ˜ SSIS-แƒจแƒ˜ แƒ“แƒ Workflow Informatica-แƒจแƒ˜. .

    แƒ“แƒแƒฆแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ“แƒ, แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ“แƒ”แƒก แƒฅแƒ•แƒ”แƒ“แƒแƒ’แƒ”แƒ‘แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ›, แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ“, แƒ›แƒแƒ— แƒ•แƒ”แƒ  แƒ›แƒ˜แƒ•แƒแƒฆแƒฌแƒ”แƒ•แƒ—.

  • DAG Run - แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ dag, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ”แƒœแƒ˜แƒญแƒ”แƒ‘แƒ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ 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)

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒแƒ แƒ™แƒ•แƒ˜แƒแƒ—:

  • แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ›แƒแƒ•แƒ˜แƒขแƒแƒœแƒ— แƒกแƒแƒญแƒ˜แƒ แƒ แƒšแƒ˜แƒ‘แƒ”แƒ‘แƒก แƒ“แƒ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ แƒแƒฆแƒแƒช;
  • sql_server_ds - แƒ แƒแƒ›แƒ“แƒ”แƒœแƒแƒ“ List[namedtuple[str, str]] แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒ— Airflow Connections-แƒ“แƒแƒœ แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ˜แƒ—, แƒกแƒแƒ˜แƒ“แƒแƒœแƒแƒช แƒแƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒคแƒ˜แƒ แƒคแƒ˜แƒขแƒแƒก;
  • dag - แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ“แƒแƒ’แƒ˜แƒก แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฃแƒชแƒ˜แƒšแƒ”แƒ‘แƒšแƒแƒ“ แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก globals()แƒ—แƒแƒ แƒ”แƒ› Airflow แƒ•แƒ”แƒ  แƒ˜แƒžแƒแƒ•แƒ˜แƒก. แƒ“แƒฃแƒ’แƒ›แƒ แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒœแƒ“แƒ แƒ—แƒฅแƒ•แƒแƒก:
    • แƒ แƒ แƒฅแƒ•แƒ˜แƒ orders - แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ”แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜ แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒ•แƒ”แƒ‘ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜,
    • แƒ แƒแƒ› แƒ˜แƒก แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒ แƒ•แƒ แƒ˜แƒ•แƒšแƒ˜แƒกแƒ˜แƒก แƒจแƒฃแƒแƒฆแƒแƒ›แƒ”แƒ“แƒแƒœ,
    • แƒ“แƒ แƒ˜แƒก แƒฃแƒœแƒ“แƒ แƒ˜แƒ›แƒฃแƒจแƒแƒแƒก, แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— แƒงแƒแƒ•แƒ”แƒš 6 แƒกแƒแƒแƒ—แƒจแƒ˜ (แƒ›แƒ™แƒแƒชแƒ แƒ˜ แƒ‘แƒ˜แƒญแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒฅ แƒœแƒแƒชแƒ•แƒšแƒแƒ“ timedelta() แƒ“แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ cron- แƒฎแƒแƒ–แƒ˜ 0 0 0/6 ? * * *, แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒ›แƒแƒ’แƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก - แƒ’แƒแƒ›แƒแƒ—แƒฅแƒ›แƒ แƒ›แƒแƒกแƒฌแƒแƒœแƒก @daily);
  • workflow() แƒ›แƒ—แƒแƒ•แƒแƒ  แƒกแƒแƒฅแƒ›แƒ”แƒก แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒ แƒแƒฎแƒšแƒ. แƒแƒ› แƒ“แƒ แƒแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒขแƒแƒœแƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒก แƒŸแƒฃแƒ แƒœแƒแƒšแƒจแƒ˜.
  • แƒแƒฎแƒšแƒ แƒ™แƒ˜ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ›แƒแƒ’แƒ˜แƒ:
    • แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒ“แƒ˜แƒ•แƒแƒ แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒจแƒ˜;
    • แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ PythonOperator, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒ“แƒฃแƒ›แƒก workflow(). แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒฃแƒœแƒ˜แƒ™แƒแƒšแƒฃแƒ แƒ˜ (แƒ“แƒแƒ’แƒ˜แƒก แƒคแƒแƒ แƒ’แƒšแƒ”แƒ‘แƒจแƒ˜) แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒก แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ แƒ“แƒ แƒ—แƒแƒ•แƒแƒ“ แƒ“แƒแƒ’แƒ˜แƒก แƒ›แƒ˜แƒ‘แƒ›แƒ. แƒ“แƒ แƒแƒจแƒ provide_context แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒก แƒฉแƒแƒแƒกแƒฎแƒแƒ›แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒฉแƒ•แƒ”แƒœ แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒ— แƒ•แƒแƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ— **context.

แƒฏแƒ”แƒ -แƒฏแƒ”แƒ แƒแƒ‘แƒ˜แƒ— แƒกแƒฃแƒš แƒ”แƒกแƒแƒ. แƒ แƒแƒช แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ—:

  • แƒแƒฎแƒแƒšแƒ˜ แƒ“แƒแƒ แƒขแƒงแƒ›แƒ แƒ•แƒ”แƒ‘ แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒจแƒ˜,
  • แƒแƒกแƒ˜ แƒœแƒแƒฎแƒ”แƒ•แƒแƒ แƒ˜ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ แƒžแƒแƒ แƒแƒšแƒ”แƒšแƒฃแƒ แƒแƒ“ (แƒ—แƒฃ แƒแƒ›แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ˜แƒซแƒšแƒ”แƒ•แƒ Airflow, Celery แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒแƒชแƒฃแƒšแƒแƒ‘แƒ).

แƒ˜แƒกแƒ”, แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒ›แƒ˜แƒ•แƒฎแƒ•แƒ“แƒ˜.

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ
แƒ•แƒ˜แƒœ แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒก แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก?

แƒแƒ› แƒงแƒ•แƒ”แƒšแƒแƒคแƒ แƒ˜แƒก แƒ’แƒแƒกแƒแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒ‘แƒšแƒแƒ“, แƒ›แƒ” แƒฉแƒแƒ•แƒ“แƒ”แƒฅแƒ˜ docker-compose.yml แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ requirements.txt แƒงแƒ•แƒ”แƒšแƒ แƒ™แƒ•แƒแƒœแƒซแƒ–แƒ”.

แƒแƒฎแƒšแƒ แƒ˜แƒก แƒ’แƒแƒฅแƒ แƒ:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒœแƒแƒชแƒ แƒ˜แƒกแƒคแƒ”แƒ แƒ˜ แƒ™แƒ•แƒแƒ“แƒ แƒแƒขแƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ .

แƒฉแƒ•แƒ”แƒœ แƒชแƒแƒขแƒแƒก แƒ•แƒ”แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒ—, แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒœ แƒ›แƒฃแƒจแƒ”แƒ‘แƒ˜:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ›แƒฌแƒ•แƒแƒœแƒ”แƒ”แƒ‘แƒ›แƒ, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒแƒแƒกแƒ แƒฃแƒšแƒ”แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒ. แƒฌแƒ˜แƒ—แƒšแƒ”แƒ‘แƒ˜ แƒแƒ แƒช แƒ—แƒฃ แƒ˜แƒกแƒ” แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒแƒœ.

แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒ–แƒ” แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ” ./dags, แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก - แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒ แƒขแƒงแƒ›แƒ แƒ“แƒ”แƒ•แƒก git แƒฉแƒ•แƒ”แƒœแƒก Gitlab-แƒ–แƒ” แƒ“แƒ Gitlab CI แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ–แƒ” แƒ’แƒแƒ”แƒ แƒ—แƒ˜แƒแƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก master.

แƒชแƒแƒขแƒ แƒ แƒแƒ› แƒงแƒ•แƒแƒ•แƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘

แƒกแƒแƒœแƒแƒ› แƒ›แƒฃแƒจแƒ”แƒ‘แƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒแƒฌแƒแƒ•แƒแƒ แƒแƒก แƒฃแƒ แƒขแƒงแƒแƒ›แƒ”แƒœ, แƒ’แƒแƒ•แƒ˜แƒฎแƒกแƒ”แƒœแƒแƒ— แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ แƒแƒฆแƒแƒชแƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ - แƒงแƒ•แƒแƒ•แƒ˜แƒšแƒ˜.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜แƒ•แƒ” แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜ แƒ›แƒฃแƒจแƒแƒ—แƒ แƒ™แƒ•แƒแƒœแƒซแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒจแƒ”แƒ›แƒแƒฏแƒแƒ›แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒ—:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ˜แƒœแƒขแƒ”แƒœแƒกแƒ˜แƒฃแƒ แƒ˜ แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ“แƒœแƒ”แƒœ:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ›แƒแƒกแƒแƒฌแƒงแƒ”แƒœแƒ˜ แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ‘แƒ แƒแƒ™แƒ”แƒ แƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜แƒ—:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒœแƒแƒ—แƒ”แƒšแƒ˜ แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜แƒก แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒฃแƒšแƒก แƒ•แƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ•แƒ—

แƒแƒกแƒ” แƒ แƒแƒ›, แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒญแƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜ แƒฌแƒแƒ˜แƒงแƒ•แƒแƒœแƒแƒ—.

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ“แƒ แƒ˜แƒงแƒ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒ“แƒแƒญแƒ แƒ˜แƒšแƒ˜ - แƒแƒ›แƒ แƒ—แƒฃ แƒ˜แƒ› แƒ›แƒ˜แƒ–แƒ”แƒ–แƒ˜แƒก แƒ’แƒแƒ›แƒ. Airflow-แƒ˜แƒก แƒกแƒฌแƒแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒ”แƒก แƒ™แƒ•แƒแƒ“แƒ แƒแƒขแƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒ˜แƒ›แƒแƒ–แƒ”, แƒ แƒแƒ› แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒแƒ  แƒ›แƒแƒ•แƒ˜แƒ“แƒ.

แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒฃแƒงแƒฃแƒ แƒแƒ— แƒŸแƒฃแƒ แƒœแƒแƒšแƒก แƒ“แƒ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒแƒ— แƒ“แƒแƒชแƒšแƒ˜แƒšแƒ˜ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ”แƒ‘แƒ˜.

แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ™แƒ•แƒแƒ“แƒ แƒแƒขแƒ–แƒ” แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒ•แƒœแƒแƒฎแƒแƒ•แƒ— แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ› แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒก:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒ˜แƒฆแƒแƒ— แƒ“แƒ แƒ’แƒแƒแƒกแƒฃแƒคแƒ—แƒแƒ•แƒแƒ— แƒ“แƒแƒชแƒ”แƒ›แƒฃแƒšแƒ˜. แƒแƒœแƒฃ, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ‘แƒ, แƒ แƒแƒ› แƒ˜แƒฅ แƒ แƒแƒฆแƒแƒช แƒ•แƒ”แƒ  แƒ›แƒแƒฎแƒ”แƒ แƒฎแƒ“แƒ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒ˜แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ แƒ’แƒแƒ“แƒแƒ•แƒ แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒ–แƒ”.

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒœแƒแƒ—แƒ”แƒšแƒ˜แƒ, แƒ แƒแƒ› แƒ›แƒแƒฃแƒกแƒ˜แƒ— แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ แƒฌแƒ˜แƒ—แƒ”แƒšแƒ˜ แƒ™แƒ•แƒแƒ“แƒ แƒแƒขแƒ˜แƒ— แƒแƒ  แƒแƒ แƒ˜แƒก แƒซแƒแƒšแƒ˜แƒแƒœ แƒฐแƒฃแƒ›แƒแƒœแƒฃแƒ แƒ˜ - แƒแƒ›แƒแƒก แƒแƒ  แƒ•แƒ”แƒšแƒ˜แƒ— Airflow-แƒกแƒ’แƒแƒœ. แƒ‘แƒฃแƒœแƒ”แƒ‘แƒ แƒ˜แƒ•แƒ˜แƒ, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ›แƒแƒกแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ’แƒแƒœแƒแƒ“แƒ’แƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒแƒ แƒแƒฆแƒ˜: Browse/Task Instances

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ›แƒแƒ“แƒ˜แƒ— แƒแƒ•แƒ˜แƒ แƒฉแƒ˜แƒแƒ— แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ“แƒ แƒ’แƒแƒ“แƒแƒ•แƒแƒ‘แƒ แƒฃแƒœแƒแƒ— แƒœแƒฃแƒšแƒ–แƒ”, แƒ“แƒแƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ— แƒกแƒฌแƒแƒ  แƒžแƒฃแƒœแƒฅแƒขแƒ–แƒ”:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ“แƒแƒกแƒฃแƒคแƒ—แƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒขแƒแƒฅแƒกแƒ”แƒ‘แƒ˜ แƒแƒกแƒ” แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ (แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒฃแƒ™แƒ•แƒ” แƒ”แƒšแƒ˜แƒแƒœ แƒ’แƒแƒœแƒ แƒ˜แƒ’แƒ˜แƒก แƒ“แƒแƒœแƒ˜แƒจแƒ•แƒœแƒแƒก):

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜, แƒ™แƒแƒ™แƒ•แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜

แƒ“แƒ แƒแƒ แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ DAG-แƒก, 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 - แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒ•แƒ˜แƒจแƒšแƒ˜แƒก แƒฎแƒ”แƒšแƒก แƒจแƒ”แƒ’แƒ•แƒ”แƒฅแƒ›แƒœแƒ แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜, แƒ แƒ˜แƒ—แƒแƒช แƒ•แƒ˜แƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ”แƒ— Unblocked-แƒ–แƒ” แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒ’แƒ–แƒแƒ•แƒœแƒแƒ“ แƒžแƒแƒขแƒแƒ แƒ แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ˜แƒ—. (แƒแƒ› แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ–แƒ” แƒ“แƒแƒฌแƒ•แƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ— แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘แƒ—);
  • default_args={} - dag-แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ•แƒ แƒชแƒ”แƒšแƒ”แƒ‘แƒ แƒ›แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ–แƒ”;
  • to='{{ var.value.all_the_kings_men }}' - แƒ•แƒ”แƒšแƒ˜ to แƒฉแƒ•แƒ”แƒœ แƒแƒ  แƒ’แƒ•แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒงแƒแƒ แƒ˜ แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒ˜แƒœแƒแƒ›แƒ˜แƒฃแƒ แƒแƒ“ แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ Jinja-แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒ”แƒš.แƒคแƒแƒกแƒขแƒ˜แƒก แƒกแƒ˜แƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒ” แƒคแƒ แƒ—แƒฎแƒ˜แƒšแƒแƒ“ แƒฉแƒแƒ•แƒ“แƒ” Admin/Variables;
  • trigger_rule=TriggerRule.ALL_SUCCESS - แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ‘แƒ. แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒฃแƒคแƒ แƒแƒกแƒ”แƒ‘แƒ˜แƒกแƒ™แƒ”แƒœ แƒ›แƒ˜แƒคแƒ แƒ˜แƒœแƒแƒ•แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ—แƒฃ แƒงแƒ•แƒ”แƒšแƒ แƒ“แƒแƒ›แƒแƒ™แƒ˜แƒ“แƒ”แƒ‘แƒฃแƒšแƒ”แƒ‘แƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—;
  • tg_bot_conn_id='tg_main' - แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ conn_id แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก ID-แƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒจแƒ˜แƒช แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— Admin/Connections;
  • trigger_rule=TriggerRule.ONE_FAILED - Telegram-แƒจแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ’แƒแƒคแƒ แƒ˜แƒœแƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ—แƒฃ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜;
  • task_concurrency=1 - แƒฉแƒ•แƒ”แƒœ แƒ•แƒ™แƒ แƒซแƒแƒšแƒแƒ•แƒ— แƒ”แƒ แƒ—แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒš แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒก. แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒแƒก VerticaOperator (แƒ”แƒ แƒ— แƒ›แƒแƒ’แƒ˜แƒ“แƒแƒก แƒฃแƒงแƒฃแƒ แƒ”แƒ‘แƒก);
  • report_update >> [email, tg] - แƒงแƒ•แƒ”แƒšแƒ VerticaOperator แƒ—แƒแƒœแƒฎแƒ•แƒ”แƒ“แƒ แƒ แƒฌแƒ”แƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒกแƒแƒก, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ:
    Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

    แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ“แƒ’แƒแƒœ แƒจแƒ”แƒ›แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒš แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒก แƒแƒฅแƒ•แƒ— แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒกแƒฎแƒ•แƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜, แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ”แƒ แƒ—แƒ˜ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก. แƒฎแƒ”แƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒ“แƒจแƒ˜ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒ•แƒ˜แƒ–แƒฃแƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒฃแƒ แƒ”แƒ‘แƒ:
    Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒกแƒ˜แƒขแƒงแƒ•แƒแƒก แƒ•แƒ˜แƒขแƒงแƒ•แƒ˜ แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ›แƒแƒ™แƒ แƒแƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ›แƒแƒ—แƒ˜ แƒ›แƒ”แƒ’แƒแƒ‘แƒ แƒ”แƒ‘แƒ˜ - แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜.

แƒ›แƒแƒ™แƒ แƒ แƒแƒ แƒ˜แƒก Jinja แƒฉแƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒ, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒจแƒ”แƒชแƒ•แƒแƒšแƒแƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒจแƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒกแƒ”:

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. แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒแƒ แƒ˜แƒก แƒ˜แƒก, แƒ แƒแƒ› แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒฃแƒ แƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒ›แƒแƒ’แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ˜แƒก แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ–แƒ” (แƒ™แƒ•แƒแƒ“แƒ แƒแƒขแƒ˜ แƒฎแƒ”แƒ”แƒ‘แƒ˜แƒก แƒฎแƒ”แƒ“แƒจแƒ˜) แƒ“แƒ แƒ’แƒแƒ“แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ˜แƒกแƒแƒก, แƒฉแƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ•แƒ“แƒ”แƒ‘แƒ แƒ˜แƒ›แƒแƒ•แƒ” แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ–แƒ”.

แƒ›แƒ˜แƒœแƒ˜แƒญแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒฎแƒ•แƒ แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ Rendered แƒฆแƒ˜แƒšแƒแƒ™แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒš แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒแƒ–แƒ”. แƒแƒกแƒ”แƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒฌแƒ”แƒ แƒ˜แƒšแƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒ—:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒฉแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ™แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒกแƒ แƒฃแƒšแƒ˜ แƒกแƒ˜แƒ แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒแƒฅ: แƒ›แƒแƒ™แƒ แƒ แƒ›แƒ˜แƒœแƒ˜แƒจแƒœแƒ”แƒ‘แƒ

แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒ˜แƒช, แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒแƒชแƒฎแƒแƒ“แƒแƒ— แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ แƒ›แƒแƒ™แƒ แƒแƒ”แƒ‘แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒกแƒฎแƒ•แƒ แƒแƒ›แƒ‘แƒแƒ•แƒ˜แƒ.

แƒ’แƒแƒ แƒ“แƒ แƒฌแƒ˜แƒœแƒแƒกแƒฌแƒแƒ  แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ แƒœแƒ˜แƒ•แƒ—แƒ”แƒ‘แƒ˜แƒกแƒ, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ (แƒ”แƒก แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ” แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒš แƒ™แƒแƒ“แƒจแƒ˜). แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒจแƒ˜แƒ’แƒœแƒ˜แƒ— Admin/Variables แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒแƒ›:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ แƒแƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ—:

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 แƒฉแƒ•แƒ”แƒœ แƒ•แƒฅแƒ›แƒœแƒ˜แƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒก, แƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒกแƒ•แƒšแƒแƒก/แƒžแƒแƒ แƒแƒšแƒก แƒ“แƒ แƒฃแƒคแƒ แƒ แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒก. แฒแƒ›แƒ’แƒ•แƒแƒ แƒแƒ“:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒžแƒแƒ แƒแƒšแƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒšแƒ˜ (แƒฃแƒคแƒ แƒ แƒกแƒแƒคแƒฃแƒซแƒ•แƒšแƒ˜แƒแƒœแƒแƒ“, แƒ•แƒ˜แƒ“แƒ แƒ” แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜), แƒแƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒแƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜แƒก แƒขแƒ˜แƒžแƒ˜ (แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ” แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ” tg_main) - แƒคแƒแƒฅแƒขแƒ˜แƒ, แƒ แƒแƒ› แƒขแƒ˜แƒžแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ แƒ“แƒแƒ›แƒแƒ’แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Airflow-แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒจแƒ˜ แƒ“แƒ แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ•แƒ“แƒ”แƒก แƒกแƒแƒฌแƒงแƒ˜แƒก แƒ™แƒแƒ“แƒ”แƒ‘แƒจแƒ˜ แƒ›แƒแƒฎแƒ•แƒ”แƒ“แƒ แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” (แƒ—แƒฃ แƒฃแƒชแƒ”แƒ‘ แƒแƒ  แƒ›แƒแƒ•แƒซแƒ”แƒ‘แƒœแƒ” แƒ แƒแƒ›แƒ”, แƒจแƒ”แƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ—), แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒจแƒ”แƒ’แƒ•แƒ˜แƒจแƒšแƒ˜แƒก แƒ™แƒ แƒ”แƒ“แƒ˜แƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒแƒจแƒ˜ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒฎแƒ”แƒšแƒ˜.

แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ˜แƒ›แƒแƒ•แƒ” แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ—: แƒแƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ BaseHook.get_connection(), แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒก แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ—, แƒ›แƒแƒ’แƒ•แƒชแƒ”แƒ›แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ—แƒ˜ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒกแƒแƒฎแƒ”แƒšแƒ˜แƒ“แƒแƒœ (แƒฃแƒคแƒ แƒ แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ Round Robin-แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ“แƒ˜แƒ— แƒ”แƒก Airflow แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒœแƒ“แƒ˜แƒกแƒ–แƒ” แƒ“แƒแƒ•แƒขแƒแƒ•แƒแƒ—).

แƒชแƒ•แƒšแƒแƒ“แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ›แƒแƒ’แƒแƒ แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ, แƒ แƒแƒ› แƒแƒ  แƒ“แƒแƒ™แƒแƒ แƒ’แƒแƒ— แƒ‘แƒแƒšแƒแƒœแƒกแƒ˜: แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒœแƒแƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒ›แƒ”แƒš แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒก แƒ˜แƒœแƒแƒฎแƒแƒ•แƒ— แƒ—แƒแƒ•แƒแƒ“ แƒ™แƒแƒ“แƒจแƒ˜ แƒ“แƒ แƒ แƒแƒ›แƒ”แƒš แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒก แƒแƒซแƒšแƒ”แƒ•แƒ— Airflow-แƒก แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒแƒ“. แƒ”แƒ แƒ—แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒ›แƒแƒกแƒแƒฎแƒ”แƒ แƒฎแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒจแƒ”แƒชแƒ•แƒšแƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒกแƒแƒคแƒแƒกแƒขแƒ แƒงแƒฃแƒ—แƒ˜, แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—. แƒ›แƒ”แƒแƒ แƒ”แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒ”แƒก แƒ™แƒ•แƒšแƒแƒ• แƒ›แƒแƒฃแƒกแƒ˜แƒก แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒแƒ–แƒ” แƒ“แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒแƒ, แƒ แƒแƒ›แƒšแƒ˜แƒกแƒ’แƒแƒœแƒแƒช แƒฉแƒ•แƒ”แƒœ (แƒ›แƒ”) แƒ’แƒ•แƒ˜แƒœแƒ“แƒแƒ“แƒ แƒ—แƒแƒ•แƒ˜แƒก แƒ“แƒแƒฆแƒฌแƒ”แƒ•แƒ.

แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ”แƒ แƒ—-แƒ”แƒ แƒ—แƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒแƒ แƒ™แƒแƒ™แƒ•แƒ”แƒ‘แƒ˜. แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒกแƒแƒฐแƒแƒ”แƒ แƒ แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒ™แƒแƒ™แƒ•แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ›แƒฎแƒแƒ แƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒ แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒ”แƒ‘แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ”แƒ‘แƒ˜. แฒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, 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)

แƒแƒฅ, แƒ˜แƒกแƒ”แƒ•แƒ” แƒ แƒแƒ’แƒแƒ แƒช แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ Airflow-แƒจแƒ˜, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ:

  • แƒ›แƒ”แƒ›แƒ™แƒ•แƒ˜แƒ“แƒ แƒ”แƒแƒ‘แƒ˜แƒ— แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ BaseOperator, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒก แƒฐแƒแƒ”แƒ แƒ˜แƒก แƒœแƒแƒ™แƒแƒ“แƒ˜แƒก แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒฃแƒ  แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒœแƒ˜แƒ•แƒ—แƒก (แƒจแƒ”แƒฎแƒ”แƒ“แƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒ“แƒแƒกแƒ•แƒ”แƒœแƒ”แƒ‘แƒแƒก)
  • แƒ’แƒแƒ›แƒแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜ template_fields, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช Jinja แƒ”แƒซแƒ”แƒ‘แƒก แƒ›แƒแƒ™แƒ แƒแƒ”แƒ‘แƒก แƒ“แƒแƒกแƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒšแƒแƒ“.
  • แƒ›แƒแƒแƒฌแƒงแƒ แƒกแƒฌแƒแƒ แƒ˜ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ __init__()แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ“แƒแƒแƒงแƒ”แƒœแƒ”แƒ— แƒœแƒแƒ’แƒฃแƒšแƒ˜แƒกแƒฎแƒ›แƒ”แƒ•แƒ˜ แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜.
  • แƒแƒ แƒช แƒฌแƒ˜แƒœแƒแƒžแƒ แƒ˜แƒก แƒ˜แƒœแƒ˜แƒชแƒ˜แƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ“แƒแƒ•แƒ˜แƒ•แƒ˜แƒฌแƒงแƒ”แƒ—.
  • แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ˜แƒ— แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ™แƒแƒ™แƒแƒšแƒ˜ TelegramBotHookแƒ›แƒ˜แƒกแƒ’แƒแƒœ แƒ›แƒ˜แƒ˜แƒฆแƒ แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜.
  • แƒ’แƒแƒ“แƒแƒคแƒแƒ แƒฃแƒšแƒ˜ (แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜) แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ BaseOperator.execute(), แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช Airfow แƒแƒขแƒ แƒ˜แƒแƒšแƒ”แƒ‘แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒ แƒ“แƒแƒ“แƒ’แƒ”แƒ‘แƒ - แƒ›แƒแƒกแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒœแƒ•แƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ— แƒ›แƒ—แƒแƒ•แƒแƒ  แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก, แƒ“แƒแƒ’แƒ•แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒ•แƒšแƒ. (แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒ“แƒ˜แƒ•แƒแƒ แƒ—, แƒกแƒฎแƒ•แƒแƒ—แƒ แƒจแƒแƒ แƒ˜แƒก, แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ  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 แƒ•แƒ”แƒšแƒ˜), แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ›แƒ” (แƒฉแƒ”แƒ›แƒ˜ แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—!) แƒ•แƒ“แƒ”แƒ‘ Telegram-แƒ˜แƒก แƒ‘แƒแƒขแƒ˜แƒก แƒŸแƒ”แƒขแƒแƒœแƒก: {"bot_token": "YOuRAwEsomeBOtToKen"}.
  • แƒ›แƒ” แƒ•แƒฅแƒ›แƒœแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก แƒฉแƒ•แƒ”แƒœแƒ˜ TelegramBot, แƒ›แƒ˜แƒกแƒชแƒ”แƒก แƒ›แƒแƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒšแƒ˜ แƒœแƒ˜แƒจแƒแƒœแƒ˜.

แฒกแƒฃแƒš แƒ”แƒก แƒแƒ แƒ˜แƒก. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ˜ แƒ™แƒแƒฃแƒญแƒ˜แƒ“แƒแƒœ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— TelegramBotHook().clent แƒแƒœ TelegramBotHook().get_conn().

แƒ“แƒ แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒ›แƒ”แƒแƒ แƒ” แƒœแƒแƒฌแƒ˜แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒจแƒ˜แƒช แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘ แƒ›แƒ˜แƒ™แƒ แƒแƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒแƒก Telegram 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 - แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒจแƒ˜ แƒฉแƒแƒ“แƒ”แƒ— แƒกแƒแƒฏแƒแƒ แƒ แƒกแƒแƒชแƒแƒ•แƒจแƒ˜ แƒ“แƒ แƒ›แƒ˜แƒ”แƒชแƒ˜แƒ— แƒฆแƒ˜แƒ แƒฌแƒงแƒแƒ แƒแƒก.

แƒกแƒแƒœแƒแƒ› แƒแƒ› แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒก แƒ•แƒกแƒฌแƒแƒ•แƒšแƒแƒ‘แƒ“แƒ˜แƒ—, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒฎแƒกแƒ”แƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ— แƒฉแƒแƒ•แƒแƒ แƒ“แƒ แƒ“แƒ แƒแƒ แƒฎแƒ–แƒ” แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ›แƒ˜แƒ’แƒ–แƒแƒ•แƒœแƒ. แƒ•แƒแƒžแƒ˜แƒ แƒ”แƒ‘ แƒจแƒ”แƒ•แƒแƒ›แƒแƒฌแƒ›แƒ, แƒแƒ แƒแƒกแƒฌแƒแƒ แƒ˜แƒ แƒ—แƒฃ แƒแƒ แƒ...

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ
แƒ แƒแƒฆแƒแƒช แƒ’แƒแƒขแƒ”แƒฎแƒ แƒฉแƒ•แƒ”แƒœแƒก แƒ“แƒแƒ’แƒจแƒ˜! แƒแƒ›แƒแƒก แƒแƒ  แƒ•แƒ”แƒšแƒแƒ“แƒ˜แƒ—? แƒ–แƒฃแƒกแƒขแƒแƒ“!

แƒ“แƒแƒšแƒ”แƒ•แƒแƒก แƒแƒžแƒ˜แƒ แƒ”แƒ‘?

แƒ’แƒ แƒซแƒœแƒแƒ‘, แƒ แƒแƒ› แƒ แƒแƒฆแƒแƒช แƒ’แƒแƒ›แƒแƒ›แƒ แƒฉแƒ? แƒ”แƒขแƒงแƒแƒ‘แƒ SQL Server-แƒ˜แƒ“แƒแƒœ แƒ•แƒ”แƒ แƒขแƒ˜แƒ™แƒแƒจแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒแƒก แƒ“แƒแƒแƒžแƒ˜แƒ แƒ แƒ“แƒ แƒ›แƒ”แƒ แƒ” แƒแƒ˜แƒฆแƒ แƒ“แƒ แƒ—แƒ”แƒ›แƒ˜แƒ“แƒแƒœ แƒ’แƒแƒ“แƒแƒ•แƒ˜แƒ“แƒ แƒœแƒแƒซแƒ˜แƒ แƒแƒšแƒ!

แƒ”แƒก แƒกแƒ˜แƒกแƒแƒกแƒขแƒ˜แƒ™แƒ” แƒ˜แƒงแƒ แƒ›แƒ˜แƒ–แƒแƒœแƒ›แƒ˜แƒ›แƒแƒ แƒ—แƒฃแƒšแƒ˜, แƒ›แƒ” แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ›แƒแƒ›แƒ˜แƒฌแƒ˜แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก แƒ แƒแƒ˜แƒ›แƒ” แƒขแƒ”แƒ แƒ›แƒ˜แƒœแƒแƒšแƒแƒ’แƒ˜แƒ˜แƒก แƒ’แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ. แƒแƒฎแƒšแƒ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒ แƒฃแƒคแƒ แƒ แƒจแƒแƒ แƒก แƒฌแƒแƒฎแƒ•แƒ˜แƒ“แƒ”.

แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ’แƒ”แƒ’แƒ›แƒ แƒแƒกแƒ”แƒ—แƒ˜ แƒ˜แƒงแƒ:

  1. แƒ’แƒแƒ˜แƒ™แƒ”แƒ—แƒ”
  2. แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ
  3. แƒœแƒแƒฎแƒ”แƒ— แƒ แƒ แƒšแƒแƒ›แƒแƒ–แƒ˜แƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜
  4. แƒ›แƒ˜แƒแƒœแƒ˜แƒญแƒ”แƒ— แƒกแƒ”แƒกแƒ˜แƒ˜แƒก แƒœแƒแƒ›แƒ แƒ”แƒ‘แƒ˜ แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒแƒก
  5. แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ SQL แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒ“แƒแƒœ
  6. แƒฉแƒแƒ“แƒ”แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ•แƒ”แƒ แƒขแƒ˜แƒ™แƒแƒจแƒ˜
  7. แƒจแƒ”แƒแƒ’แƒ แƒแƒ•แƒ”แƒ— แƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒ

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ˜แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ”แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ“แƒ”แƒก, แƒ›แƒ” แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ” แƒžแƒแƒขแƒแƒ แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ แƒฉแƒ•แƒ”แƒœแƒก 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:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ
แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜แƒ แƒ”แƒก แƒแƒ  แƒแƒฉแƒ•แƒ”แƒœแƒ แƒแƒœแƒแƒšแƒ˜แƒขแƒ˜แƒ™แƒแƒกแƒ”แƒ‘แƒก

แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ 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)
  1. แƒฐแƒฃแƒ™แƒ˜แƒก แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— Airflow-แƒ“แƒแƒœ pymssql- แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ
  2. แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒชแƒ•แƒแƒšแƒแƒ— แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒจแƒ˜ แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒ แƒ—แƒแƒ แƒ˜แƒฆแƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ— - แƒ˜แƒก แƒฉแƒแƒแƒ’แƒ“แƒ”แƒ‘แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒก แƒซแƒ แƒแƒ•แƒ˜แƒก แƒ›แƒ˜แƒ”แƒ .
  3. แƒ™แƒ•แƒ”แƒ‘แƒแƒ•แƒก แƒฉแƒ•แƒ”แƒœแƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก pandasแƒ•แƒ˜แƒœ แƒ›แƒแƒ’แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒก DataFrame - แƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒ’แƒ•แƒแƒ“แƒ’แƒ”แƒ‘แƒ.

แƒ›แƒ” แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒฉแƒแƒœแƒแƒชแƒ•แƒšแƒ”แƒ‘แƒแƒก {dt} แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ %s แƒแƒ แƒ แƒ˜แƒ›แƒ˜แƒขแƒแƒ›, แƒ แƒแƒ› แƒ‘แƒแƒ แƒแƒขแƒ˜ แƒžแƒ˜แƒœแƒแƒฅแƒ˜แƒ แƒ•แƒแƒ , แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ˜แƒ›แƒ˜แƒขแƒแƒ› pandas แƒ•แƒ”แƒ  แƒฃแƒ›แƒ™แƒšแƒแƒ•แƒ“แƒ”แƒ‘แƒ pymssql แƒ“แƒ แƒกแƒ แƒ˜แƒแƒšแƒ”แƒ‘แƒก แƒฃแƒ™แƒแƒœแƒแƒกแƒ™แƒœแƒ”แƒšแƒก params: Listแƒ—แƒฃแƒ›แƒชแƒ แƒ›แƒแƒก แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒแƒ“ แƒกแƒฃแƒ แƒก tuple.
แƒแƒกแƒ”แƒ•แƒ” แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜ pymssql แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ˜แƒขแƒ แƒแƒฆแƒแƒ  แƒ“แƒแƒ”แƒญแƒ˜แƒ แƒ แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ˜ แƒ“แƒ แƒ“แƒ แƒแƒ แƒ’แƒแƒ“แƒแƒฎแƒ•แƒ˜แƒ“แƒ” pyodbc.

แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒ˜แƒ—แƒ˜ แƒแƒ•แƒกแƒ”แƒ‘แƒ“แƒ Airflow-แƒ›แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒก แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜:

Apache Airflow: ETL-แƒ˜แƒก แƒ’แƒแƒแƒ“แƒ•แƒ˜แƒšแƒ”แƒ‘แƒ

แƒ—แƒฃ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒ’แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒแƒก แƒแƒ–แƒ แƒ˜ แƒแƒ  แƒแƒฅแƒ•แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒกแƒ”แƒ•แƒ” แƒฃแƒชแƒœแƒแƒฃแƒ แƒ˜แƒ แƒจแƒ”แƒ•แƒกแƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒขแƒ”แƒ‘แƒฃแƒšแƒแƒ“ แƒ›แƒ˜แƒฉแƒœแƒ”แƒ•แƒ. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ”แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ. แƒ-แƒ-แƒแƒฐ แƒ แƒ แƒ•แƒฅแƒœแƒ?! แƒ“แƒ แƒแƒ˜ แƒ แƒ:

if df.empty:
    raise AirflowSkipException('No rows to load')

AirflowSkipException แƒ˜แƒขแƒงแƒ•แƒ˜แƒก Airflow-แƒก, แƒ แƒแƒ› แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒขแƒแƒ•แƒ”แƒ‘แƒ— แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒแƒก. แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒก แƒแƒ  แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒฌแƒ•แƒแƒœแƒ” แƒแƒœ แƒฌแƒ˜แƒ—แƒ”แƒšแƒ˜ แƒ™แƒ•แƒแƒ“แƒ แƒแƒขแƒ˜, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒ•แƒแƒ แƒ“แƒ˜แƒกแƒคแƒ”แƒ แƒ˜.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ“แƒแƒ•แƒงแƒแƒ แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜ แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒ•แƒ”แƒขแƒ˜:

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)
  1. แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ— แƒกแƒžแƒ”แƒชแƒ˜แƒแƒšแƒฃแƒ  แƒ›แƒ˜แƒ›แƒฆแƒ”แƒ‘แƒก StringIO.
  2. pandas แƒ™แƒ”แƒ—แƒ˜แƒšแƒแƒ“ แƒ“แƒแƒแƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒฉแƒ•แƒ”แƒœแƒ˜ DataFrame แƒกแƒแƒฎแƒ˜แƒ— CSV- แƒฎแƒแƒ–แƒ”แƒ‘แƒ˜.
  3. แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒฎแƒกแƒœแƒแƒ— แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒกแƒแƒงแƒ•แƒแƒ แƒ”แƒš แƒ•แƒ”แƒ แƒขแƒ˜แƒ™แƒแƒกแƒ—แƒแƒœ แƒ™แƒแƒฃแƒญแƒ˜แƒ—.
  4. แƒแƒฎแƒšแƒ แƒ™แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— 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-แƒ˜แƒ— แƒ“แƒ แƒ›แƒแƒฃแƒกแƒ˜แƒ— แƒ“แƒ แƒ›แƒ” Airflow-แƒ˜แƒ—... แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ•แƒแƒ“แƒแƒ แƒ”แƒ‘แƒ— แƒ›แƒแƒ•แƒšแƒ˜แƒก แƒกแƒ˜แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒก... แƒ•แƒแƒ˜แƒ›แƒ”, แƒ›แƒ’แƒแƒœแƒ˜ แƒ“แƒแƒ›แƒ”แƒ—แƒแƒœแƒฎแƒ›แƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒ แƒคแƒ แƒแƒœแƒขแƒ–แƒ” แƒ“แƒแƒ•แƒแƒ›แƒแƒ แƒชแƒฎแƒ”แƒ‘!

แƒ—แƒฃ แƒชแƒแƒขแƒ แƒฃแƒคแƒ แƒ แƒกแƒ”แƒ แƒ˜แƒแƒ–แƒฃแƒšแƒแƒ“, แƒ›แƒแƒจแƒ˜แƒœ Apache Airflow - แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒ— แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒก แƒ™แƒแƒ“แƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ— - แƒจแƒ”แƒแƒกแƒ แƒฃแƒšแƒ แƒฉแƒ”แƒ›แƒ˜ แƒกแƒแƒฅแƒ›แƒ” แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒฃแƒคแƒ แƒ แƒ™แƒแƒ›แƒคแƒแƒ แƒขแƒฃแƒšแƒ˜ แƒ“แƒ แƒกแƒแƒกแƒ˜แƒแƒ›แƒแƒ•แƒœแƒ.

แƒ›แƒ˜แƒกแƒ˜ แƒจแƒ”แƒฃแƒ–แƒฆแƒฃแƒ“แƒแƒ•แƒ˜ แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ, แƒ แƒแƒ’แƒแƒ แƒช แƒ“แƒแƒœแƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒก, แƒ˜แƒกแƒ” แƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒฃแƒ แƒแƒ‘แƒ˜แƒกแƒแƒ“แƒ›แƒ˜ แƒ›แƒ˜แƒ“แƒ แƒ”แƒ™แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒกแƒแƒ–แƒ แƒ˜แƒกแƒ˜แƒ—, แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒจแƒ”แƒกแƒแƒซแƒšแƒ”แƒ‘แƒšแƒแƒ‘แƒแƒก แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— Airflow แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒกแƒคแƒ”แƒ แƒแƒจแƒ˜: แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ’แƒ แƒแƒ•แƒ”แƒ‘แƒ˜แƒก, แƒ›แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ˜แƒก แƒกแƒ แƒฃแƒš แƒชแƒ˜แƒ™แƒšแƒจแƒ˜แƒช แƒ™แƒ˜, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒ แƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก (แƒ›แƒแƒ แƒกแƒ–แƒ”, แƒ™แƒฃแƒ แƒกแƒ˜).

แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒกแƒแƒ‘แƒแƒšแƒแƒ, แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ แƒ“แƒ แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ

แƒ แƒแƒ™แƒ˜ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒแƒ’แƒ แƒแƒ•แƒ”แƒ— แƒ—แƒฅแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก

  • start_date. แƒ“แƒ˜แƒแƒฎ, แƒ”แƒก แƒฃแƒ™แƒ•แƒ” แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ›แƒ”แƒ›แƒ˜แƒ. แƒ“แƒแƒ’แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒแƒ แƒ’แƒฃแƒ›แƒ”แƒœแƒขแƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ— start_date แƒงแƒ•แƒ”แƒšแƒ แƒ’แƒแƒ“แƒ˜แƒก. แƒ›แƒแƒ™แƒšแƒ”แƒ“, แƒ—แƒฃ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ— start_date แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒ—แƒแƒ แƒ˜แƒฆแƒ˜ แƒ“แƒ schedule_interval - แƒ”แƒ แƒ— แƒ“แƒฆแƒ”แƒก, แƒ›แƒแƒจแƒ˜แƒœ DAG แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ‘แƒ แƒฎแƒ•แƒแƒš แƒแƒ แƒ แƒฃแƒแƒ“แƒ แƒ”แƒก.
    start_date = datetime(2020, 7, 7, 0, 1, 2)

    แƒ“แƒ แƒแƒ แƒแƒœแƒแƒ˜แƒ แƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ.

    แƒ›แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ: Task is missing the start_date parameter, แƒ แƒแƒช แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒ”แƒ‘แƒก แƒ˜แƒ›แƒแƒ–แƒ”, แƒ แƒแƒ› แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒแƒ— แƒ“แƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ.

  • แƒงแƒ•แƒ”แƒšแƒ แƒ”แƒ แƒ— แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ”. แƒ“แƒ˜แƒแƒฎ, แƒ“แƒ แƒ‘แƒแƒ–แƒ”แƒ‘แƒ˜ (แƒ—แƒแƒ•แƒแƒ“ Airflow แƒ“แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒคแƒแƒ แƒ˜), แƒ“แƒ แƒ•แƒ”แƒ‘ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜, แƒ“แƒ แƒ’แƒ แƒแƒคแƒ˜แƒ™แƒ˜ แƒ“แƒ แƒ›แƒฃแƒจแƒ”แƒ‘แƒ˜. แƒ“แƒ แƒ˜แƒ›แƒฃแƒจแƒแƒ•แƒ แƒ™แƒ˜แƒ“แƒ”แƒช. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒ แƒแƒ—แƒ แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜, แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ’แƒแƒ˜แƒ–แƒแƒ แƒ“แƒ แƒ“แƒ แƒ แƒแƒ“แƒ”แƒกแƒแƒช PostgreSQL-แƒ›แƒ แƒ“แƒแƒ˜แƒฌแƒงแƒ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ–แƒ” แƒ แƒ”แƒแƒ’แƒ˜แƒ แƒ”แƒ‘แƒ 20 ms-แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ 5 แƒฌแƒแƒ›แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœ แƒแƒ•แƒ˜แƒฆแƒ”แƒ— แƒ˜แƒ’แƒ˜ แƒ“แƒ แƒฌแƒแƒ•แƒ˜แƒงแƒ•แƒแƒœแƒ”แƒ—.
  • แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒแƒฆแƒ›แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜. แƒ“แƒ˜แƒแƒฎ, แƒฉแƒ•แƒ”แƒœ แƒ˜แƒกแƒ”แƒ• แƒ›แƒแƒกแƒ–แƒ” แƒ•แƒกแƒฎแƒ”แƒ“แƒ•แƒแƒ แƒ— แƒ“แƒ แƒฃแƒ™แƒ•แƒ” แƒฃแƒคแƒกแƒ™แƒ แƒฃแƒšแƒ˜แƒก แƒžแƒ˜แƒ แƒแƒก แƒ›แƒ˜แƒ•แƒ”แƒ“แƒ˜แƒ—. LocalExecutor แƒแƒฅแƒแƒ›แƒ“แƒ” แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒ˜ แƒ˜แƒงแƒ แƒฉแƒ•แƒ”แƒœแƒ—แƒ•แƒ˜แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฎแƒšแƒ แƒ“แƒ แƒแƒ แƒ’แƒแƒ•แƒแƒคแƒแƒ แƒ—แƒแƒ•แƒแƒ— แƒ›แƒ˜แƒœแƒ˜แƒ›แƒฃแƒ› แƒ”แƒ แƒ—แƒ˜ แƒ›แƒฃแƒจแƒแƒ™แƒ˜ แƒ“แƒ แƒฉแƒ•แƒ”แƒœ แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒจแƒ แƒแƒ›แƒ แƒ›แƒแƒ’แƒ•แƒ˜แƒฌแƒ”แƒ•แƒก CeleryExecutor-แƒจแƒ˜ แƒ’แƒแƒ“แƒแƒกแƒแƒกแƒ•แƒšแƒ”แƒšแƒแƒ“. แƒ“แƒ แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ”แƒ แƒ— แƒแƒžแƒแƒ แƒแƒขแƒ–แƒ”, แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒ’แƒ˜แƒจแƒšแƒ˜แƒ— แƒฎแƒ”แƒšแƒก, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— Celery แƒ—แƒฃแƒœแƒ“แƒแƒช แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช "แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒแƒ แƒแƒกแƒแƒ“แƒ”แƒก แƒจแƒ”แƒ•แƒ แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜, แƒ’แƒฃแƒšแƒฌแƒ แƒคแƒ”แƒšแƒแƒ“!"
  • แƒ’แƒแƒ›แƒแƒฃแƒงแƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒฉแƒแƒจแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ”แƒ‘แƒ˜:
    • แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒ›แƒแƒ›แƒกแƒแƒฎแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒ”แƒ แƒ—แƒ˜แƒคแƒ˜แƒ™แƒแƒขแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒœแƒแƒฎแƒแƒ“,
    • SLA แƒ›แƒ”แƒœแƒแƒขแƒ แƒ”แƒ‘แƒ แƒฃแƒžแƒแƒกแƒฃแƒฎแƒแƒก แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ”แƒ‘แƒก, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒแƒ  แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ,
    • xcom แƒ›แƒ”แƒขแƒแƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒชแƒ•แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (แƒ›แƒ” แƒ•แƒ—แƒฅแƒ•แƒ˜ แƒ›แƒ”แƒขแƒแƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜!) dag แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒก แƒจแƒแƒ แƒ˜แƒก.
  • แƒคแƒแƒกแƒขแƒ˜แƒก แƒ‘แƒแƒ แƒแƒขแƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ. แƒแƒ‘แƒ, แƒ แƒ แƒ•แƒ—แƒฅแƒ•แƒ? แƒ“แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ˜แƒงแƒ แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ“แƒแƒชแƒ”แƒ›แƒฃแƒš แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒฎแƒšแƒ แƒฉแƒ”แƒ›แƒก แƒกแƒแƒ›แƒฃแƒจแƒแƒ Gmail-แƒก แƒแƒฅแƒ•แƒก >90 แƒแƒ—แƒแƒกแƒ˜ แƒ”แƒš.แƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ Airflow-แƒ“แƒแƒœ แƒ“แƒ แƒ•แƒ”แƒ‘ แƒคแƒแƒกแƒขแƒ˜แƒก แƒ›แƒญแƒ˜แƒ“แƒ˜ แƒฃแƒแƒ แƒก แƒแƒ›แƒ‘แƒแƒ‘แƒก แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ 100-แƒ–แƒ” แƒ›แƒ”แƒขแƒ˜แƒก แƒแƒฆแƒ”แƒ‘แƒแƒ–แƒ” แƒ“แƒ แƒฌแƒแƒจแƒšแƒแƒ–แƒ”.

แƒ›แƒ”แƒขแƒ˜ แƒฎแƒแƒ แƒ•แƒ”แƒ–แƒ”แƒ‘แƒ˜: Apache Airflow Pitfails

แƒ›แƒ”แƒขแƒ˜ แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒฎแƒ”แƒšแƒกแƒแƒฌแƒงแƒแƒ”แƒ‘แƒ˜

แƒ˜แƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒแƒ“ แƒ•แƒ˜แƒ›แƒฃแƒจแƒแƒแƒ— แƒ—แƒแƒ•แƒ˜แƒ— แƒ“แƒ แƒแƒ แƒ แƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒ—, Airflow-แƒ› แƒ›แƒแƒ’แƒ•แƒแƒ›แƒ–แƒแƒ“แƒ แƒ”แƒก:

  • REST API - แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• แƒแƒฅแƒ•แƒก แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒแƒขแƒแƒ แƒ˜แƒก แƒกแƒขแƒแƒขแƒฃแƒกแƒ˜, แƒ แƒแƒช แƒแƒ  แƒฃแƒจแƒšแƒ˜แƒก แƒฎแƒ”แƒšแƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒจแƒ˜. แƒ›แƒแƒกแƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ dags แƒ“แƒ แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒจแƒ”แƒแƒฉแƒ”แƒ แƒแƒ—/แƒ“แƒแƒ˜แƒฌแƒงแƒแƒ— dag, แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— DAG Run แƒแƒœ pool.
  • 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)
  • Airflow แƒ›แƒ”แƒขแƒแƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ. แƒ›แƒ” แƒแƒ  แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ›แƒแƒกแƒ–แƒ” แƒ“แƒแƒฌแƒ”แƒ แƒแƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒ แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒกแƒžแƒ”แƒชแƒ˜แƒคแƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ‘แƒ”แƒ•แƒ แƒแƒ“ แƒฃแƒคแƒ แƒ แƒกแƒฌแƒ แƒแƒคแƒ˜ แƒ“แƒ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ˜แƒงแƒแƒก, แƒ•แƒ˜แƒ“แƒ แƒ” แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒ›แƒ” 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

แƒšแƒ˜แƒขแƒ”แƒ แƒแƒขแƒฃแƒ แƒ

แƒ“แƒ แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒแƒ—แƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜ Google-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒแƒ แƒ˜แƒก Airflow แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ˜แƒก แƒจแƒ˜แƒœแƒแƒแƒ แƒกแƒ˜ แƒฉแƒ”แƒ›แƒ˜ แƒกแƒแƒœแƒ˜แƒจแƒœแƒ”แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ.

แƒ“แƒ แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒก แƒ›แƒฅแƒแƒœแƒ” แƒกแƒแƒ˜แƒขแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก ๐Ÿ”ฅ แƒจแƒ”แƒ˜แƒซแƒ˜แƒœแƒ”แƒ— แƒกแƒแƒ˜แƒ›แƒ”แƒ“แƒ แƒ•แƒ”แƒ‘แƒกแƒแƒ˜แƒขแƒ˜แƒก แƒฐแƒแƒกแƒขแƒ˜แƒœแƒ’แƒ˜ DDoS แƒ“แƒแƒชแƒ•แƒ˜แƒ—, VPS VDS แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ”แƒ‘แƒ˜ | ProHoster