blob: 2b3de5c33c06127ac1de3ab3926abc89cf88f0c8 [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>DAGs &mdash; Airflow Documentation</title>
<link rel="stylesheet" href="../_static/_gen/css/main.min.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/_gen/css/main.min.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/_gen/css/main-custom.min.css" />
<link rel="stylesheet" type="text/css" href="../_static/graphviz.css" />
<link rel="shortcut icon" href="../_static/pin_32.png"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Tasks" href="tasks.html" />
<link rel="prev" title="Architecture Overview" href="overview.html" />
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
/* We explicitly disable cookie tracking to avoid privacy issues */
_paq.push(['disableCookies']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '13']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
</head><body class="td-section">
<header>
<nav class="js-navbar-scroll navbar">
<div class="navbar__icon-container">
<a href="/">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
<path id="Rectangle_1" d="M0 0h155.314v60H0z" fill="none" data-name="Rectangle 1"></path>
</clipPath>
</defs>
<g id="logo" transform="translate(-1305 -780.355)">
<g id="Group_2" clip-path="url(#clip-path)" data-name="Group 2" transform="translate(1305 780.355)">
<g id="Group_1" data-name="Group 1" transform="translate(.486 .486)">
<path id="Path_1" d="M1307.562 880.867l28.187-28.893a.521.521 0 0 0 .063-.666c-1.714-2.393-4.877-2.808-6.049-4.416-3.472-4.763-4.353-7.459-5.845-7.292a.456.456 0 0 0-.271.143l-10.182 10.438c-5.858 6-6.7 19.225-6.852 30.3a.552.552 0 0 0 .949.386z" fill="#017cee" data-name="Path 1" transform="translate(-1306.613 -822.232)"></path>
<path id="Path_2" d="M1405.512 908.489l-28.893-28.189a.521.521 0 0 0-.667-.063c-2.393 1.715-2.808 4.877-4.416 6.049-4.763 3.472-7.459 4.353-7.292 5.845a.456.456 0 0 0 .143.27l10.438 10.182c6 5.858 19.225 6.7 30.3 6.852a.552.552 0 0 0 .387-.946z" fill="#00ad46" data-name="Path 2" transform="translate(-1346.876 -850.567)"></path>
<path id="Path_3" d="M1373.909 902.252c-3.28-3.2-4.8-9.53 1.486-22.583-10.219 4.567-13.8 10.57-12.039 12.289z" fill="#04d659" data-name="Path 3" transform="translate(-1345.96 -850.233)"></path>
<path id="Path_4" d="M1433.132 782.359l-28.186 28.893a.52.52 0 0 0-.063.666c1.715 2.393 4.876 2.808 6.049 4.416 3.472 4.763 4.354 7.459 5.845 7.292a.454.454 0 0 0 .271-.143l10.182-10.438c5.858-6 6.7-19.225 6.852-30.3a.553.553 0 0 0-.95-.386z" fill="#00c7d4" data-name="Path 4" transform="translate(-1375.21 -782.123)"></path>
<path id="Path_5" d="M1426.9 881.155c-3.2 3.28-9.53 4.8-22.584-1.486 4.567 10.219 10.57 13.8 12.289 12.039z" fill="#11e1ee" data-name="Path 5" transform="translate(-1374.875 -850.233)"></path>
<path id="Path_6" d="M1307 782.919l28.893 28.186a.521.521 0 0 0 .666.063c2.393-1.715 2.808-4.877 4.416-6.049 4.763-3.472 7.459-4.353 7.292-5.845a.459.459 0 0 0-.143-.271l-10.438-10.182c-6-5.858-19.225-6.7-30.3-6.852a.552.552 0 0 0-.386.95z" fill="#e43921" data-name="Path 6" transform="translate(-1306.766 -781.97)"></path>
<path id="Path_7" d="M1405.8 804.711c3.28 3.2 4.8 9.53-1.486 22.584 10.219-4.567 13.8-10.571 12.039-12.289z" fill-rule="evenodd" fill="#ff7557" data-name="Path 7" transform="translate(-1374.875 -797.859)"></path>
<path id="Path_8" d="M1329.355 849.266c3.2-3.28 9.53-4.8 22.584 1.486-4.567-10.219-10.57-13.8-12.289-12.039z" fill="#0cb6ff" data-name="Path 8" transform="translate(-1322.503 -821.316)"></path>
<circle id="Ellipse_1" cx="1.26" cy="1.26" r="1.26" fill="#4a4848" data-name="Ellipse 1" transform="translate(28.18 28.171)"></circle>
<path id="Path_9" d="M1527.558 827.347a.229.229 0 0 1-.223-.223.458.458 0 0 1 .011-.123l2.766-7.214a.346.346 0 0 1 .357-.245h.758a.348.348 0 0 1 .357.245l2.754 7.214.022.123a.228.228 0 0 1-.223.223h-.568a.288.288 0 0 1-.19-.056.352.352 0 0 1-.089-.134l-.613-1.583h-3.657l-.613 1.583a.317.317 0 0 1-.1.134.269.269 0 0 1-.178.056zm4.795-2.732l-1.505-3.958-1.505 3.958zm3.322 4.85a.258.258 0 0 1-.189-.078.241.241 0 0 1-.067-.178v-7.4a.241.241 0 0 1 .067-.178.258.258 0 0 1 .189-.078h.513a.268.268 0 0 1 .256.256v.49a2.118 2.118 0 0 1 1.828-.858 2.092 2.092 0 0 1 1.751.736 3.135 3.135 0 0 1 .636 1.9q.011.122.011.379t-.011.379a3.168 3.168 0 0 1-.636 1.9 2.111 2.111 0 0 1-1.751.736 2.154 2.154 0 0 1-1.806-.836v2.587a.241.241 0 0 1-.067.178.223.223 0 0 1-.179.078zm2.364-2.91a1.324 1.324 0 0 0 1.149-.491 2.266 2.266 0 0 0 .4-1.293q.011-.111.011-.323 0-2.107-1.562-2.107a1.365 1.365 0 0 0-1.159.513 2.111 2.111 0 0 0-.412 1.2l-.012.424.012.435a1.862 1.862 0 0 0 .424 1.149 1.4 1.4 0 0 0 1.148.493zm5.628.9a2.329 2.329 0 0 1-1.015-.223 1.94 1.94 0 0 1-.747-.6 1.487 1.487 0 0 1-.268-.859 1.459 1.459 0 0 1 .6-1.2 3.4 3.4 0 0 1 1.65-.624l1.661-.234v-.323q0-1.137-1.3-1.137a1.4 1.4 0 0 0-.8.212 1.376 1.376 0 0 0-.468.48.305.305 0 0 1-.089.145.18.18 0 0 1-.134.045h-.48a.23.23 0 0 1-.245-.245 1.17 1.17 0 0 1 .245-.6 1.931 1.931 0 0 1 .747-.591 2.7 2.7 0 0 1 1.238-.256 2.351 2.351 0 0 1 1.8.591 2.032 2.032 0 0 1 .547 1.45v3.613a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.513a.233.233 0 0 1-.257-.256v-.479a1.923 1.923 0 0 1-.714.6 2.557 2.557 0 0 1-1.203.237zm.234-.836a1.579 1.579 0 0 0 1.182-.469 1.881 1.881 0 0 0 .468-1.371v-.312l-1.293.19a2.918 2.918 0 0 0-1.193.379.761.761 0 0 0-.4.658.784.784 0 0 0 .368.691 1.585 1.585 0 0 0 .867.237zm6.643.836a2.556 2.556 0 0 1-1.873-.669 2.738 2.738 0 0 1-.714-1.9l-.011-.446.011-.446a2.7 2.7 0 0 1 .714-1.885 2.531 2.531 0 0 1 1.873-.68 2.917 2.917 0 0 1 1.36.29 2.077 2.077 0 0 1 .825.714 1.7 1.7 0 0 1 .3.848.2.2 0 0 1-.067.178.281.281 0 0 1-.19.067h-.535a.265.265 0 0 1-.168-.045.458.458 0 0 1-.111-.178 1.428 1.428 0 0 0-.535-.758 1.516 1.516 0 0 0-.87-.234 1.45 1.45 0 0 0-1.1.435 1.952 1.952 0 0 0-.435 1.3l-.011.4.011.379a1.969 1.969 0 0 0 .435 1.316 1.446 1.446 0 0 0 1.1.424 1.577 1.577 0 0 0 .87-.223 1.493 1.493 0 0 0 .535-.769.458.458 0 0 1 .111-.178.228.228 0 0 1 .168-.056h.535a.258.258 0 0 1 .19.078.2.2 0 0 1 .067.178 1.75 1.75 0 0 1-.3.847 2.078 2.078 0 0 1-.825.714 2.876 2.876 0 0 1-1.361.302zm4.078-.112a.233.233 0 0 1-.257-.256v-7.4a.241.241 0 0 1 .067-.178.259.259 0 0 1 .19-.078h.557a.267.267 0 0 1 .257.256v2.6a2.167 2.167 0 0 1 .758-.624 2.353 2.353 0 0 1 1.082-.223 2.067 2.067 0 0 1 1.661.691 2.642 2.642 0 0 1 .6 1.818v3.144a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.557a.233.233 0 0 1-.256-.256V824a1.775 1.775 0 0 0-.39-1.227 1.387 1.387 0 0 0-1.1-.435 1.481 1.481 0 0 0-1.126.446 1.7 1.7 0 0 0-.412 1.215v3.088a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067zm8.846.112a2.466 2.466 0 0 1-1.84-.7 2.938 2.938 0 0 1-.747-1.94l-.011-.379.011-.368a2.953 2.953 0 0 1 .758-1.918 2.7 2.7 0 0 1 3.735.078 3.114 3.114 0 0 1 .68 2.119v.19a.257.257 0 0 1-.078.189.241.241 0 0 1-.178.067h-3.858v.1a2.11 2.11 0 0 0 .435 1.238 1.332 1.332 0 0 0 1.081.5 1.563 1.563 0 0 0 .836-.2 1.7 1.7 0 0 0 .491-.435.6.6 0 0 1 .145-.156.391.391 0 0 1 .19-.033h.547a.252.252 0 0 1 .167.056.192.192 0 0 1 .067.156.975.975 0 0 1-.312.591 2.51 2.51 0 0 1-.859.6 3.049 3.049 0 0 1-1.26.248zm1.527-3.434v-.033a1.817 1.817 0 0 0-.424-1.249 1.512 1.512 0 0 0-2.23 0 1.883 1.883 0 0 0-.4 1.249v.033z" fill="#51504f" data-name="Path 9" transform="translate(-1460.834 -808.144)"></path>
<path id="Path_10" d="M1527.2 827.081l-.061.061zm-.056-.279l-.08-.031zm2.766-7.214l.08.031zm1.472 0l-.081.029zm2.754 7.214l.084-.015a.064.064 0 0 0 0-.015zm.022.123h.086v-.015zm-.067.156l.06.061zm-.914.011l-.061.061.006.005zm-.089-.134l.081-.027zm-.613-1.583l.08-.031a.086.086 0 0 0-.08-.055zm-3.657 0v-.086a.086.086 0 0 0-.08.055zm-.613 1.583l-.08-.031zm-.1.134l.055.066zm4.047-2.676v.086a.086.086 0 0 0 .08-.116zm-1.505-3.958l.08-.03a.086.086 0 0 0-.16 0zm-1.505 3.958l-.08-.03a.086.086 0 0 0 .08.116zm-1.784 2.646a.128.128 0 0 1-.1-.042l-.122.121a.3.3 0 0 0 .217.092zm-.1-.042a.129.129 0 0 1-.042-.1h-.171a.3.3 0 0 0 .092.217zm-.042-.1a.38.38 0 0 1 .007-.1l-.163-.054a.514.514 0 0 0-.016.15zm.005-.092l2.765-7.214-.16-.061-2.765 7.214zm2.766-7.216a.283.283 0 0 1 .1-.143.3.3 0 0 1 .174-.046v-.172a.47.47 0 0 0-.271.076.453.453 0 0 0-.166.226zm.276-.189h.758v-.172h-.758zm.758 0a.3.3 0 0 1 .175.046.283.283 0 0 1 .1.143l.161-.059a.451.451 0 0 0-.166-.226.47.47 0 0 0-.272-.076zm.277.19l2.754 7.214.16-.061-2.754-7.214zm2.75 7.2l.022.123.169-.031-.022-.123zm.021.107a.13.13 0 0 1-.042.1l.121.121a.3.3 0 0 0 .092-.217zm-.042.1a.13.13 0 0 1-.1.042v.171a.3.3 0 0 0 .217-.092zm-.1.042h-.568v.171h.568zm-.568 0a.206.206 0 0 1-.135-.036l-.11.132a.373.373 0 0 0 .245.076zm-.129-.031a.262.262 0 0 1-.069-.1l-.162.054a.431.431 0 0 0 .11.167zm-.07-.1l-.613-1.584-.16.062.613 1.583zm-.693-1.638h-3.657v.171h3.657zm-3.737.055l-.614 1.584.16.062.613-1.583zm-.615 1.587a.235.235 0 0 1-.075.1l.111.13a.4.4 0 0 0 .126-.172zm-.074.1a.185.185 0 0 1-.124.036v.171a.354.354 0 0 0 .233-.076zm-.124.036h-.569v.171h.569zm4.306-2.677l-1.505-3.958-.16.061 1.505 3.958zm-1.666-3.958l-1.505 3.958.16.061 1.505-3.958zm-1.425 4.075h3.01v-.171h-3.01zm6.143 4.687l-.06.061zm0-7.761l.061.061zm.881 0l-.065.056.01.009zm.078.669h-.086a.086.086 0 0 0 .155.051zm3.579-.123l-.067.053zm.636 1.9h-.086zm0 .758l-.085-.007zm-.636 1.9l.067.054zm-3.557-.1l.068-.052a.086.086 0 0 0-.154.052zm-.067 2.765l-.061-.06zm2.787-3.323l-.069-.051zm.4-1.293l-.085-.008v.005zm-2.709-1.918l-.068-.052zm-.413 1.2h-.086zm-.011.423h-.085zm.011.435h-.086zm.424 1.149l.066-.054zm-1.216 3.315a.173.173 0 0 1-.129-.053l-.121.121a.342.342 0 0 0 .25.1zm-.129-.053a.157.157 0 0 1-.042-.118h-.172a.325.325 0 0 0 .092.239zm-.042-.118v-7.4h-.172v7.4zm0-7.4a.157.157 0 0 1 .042-.118l-.121-.121a.324.324 0 0 0-.092.239zm.042-.118a.173.173 0 0 1 .129-.053v-.172a.342.342 0 0 0-.25.1zm.129-.053h.513v-.172h-.513zm.513 0a.137.137 0 0 1 .113.048l.13-.111a.309.309 0 0 0-.244-.108zm.123.058a.137.137 0 0 1 .048.113h.171a.309.309 0 0 0-.108-.243zm.048.113v.49h.171v-.49zm.155.541a2.033 2.033 0 0 1 1.759-.823v-.171a2.2 2.2 0 0 0-1.9.894zm1.759-.823a2.007 2.007 0 0 1 1.683.7l.135-.106a2.177 2.177 0 0 0-1.818-.768zm1.683.7a3.045 3.045 0 0 1 .617 1.845l.171-.007a3.218 3.218 0 0 0-.654-1.946zm.617 1.85c.007.078.011.2.011.372h.171c0-.171 0-.3-.012-.387zm.011.372c0 .171 0 .294-.011.372l.17.015c.008-.086.012-.216.012-.387zm-.011.376a3.08 3.08 0 0 1-.617 1.846l.134.106a3.25 3.25 0 0 0 .654-1.945zm-.617 1.845a2.025 2.025 0 0 1-1.683.7v.171a2.2 2.2 0 0 0 1.817-.768zm-1.683.7a2.068 2.068 0 0 1-1.739-.8l-.136.1a2.239 2.239 0 0 0 1.874.87zm-1.892-.75v2.587h.172v-2.587zm0 2.587a.156.156 0 0 1-.042.118l.121.121a.325.325 0 0 0 .092-.239zm-.046.123a.138.138 0 0 1-.114.048v.172a.308.308 0 0 0 .244-.108zm-.114.048h-.546v.172h.546zm1.817-2.739a1.408 1.408 0 0 0 1.218-.526l-.138-.1a1.24 1.24 0 0 1-1.079.455zm1.217-.525a2.355 2.355 0 0 0 .419-1.341l-.171-.007a2.182 2.182 0 0 1-.385 1.246zm.418-1.336c.008-.079.012-.19.012-.332h-.172c0 .14 0 .245-.011.315zm.012-.332a2.726 2.726 0 0 0-.407-1.632 1.448 1.448 0 0 0-1.24-.562v.171a1.278 1.278 0 0 1 1.1.492 2.565 2.565 0 0 1 .374 1.53zm-1.647-2.193a1.452 1.452 0 0 0-1.228.547l.136.1a1.282 1.282 0 0 1 1.091-.479zm-1.228.547a2.2 2.2 0 0 0-.43 1.252l.172.008a2.028 2.028 0 0 1 .4-1.157zm-.43 1.254l-.011.424h.171l.011-.424zm-.011.428l.011.435h.172l-.011-.435zm.011.436a1.95 1.95 0 0 0 .443 1.2l.133-.109a1.776 1.776 0 0 1-.4-1.1zm.443 1.2a1.484 1.484 0 0 0 1.214.522v-.171a1.314 1.314 0 0 1-1.082-.459zm5.828 1.117l.037-.077zm-.747-.6l-.07.049zm.335-2.063l.052.068zm1.65-.624l.012.085zm1.661-.234l.012.085a.086.086 0 0 0 .074-.085zm-2.107-1.249l.046.072zm-.468.48l-.075-.042a.083.083 0 0 0-.006.015zm-.089.145l-.054-.067-.007.006zm-.792-.022l-.065.056.009.009zm-.067-.178h-.086zm.245-.6l-.07-.049zm.747-.591l.038.077zm3.033.334l-.063.058zm.468 5.252l.06.061zm-.881 0l-.065.056a.043.043 0 0 0 .009.009zm-.067-.669h.086a.086.086 0 0 0-.156-.048zm-.714.6l-.04-.076zm.223-1.059l-.062-.06zm.468-1.684h.086a.086.086 0 0 0-.1-.085zm-1.293.189l.012.085zm-1.193.379l.046.072zm-.033 1.349l-.047.071zm.635.985a2.241 2.241 0 0 1-.978-.215l-.074.155a2.412 2.412 0 0 0 1.051.231zm-.978-.215a1.859 1.859 0 0 1-.715-.576l-.138.1a2.024 2.024 0 0 0 .779.629zm-.713-.573a1.4 1.4 0 0 1-.253-.81h-.172a1.571 1.571 0 0 0 .283.907zm-.253-.81a1.374 1.374 0 0 1 .569-1.136l-.105-.135a1.544 1.544 0 0 0-.635 1.272zm.569-1.137a3.316 3.316 0 0 1 1.609-.607l-.024-.17a3.481 3.481 0 0 0-1.691.642zm1.609-.607l1.661-.234-.024-.17-1.662.234zm1.735-.319v-.323h-.171v.323zm0-.323a1.156 1.156 0 0 0-.355-.917 1.536 1.536 0 0 0-1.035-.306v.172a1.37 1.37 0 0 1 .922.263.986.986 0 0 1 .3.788zm-1.39-1.223a1.486 1.486 0 0 0-.851.227l.1.142a1.316 1.316 0 0 1 .755-.2zm-.849.226a1.452 1.452 0 0 0-.5.51l.15.084a1.286 1.286 0 0 1 .44-.449zm-.5.524a.226.226 0 0 1-.062.105l.107.134a.391.391 0 0 0 .117-.185zm-.068.112a.1.1 0 0 1-.073.019v.171a.266.266 0 0 0 .194-.07zm-.073.019h-.48v.171h.48zm-.48 0a.18.18 0 0 1-.122-.046l-.112.13a.352.352 0 0 0 .234.087zm-.113-.037a.18.18 0 0 1-.047-.123h-.171a.352.352 0 0 0 .087.234zm-.047-.119a1.1 1.1 0 0 1 .23-.557l-.14-.1a1.253 1.253 0 0 0-.261.648zm.23-.556a1.843 1.843 0 0 1 .715-.564l-.075-.154a2.018 2.018 0 0 0-.78.618zm.716-.564a2.611 2.611 0 0 1 1.2-.247v-.171a2.781 2.781 0 0 0-1.277.266zm1.2-.247a2.268 2.268 0 0 1 1.732.563l.126-.116a2.435 2.435 0 0 0-1.858-.618zm1.733.564a1.945 1.945 0 0 1 .523 1.391h.171a2.117 2.117 0 0 0-.57-1.508zm.523 1.391v3.613h.171v-3.613zm0 3.613a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.157.157 0 0 1-.118.042v.171a.326.326 0 0 0 .239-.092zm-.118.042h-.513v.171h.513zm-.513 0a.2.2 0 0 1-.134-.046l-.111.13a.367.367 0 0 0 .245.088zm-.124-.037a.194.194 0 0 1-.047-.134h-.171a.366.366 0 0 0 .087.245zm-.047-.134v-.479h-.171v.479zm-.156-.528a1.846 1.846 0 0 1-.683.575l.079.152a2.012 2.012 0 0 0 .745-.629zm-.683.575a2.476 2.476 0 0 1-1.153.236v.171a2.644 2.644 0 0 0 1.233-.255zm-.919-.429a1.666 1.666 0 0 0 1.244-.494l-.123-.12a1.493 1.493 0 0 1-1.121.442zm1.244-.494a1.969 1.969 0 0 0 .492-1.431h-.171a1.8 1.8 0 0 1-.444 1.312zm.492-1.431v-.312h-.171v.312zm-.1-.4l-1.293.189.025.17 1.293-.189zm-1.293.189a3 3 0 0 0-1.228.393l.095.143a2.837 2.837 0 0 1 1.158-.365zm-1.227.392a.845.845 0 0 0-.441.73h.172a.676.676 0 0 1 .362-.586zm-.441.73a.869.869 0 0 0 .406.762l.095-.142a.7.7 0 0 1-.33-.62zm.408.764a1.673 1.673 0 0 0 .916.247v-.171a1.5 1.5 0 0 1-.823-.221zm5.686.329l-.061.06zm-.714-1.9h-.085zm-.011-.446h-.085zm.011-.446h-.085zm.714-1.885l.061.061zm3.234-.39l-.04.076zm.825.713l-.073.046zm.3.848h-.086zm-.067.178l.056.065zm-.892.022l.054-.067zm-.112-.178l-.081.029zm-.535-.758l-.048.071zm-1.974.2l-.062-.059zm-.435 1.3h-.086zm-.011.4h-.086zm.011.379h-.086zm.435 1.316l-.062.059zm1.974.2l.046.072zm.535-.769l-.079-.033zm.112-.178l.054.067.007-.006zm.892.022l-.061.06zm.067.178l-.085-.009zm-.3.847l-.072-.046zm-.825.714l-.04-.076zm-1.36.2a2.471 2.471 0 0 1-1.814-.644l-.12.122a2.64 2.64 0 0 0 1.933.694zm-1.813-.643a2.653 2.653 0 0 1-.689-1.839l-.171.006a2.822 2.822 0 0 0 .738 1.952zm-.689-1.838l-.011-.446h-.171l.011.446zm-.011-.442l.011-.446h-.171l-.011.446zm.011-.445a2.611 2.611 0 0 1 .689-1.827l-.122-.121a2.78 2.78 0 0 0-.738 1.942zm.689-1.827a2.447 2.447 0 0 1 1.813-.655v-.171a2.617 2.617 0 0 0-1.934.705zm1.813-.655a2.836 2.836 0 0 1 1.32.28l.079-.152a3 3 0 0 0-1.4-.3zm1.32.28a1.99 1.99 0 0 1 .792.683l.145-.091a2.158 2.158 0 0 0-.858-.744zm.793.685a1.617 1.617 0 0 1 .287.8l.171-.009a1.789 1.789 0 0 0-.315-.89zm.287.809a.11.11 0 0 1-.037.1l.112.13a.281.281 0 0 0 .1-.252zm-.037.1a.2.2 0 0 1-.134.046v.171a.369.369 0 0 0 .246-.088zm-.134.046h-.535v.171h.535zm-.535 0a.184.184 0 0 1-.114-.026l-.107.134a.345.345 0 0 0 .221.064zm-.114-.026a.389.389 0 0 1-.086-.144l-.158.066a.533.533 0 0 0 .137.212zm-.084-.14a1.514 1.514 0 0 0-.57-.8l-.093.144a1.343 1.343 0 0 1 .5.715zm-.568-.8a1.6 1.6 0 0 0-.918-.249v.171a1.435 1.435 0 0 1 .822.219zm-.918-.249a1.535 1.535 0 0 0-1.166.462l.124.118a1.364 1.364 0 0 1 1.042-.408zm-1.166.462a2.036 2.036 0 0 0-.458 1.36l.171.006a1.872 1.872 0 0 1 .411-1.249zm-.458 1.361l-.011.4h.171l.011-.4zm-.011.406l.011.379.171-.005-.011-.379zm.011.38a2.052 2.052 0 0 0 .458 1.371l.124-.118a1.889 1.889 0 0 1-.411-1.26zm.458 1.371a1.533 1.533 0 0 0 1.166.451v-.172a1.363 1.363 0 0 1-1.042-.4zm1.166.451a1.661 1.661 0 0 0 .916-.237l-.093-.144a1.491 1.491 0 0 1-.823.209zm.918-.238a1.576 1.576 0 0 0 .568-.812l-.162-.057a1.409 1.409 0 0 1-.5.727zm.566-.807a.39.39 0 0 1 .086-.144l-.107-.134a.533.533 0 0 0-.137.213zm.093-.151a.144.144 0 0 1 .107-.031v-.171a.31.31 0 0 0-.228.081zm.107-.031h.535v-.171h-.535zm.535 0a.173.173 0 0 1 .129.053l.121-.121a.344.344 0 0 0-.25-.1zm.134.057a.11.11 0 0 1 .037.1l.17.017a.281.281 0 0 0-.1-.252zm.037.109a1.664 1.664 0 0 1-.288.806l.144.092a1.839 1.839 0 0 0 .315-.889zm-.288.806a1.989 1.989 0 0 1-.792.683l.079.152a2.162 2.162 0 0 0 .858-.744zm-.793.684a2.8 2.8 0 0 1-1.32.28v.171a2.96 2.96 0 0 0 1.4-.3zm2.568.187l-.065.056.01.009zm0-7.772l.061.06zm.926 0l-.065.056.009.009zm.078 2.776h-.085a.086.086 0 0 0 .153.053zm.758-.624l.038.077zm2.743.468l-.065.056zm.524 5.151l-.061-.06zm-.925 0l-.065.056.009.009zm-.457-4.5l-.065.056zm-2.23.011l-.062-.059zm-.49 4.493l-.061-.06zm-.736-.019a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.367.367 0 0 0 .087.245zm-.046-.134v-7.4h-.172v7.4zm0-7.4a.156.156 0 0 1 .042-.118l-.121-.121a.326.326 0 0 0-.092.239zm.042-.118a.172.172 0 0 1 .129-.053v-.171a.343.343 0 0 0-.25.1zm.129-.053h.557v-.171h-.557zm.557 0a.137.137 0 0 1 .113.048l.13-.112a.308.308 0 0 0-.244-.108zm.122.057a.137.137 0 0 1 .048.113h.172a.309.309 0 0 0-.108-.243zm.048.113v2.6h.172v-2.6zm.153 2.651a2.076 2.076 0 0 1 .728-.6l-.075-.154a2.248 2.248 0 0 0-.788.649zm.73-.6a2.272 2.272 0 0 1 1.043-.214v-.171a2.438 2.438 0 0 0-1.121.232zm1.043-.214a1.982 1.982 0 0 1 1.6.661l.13-.112a2.152 2.152 0 0 0-1.727-.721zm1.6.663a2.557 2.557 0 0 1 .581 1.761h.171a2.727 2.727 0 0 0-.624-1.874zm.581 1.761v3.144h.171v-3.144zm0 3.144a.173.173 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm-.557 0a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.368.368 0 0 0 .087.245zm-.046-.134V823.8h-.172v3.088zm0-3.088a1.859 1.859 0 0 0-.412-1.284l-.128.114a1.69 1.69 0 0 1 .368 1.169zm-.411-1.283a1.471 1.471 0 0 0-1.169-.464v.171a1.3 1.3 0 0 1 1.039.406zm-1.169-.464a1.566 1.566 0 0 0-1.188.473l.124.118a1.4 1.4 0 0 1 1.064-.419zm-1.188.473a1.779 1.779 0 0 0-.436 1.275h.172a1.609 1.609 0 0 1 .389-1.156zm-.436 1.275v3.088h.172V823.8zm0 3.088a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm6.449-.505l-.062.059zm-.747-1.94h-.086zm-.012-.379h-.085v.005zm.012-.368l-.086-.006zm.758-1.918l-.061-.06zm3.735.078l-.065.056zm.6 2.5l.061.061zm-4.036.067v-.086a.086.086 0 0 0-.086.086zm0 .1h-.086zm.435 1.238l-.068.053zm1.918.3l.045.073zm.491-.435l-.069-.051zm.145-.156l.039.077h.006zm.9.022l-.055.066zm-.245.747l-.064-.057zm-.858.6l.035.078zm.267-3.189v.086a.086.086 0 0 0 .086-.086zm-.424-1.282l-.066.055zm-2.23 0l-.065-.055zm-.4 1.282h-.086a.086.086 0 0 0 .086.086zm1.528 3.349a2.38 2.38 0 0 1-1.779-.677l-.122.12a2.55 2.55 0 0 0 1.9.728zm-1.778-.676a2.86 2.86 0 0 1-.724-1.886l-.171.009a3.027 3.027 0 0 0 .771 1.995zm-.723-1.884l-.011-.379h-.171l.011.379zm-.011-.374l.011-.368-.172-.005-.011.368zm.011-.365a2.871 2.871 0 0 1 .735-1.864l-.124-.118a3.042 3.042 0 0 0-.782 1.971zm.734-1.864a2.331 2.331 0 0 1 1.756-.687v-.171a2.5 2.5 0 0 0-1.879.74zm1.756-.687a2.307 2.307 0 0 1 1.853.762l.13-.112a2.477 2.477 0 0 0-1.983-.821zm1.854.762a3.03 3.03 0 0 1 .659 2.062h.172a3.2 3.2 0 0 0-.7-2.175zm.659 2.062v.19h.172v-.19zm0 .19a.172.172 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-3.858v.171h3.858zm-3.944.086v.1h.172v-.1zm0 .1a2.2 2.2 0 0 0 .453 1.287l.135-.106a2.027 2.027 0 0 1-.417-1.189zm.454 1.288a1.418 1.418 0 0 0 1.148.533v-.171a1.247 1.247 0 0 1-1.015-.47zm1.148.533a1.647 1.647 0 0 0 .882-.214l-.09-.146a1.481 1.481 0 0 1-.791.188zm.882-.214a1.777 1.777 0 0 0 .515-.458l-.14-.1a1.613 1.613 0 0 1-.466.412zm.513-.456a1.251 1.251 0 0 1 .081-.1.28.28 0 0 1 .026-.025l.008-.006-.077-.153a.326.326 0 0 0-.083.068 1.55 1.55 0 0 0-.092.113zm.12-.134a.328.328 0 0 1 .146-.021v-.171a.468.468 0 0 0-.234.046zm.146-.021h.547v-.171h-.547zm.547 0a.166.166 0 0 1 .112.036l.11-.132a.337.337 0 0 0-.222-.076zm.112.036a.107.107 0 0 1 .036.09h.171a.277.277 0 0 0-.1-.222zm.036.09a.9.9 0 0 1-.291.534l.128.115a1.055 1.055 0 0 0 .334-.649zm-.291.535a2.42 2.42 0 0 1-.83.581l.072.156a2.6 2.6 0 0 0 .888-.624zm-.829.58a2.964 2.964 0 0 1-1.224.238v.171a3.133 3.133 0 0 0 1.295-.253zm.389-3.111v-.033h-.171v.033zm0-.033a1.9 1.9 0 0 0-.445-1.306l-.129.114a1.731 1.731 0 0 1 .4 1.192zm-.444-1.3a1.466 1.466 0 0 0-1.181-.521v.172a1.3 1.3 0 0 1 1.049.46zm-1.181-.521a1.466 1.466 0 0 0-1.18.521l.131.11a1.3 1.3 0 0 1 1.049-.46zm-1.181.521a1.965 1.965 0 0 0-.422 1.3h.172a1.794 1.794 0 0 1 .382-1.194zm-.422 1.3v.033h.172v-.033zm.086.119h3.055v-.171h-3.055z" fill="#51504f" data-name="Path 10" transform="translate(-1460.636 -807.945)"></path>
<path id="Path_11" d="M1519.066 884.011a.581.581 0 0 1-.567-.567 1.151 1.151 0 0 1 .028-.312l7.026-18.328a.881.881 0 0 1 .906-.623h1.926a.882.882 0 0 1 .907.623l7 18.328.057.312a.583.583 0 0 1-.567.567h-1.445a.735.735 0 0 1-.482-.142.9.9 0 0 1-.226-.34l-1.558-4.023h-9.292l-1.558 4.023a.8.8 0 0 1-.255.34.688.688 0 0 1-.453.142zm12.181-6.94l-3.824-10.056-3.823 10.055zm8.184-10.538a.592.592 0 0 1-.652-.651v-1.53a.714.714 0 0 1 .17-.482.656.656 0 0 1 .482-.2h1.785a.677.677 0 0 1 .68.68v1.53a.655.655 0 0 1-.2.481.713.713 0 0 1-.481.17zm.227 17.479a.593.593 0 0 1-.652-.652v-13.428a.611.611 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.359a.679.679 0 0 1 .652.651v13.427a.655.655 0 0 1-.2.482.613.613 0 0 1-.453.17zm6.861 0a.592.592 0 0 1-.651-.652v-13.4a.715.715 0 0 1 .17-.481.656.656 0 0 1 .482-.2h1.3a.677.677 0 0 1 .68.68v1.246a4.255 4.255 0 0 1 3.966-1.926h1.1a.679.679 0 0 1 .651.651v1.161a.566.566 0 0 1-.2.453.612.612 0 0 1-.453.17h-1.7a3.2 3.2 0 0 0-2.408.907 3.253 3.253 0 0 0-.879 2.408v8.328a.656.656 0 0 1-.2.482.716.716 0 0 1-.482.17zm12.234 0a.593.593 0 0 1-.651-.652v-11.814h-2.408a.592.592 0 0 1-.651-.651v-.963a.611.611 0 0 1 .17-.453.654.654 0 0 1 .481-.2h2.408v-1.417q0-4.816 4.872-4.815h1.586a.679.679 0 0 1 .652.651v.963a.656.656 0 0 1-.2.481.613.613 0 0 1-.453.17h-1.529a2.1 2.1 0 0 0-1.785.68 3.248 3.248 0 0 0-.51 2.011v1.275h6.062V863.7a.613.613 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.3a.679.679 0 0 1 .652.651v19.659a.655.655 0 0 1-.2.482.613.613 0 0 1-.454.17h-1.3a.592.592 0 0 1-.652-.652v-11.811h-6.062v11.813a.657.657 0 0 1-.2.482.614.614 0 0 1-.454.17zm20.9.283a6.487 6.487 0 0 1-4.844-1.757 6.837 6.837 0 0 1-1.813-4.674l-.029-1.218.029-1.218a6.732 6.732 0 0 1 1.841-4.646 7.389 7.389 0 0 1 9.631 0 6.736 6.736 0 0 1 1.841 4.646q.028.311.028 1.218t-.028 1.218a6.772 6.772 0 0 1-1.841 4.674 6.391 6.391 0 0 1-4.82 1.756zm0-2.181a3.582 3.582 0 0 0 2.8-1.133 4.931 4.931 0 0 0 1.133-3.258q.028-.283.028-1.076t-.028-1.076a4.931 4.931 0 0 0-1.133-3.258 3.582 3.582 0 0 0-2.8-1.133 3.671 3.671 0 0 0-2.833 1.133 4.83 4.83 0 0 0-1.1 3.258l-.028 1.076.028 1.076a4.83 4.83 0 0 0 1.1 3.258 3.671 3.671 0 0 0 2.828 1.132zm13.755 1.9a.846.846 0 0 1-.566-.17 1.321 1.321 0 0 1-.34-.538l-4.023-13.144-.056-.283a.575.575 0 0 1 .17-.425.641.641 0 0 1 .425-.17h1.246a.612.612 0 0 1 .453.17.646.646 0 0 1 .255.312l3.145 10.679 3.371-10.566a.761.761 0 0 1 .255-.4.726.726 0 0 1 .538-.2h.963a.728.728 0 0 1 .539.2.76.76 0 0 1 .255.4l3.371 10.566 3.144-10.679a.655.655 0 0 1 .2-.312.714.714 0 0 1 .482-.17h1.275a.542.542 0 0 1 .4.17.576.576 0 0 1 .17.425l-.057.283-3.994 13.144a1.323 1.323 0 0 1-.34.538.9.9 0 0 1-.6.17h-1.1a.86.86 0 0 1-.935-.708l-3.286-10.141-3.286 10.141a.928.928 0 0 1-.963.708z" fill="#51504f" data-name="Path 11" transform="translate(-1454.66 -838.62)"></path>
</g>
</g>
</g>
</svg>
</a>
</div>
<div class="desktop-only navbar__menu-container">
<div class="navbar__menu-content" id="main_navbar">
<div class="navbar__links-container">
<a class="navbar__text-link" href="/community/">
Community
</a>
<a class="navbar__text-link" href="/meetups/">
Meetups
</a>
<a class="navbar__text-link" href="/docs/">
Documentation
</a>
<a class="navbar__text-link" href="/use-cases/">
Use-cases
</a>
<a class="navbar__text-link" href="/announcements/">
Announcements
</a>
<a class="navbar__text-link" href="/blog/">
Blog
</a>
<a class="navbar__text-link" href="/ecosystem/">
Ecosystem
</a>
</div>
</div>
</div>
<div class="mobile-only navbar__drawer-container">
<button class="navbar__toggle-button" id="navbar-toggle-button">
<div id="hamburger-icon" class="navbar__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="26" height="20" viewBox="0 0 26 20">
<g id="Group_1294" data-name="Group 1294" transform="translate(-38.791 291)">
<g id="Group_1291" data-name="Group 1291" transform="translate(39 -291)">
<rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect>
</g>
<g id="Group_1292" data-name="Group 1292" transform="translate(39 -281.822)">
<rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect>
</g>
<g id="Group_1293" data-name="Group 1293" transform="translate(39 -272.644)">
<rect id="Rectangle_463" width="26" height="2" fill="#51504f" data-name="Rectangle 463" rx="1" transform="translate(-.209 -.356)"></rect>
</g>
</g>
</svg>
</div>
<div id="close-icon" class="navbar__toggle-button--icon">
<svg xmlns="http://www.w3.org/2000/svg" width="19.799" height="19.799" viewBox="0 0 19.799 19.799">
<g id="Group_1574" data-name="Group 1574" transform="translate(-41.892 290.899)">
<g id="Group_1291" data-name="Group 1291" transform="rotate(-45 -308.114 -187.077)">
<rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect>
</g>
<g id="Group_1292" data-name="Group 1292" transform="rotate(45 372.48 -93.011)">
<rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect>
</g>
</g>
</svg>
</div>
</button>
<div class="navbar__drawer" id="navbar-drawer">
<div class="navbar__menu-content" id="main_navbar">
<div class="navbar__links-container">
<a class="navbar__text-link" href="/community/">
Community
</a>
<a class="navbar__text-link" href="/meetups/">
Meetups
</a>
<a class="navbar__text-link" href="/docs/">
Documentation
</a>
<a class="navbar__text-link" href="/use-cases/">
Use-cases
</a>
<a class="navbar__text-link" href="/announcements/">
Announcements
</a>
<a class="navbar__text-link" href="/blog/">
Blog
</a>
<a class="navbar__text-link" href="/ecosystem/">
Ecosystem
</a>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="roadmap container-fluid td-default base-layout">
<div class="content-drawer-wrapper">
<button class="content-drawer__toggle-button" id="content-open-button">
<div id="hamburger-icon" class="content-drawer__toggle-button--icon visible">
<svg xmlns="http://www.w3.org/2000/svg" width="20.005" height="13.879" viewBox="0 0 20.005 13.879">
<g id="Group_1619" data-name="Group 1619" transform="translate(271.132 -418.872)">
<g id="Group_1613" data-name="Group 1613" transform="translate(-266.229 431.045)">
<path id="Path_1337" d="M-218.5 513.215h-14.583a.259.259 0 0 1-.259-.26.259.259 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.259.259 0 0 1-.259.26z" fill="#51504f" data-name="Path 1337" transform="translate(233.345 -512.696)"></path>
</g>
<g id="Group_1614" data-name="Group 1614" transform="translate(-266.229 425.684)">
<path id="Path_1338" d="M-218.5 471.9h-14.583a.259.259 0 0 1-.259-.26.26.26 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.26.26 0 0 1-.259.26z" fill="#51504f" data-name="Path 1338" transform="translate(233.345 -471.376)"></path>
</g>
<g id="Group_1615" data-name="Group 1615" transform="translate(-266.229 420.323)">
<path id="Path_1339" d="M-218.5 430.574h-14.583a.259.259 0 0 1-.259-.259.259.259 0 0 1 .259-.259h14.583a.26.26 0 0 1 .259.259.259.259 0 0 1-.259.259z" fill="#51504f" data-name="Path 1339" transform="translate(233.345 -430.055)"></path>
</g>
<g id="Group_1616" data-name="Group 1616" transform="translate(-271.132 429.814)">
<path id="Path_1340" d="M-269.663 506.145a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.95z" fill="#51504f" data-name="Path 1340" transform="translate(271.132 -503.208)"></path>
</g>
<g id="Group_1617" data-name="Group 1617" transform="translate(-271.132 424.556)">
<path id="Path_1341" d="M-269.663 465.62a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.952z" fill="#51504f" data-name="Path 1341" transform="translate(271.132 -462.683)"></path>
</g>
<g id="Group_1618" data-name="Group 1618" transform="translate(-271.132 418.872)">
<path id="Path_1342" d="M-269.663 421.809a1.47 1.47 0 0 1-1.469-1.469 1.47 1.47 0 0 1 1.469-1.469 1.47 1.47 0 0 1 1.469 1.469 1.47 1.47 0 0 1-1.469 1.469zm0-2.418a.951.951 0 0 0-.95.95.951.951 0 0 0 .95.95.951.951 0 0 0 .95-.95.951.951 0 0 0-.95-.95z" fill="#51504f" data-name="Path 1342" transform="translate(271.132 -418.872)"></path>
</g>
</g>
</svg>
<span class="bodytext__mobile--brownish-grey">Content</span>
</div>
</button>
<nav id="content-navbar" class="navbar navbar--hidden">
<div class="navbar__icon-container">
<a href="/">
<svg xmlns="http://www.w3.org/2000/svg" width="155.314" height="60" viewBox="0 0 155.314 60">
<defs>
<clipPath id="clip-path">
<path id="Rectangle_1" d="M0 0h155.314v60H0z" fill="none" data-name="Rectangle 1"></path>
</clipPath>
</defs>
<g id="logo" transform="translate(-1305 -780.355)">
<g id="Group_2" clip-path="url(#clip-path)" data-name="Group 2" transform="translate(1305 780.355)">
<g id="Group_1" data-name="Group 1" transform="translate(.486 .486)">
<path id="Path_1" d="M1307.562 880.867l28.187-28.893a.521.521 0 0 0 .063-.666c-1.714-2.393-4.877-2.808-6.049-4.416-3.472-4.763-4.353-7.459-5.845-7.292a.456.456 0 0 0-.271.143l-10.182 10.438c-5.858 6-6.7 19.225-6.852 30.3a.552.552 0 0 0 .949.386z" fill="#017cee" data-name="Path 1" transform="translate(-1306.613 -822.232)"></path>
<path id="Path_2" d="M1405.512 908.489l-28.893-28.189a.521.521 0 0 0-.667-.063c-2.393 1.715-2.808 4.877-4.416 6.049-4.763 3.472-7.459 4.353-7.292 5.845a.456.456 0 0 0 .143.27l10.438 10.182c6 5.858 19.225 6.7 30.3 6.852a.552.552 0 0 0 .387-.946z" fill="#00ad46" data-name="Path 2" transform="translate(-1346.876 -850.567)"></path>
<path id="Path_3" d="M1373.909 902.252c-3.28-3.2-4.8-9.53 1.486-22.583-10.219 4.567-13.8 10.57-12.039 12.289z" fill="#04d659" data-name="Path 3" transform="translate(-1345.96 -850.233)"></path>
<path id="Path_4" d="M1433.132 782.359l-28.186 28.893a.52.52 0 0 0-.063.666c1.715 2.393 4.876 2.808 6.049 4.416 3.472 4.763 4.354 7.459 5.845 7.292a.454.454 0 0 0 .271-.143l10.182-10.438c5.858-6 6.7-19.225 6.852-30.3a.553.553 0 0 0-.95-.386z" fill="#00c7d4" data-name="Path 4" transform="translate(-1375.21 -782.123)"></path>
<path id="Path_5" d="M1426.9 881.155c-3.2 3.28-9.53 4.8-22.584-1.486 4.567 10.219 10.57 13.8 12.289 12.039z" fill="#11e1ee" data-name="Path 5" transform="translate(-1374.875 -850.233)"></path>
<path id="Path_6" d="M1307 782.919l28.893 28.186a.521.521 0 0 0 .666.063c2.393-1.715 2.808-4.877 4.416-6.049 4.763-3.472 7.459-4.353 7.292-5.845a.459.459 0 0 0-.143-.271l-10.438-10.182c-6-5.858-19.225-6.7-30.3-6.852a.552.552 0 0 0-.386.95z" fill="#e43921" data-name="Path 6" transform="translate(-1306.766 -781.97)"></path>
<path id="Path_7" d="M1405.8 804.711c3.28 3.2 4.8 9.53-1.486 22.584 10.219-4.567 13.8-10.571 12.039-12.289z" fill-rule="evenodd" fill="#ff7557" data-name="Path 7" transform="translate(-1374.875 -797.859)"></path>
<path id="Path_8" d="M1329.355 849.266c3.2-3.28 9.53-4.8 22.584 1.486-4.567-10.219-10.57-13.8-12.289-12.039z" fill="#0cb6ff" data-name="Path 8" transform="translate(-1322.503 -821.316)"></path>
<circle id="Ellipse_1" cx="1.26" cy="1.26" r="1.26" fill="#4a4848" data-name="Ellipse 1" transform="translate(28.18 28.171)"></circle>
<path id="Path_9" d="M1527.558 827.347a.229.229 0 0 1-.223-.223.458.458 0 0 1 .011-.123l2.766-7.214a.346.346 0 0 1 .357-.245h.758a.348.348 0 0 1 .357.245l2.754 7.214.022.123a.228.228 0 0 1-.223.223h-.568a.288.288 0 0 1-.19-.056.352.352 0 0 1-.089-.134l-.613-1.583h-3.657l-.613 1.583a.317.317 0 0 1-.1.134.269.269 0 0 1-.178.056zm4.795-2.732l-1.505-3.958-1.505 3.958zm3.322 4.85a.258.258 0 0 1-.189-.078.241.241 0 0 1-.067-.178v-7.4a.241.241 0 0 1 .067-.178.258.258 0 0 1 .189-.078h.513a.268.268 0 0 1 .256.256v.49a2.118 2.118 0 0 1 1.828-.858 2.092 2.092 0 0 1 1.751.736 3.135 3.135 0 0 1 .636 1.9q.011.122.011.379t-.011.379a3.168 3.168 0 0 1-.636 1.9 2.111 2.111 0 0 1-1.751.736 2.154 2.154 0 0 1-1.806-.836v2.587a.241.241 0 0 1-.067.178.223.223 0 0 1-.179.078zm2.364-2.91a1.324 1.324 0 0 0 1.149-.491 2.266 2.266 0 0 0 .4-1.293q.011-.111.011-.323 0-2.107-1.562-2.107a1.365 1.365 0 0 0-1.159.513 2.111 2.111 0 0 0-.412 1.2l-.012.424.012.435a1.862 1.862 0 0 0 .424 1.149 1.4 1.4 0 0 0 1.148.493zm5.628.9a2.329 2.329 0 0 1-1.015-.223 1.94 1.94 0 0 1-.747-.6 1.487 1.487 0 0 1-.268-.859 1.459 1.459 0 0 1 .6-1.2 3.4 3.4 0 0 1 1.65-.624l1.661-.234v-.323q0-1.137-1.3-1.137a1.4 1.4 0 0 0-.8.212 1.376 1.376 0 0 0-.468.48.305.305 0 0 1-.089.145.18.18 0 0 1-.134.045h-.48a.23.23 0 0 1-.245-.245 1.17 1.17 0 0 1 .245-.6 1.931 1.931 0 0 1 .747-.591 2.7 2.7 0 0 1 1.238-.256 2.351 2.351 0 0 1 1.8.591 2.032 2.032 0 0 1 .547 1.45v3.613a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.513a.233.233 0 0 1-.257-.256v-.479a1.923 1.923 0 0 1-.714.6 2.557 2.557 0 0 1-1.203.237zm.234-.836a1.579 1.579 0 0 0 1.182-.469 1.881 1.881 0 0 0 .468-1.371v-.312l-1.293.19a2.918 2.918 0 0 0-1.193.379.761.761 0 0 0-.4.658.784.784 0 0 0 .368.691 1.585 1.585 0 0 0 .867.237zm6.643.836a2.556 2.556 0 0 1-1.873-.669 2.738 2.738 0 0 1-.714-1.9l-.011-.446.011-.446a2.7 2.7 0 0 1 .714-1.885 2.531 2.531 0 0 1 1.873-.68 2.917 2.917 0 0 1 1.36.29 2.077 2.077 0 0 1 .825.714 1.7 1.7 0 0 1 .3.848.2.2 0 0 1-.067.178.281.281 0 0 1-.19.067h-.535a.265.265 0 0 1-.168-.045.458.458 0 0 1-.111-.178 1.428 1.428 0 0 0-.535-.758 1.516 1.516 0 0 0-.87-.234 1.45 1.45 0 0 0-1.1.435 1.952 1.952 0 0 0-.435 1.3l-.011.4.011.379a1.969 1.969 0 0 0 .435 1.316 1.446 1.446 0 0 0 1.1.424 1.577 1.577 0 0 0 .87-.223 1.493 1.493 0 0 0 .535-.769.458.458 0 0 1 .111-.178.228.228 0 0 1 .168-.056h.535a.258.258 0 0 1 .19.078.2.2 0 0 1 .067.178 1.75 1.75 0 0 1-.3.847 2.078 2.078 0 0 1-.825.714 2.876 2.876 0 0 1-1.361.302zm4.078-.112a.233.233 0 0 1-.257-.256v-7.4a.241.241 0 0 1 .067-.178.259.259 0 0 1 .19-.078h.557a.267.267 0 0 1 .257.256v2.6a2.167 2.167 0 0 1 .758-.624 2.353 2.353 0 0 1 1.082-.223 2.067 2.067 0 0 1 1.661.691 2.642 2.642 0 0 1 .6 1.818v3.144a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067h-.557a.233.233 0 0 1-.256-.256V824a1.775 1.775 0 0 0-.39-1.227 1.387 1.387 0 0 0-1.1-.435 1.481 1.481 0 0 0-1.126.446 1.7 1.7 0 0 0-.412 1.215v3.088a.257.257 0 0 1-.078.19.24.24 0 0 1-.178.067zm8.846.112a2.466 2.466 0 0 1-1.84-.7 2.938 2.938 0 0 1-.747-1.94l-.011-.379.011-.368a2.953 2.953 0 0 1 .758-1.918 2.7 2.7 0 0 1 3.735.078 3.114 3.114 0 0 1 .68 2.119v.19a.257.257 0 0 1-.078.189.241.241 0 0 1-.178.067h-3.858v.1a2.11 2.11 0 0 0 .435 1.238 1.332 1.332 0 0 0 1.081.5 1.563 1.563 0 0 0 .836-.2 1.7 1.7 0 0 0 .491-.435.6.6 0 0 1 .145-.156.391.391 0 0 1 .19-.033h.547a.252.252 0 0 1 .167.056.192.192 0 0 1 .067.156.975.975 0 0 1-.312.591 2.51 2.51 0 0 1-.859.6 3.049 3.049 0 0 1-1.26.248zm1.527-3.434v-.033a1.817 1.817 0 0 0-.424-1.249 1.512 1.512 0 0 0-2.23 0 1.883 1.883 0 0 0-.4 1.249v.033z" fill="#51504f" data-name="Path 9" transform="translate(-1460.834 -808.144)"></path>
<path id="Path_10" d="M1527.2 827.081l-.061.061zm-.056-.279l-.08-.031zm2.766-7.214l.08.031zm1.472 0l-.081.029zm2.754 7.214l.084-.015a.064.064 0 0 0 0-.015zm.022.123h.086v-.015zm-.067.156l.06.061zm-.914.011l-.061.061.006.005zm-.089-.134l.081-.027zm-.613-1.583l.08-.031a.086.086 0 0 0-.08-.055zm-3.657 0v-.086a.086.086 0 0 0-.08.055zm-.613 1.583l-.08-.031zm-.1.134l.055.066zm4.047-2.676v.086a.086.086 0 0 0 .08-.116zm-1.505-3.958l.08-.03a.086.086 0 0 0-.16 0zm-1.505 3.958l-.08-.03a.086.086 0 0 0 .08.116zm-1.784 2.646a.128.128 0 0 1-.1-.042l-.122.121a.3.3 0 0 0 .217.092zm-.1-.042a.129.129 0 0 1-.042-.1h-.171a.3.3 0 0 0 .092.217zm-.042-.1a.38.38 0 0 1 .007-.1l-.163-.054a.514.514 0 0 0-.016.15zm.005-.092l2.765-7.214-.16-.061-2.765 7.214zm2.766-7.216a.283.283 0 0 1 .1-.143.3.3 0 0 1 .174-.046v-.172a.47.47 0 0 0-.271.076.453.453 0 0 0-.166.226zm.276-.189h.758v-.172h-.758zm.758 0a.3.3 0 0 1 .175.046.283.283 0 0 1 .1.143l.161-.059a.451.451 0 0 0-.166-.226.47.47 0 0 0-.272-.076zm.277.19l2.754 7.214.16-.061-2.754-7.214zm2.75 7.2l.022.123.169-.031-.022-.123zm.021.107a.13.13 0 0 1-.042.1l.121.121a.3.3 0 0 0 .092-.217zm-.042.1a.13.13 0 0 1-.1.042v.171a.3.3 0 0 0 .217-.092zm-.1.042h-.568v.171h.568zm-.568 0a.206.206 0 0 1-.135-.036l-.11.132a.373.373 0 0 0 .245.076zm-.129-.031a.262.262 0 0 1-.069-.1l-.162.054a.431.431 0 0 0 .11.167zm-.07-.1l-.613-1.584-.16.062.613 1.583zm-.693-1.638h-3.657v.171h3.657zm-3.737.055l-.614 1.584.16.062.613-1.583zm-.615 1.587a.235.235 0 0 1-.075.1l.111.13a.4.4 0 0 0 .126-.172zm-.074.1a.185.185 0 0 1-.124.036v.171a.354.354 0 0 0 .233-.076zm-.124.036h-.569v.171h.569zm4.306-2.677l-1.505-3.958-.16.061 1.505 3.958zm-1.666-3.958l-1.505 3.958.16.061 1.505-3.958zm-1.425 4.075h3.01v-.171h-3.01zm6.143 4.687l-.06.061zm0-7.761l.061.061zm.881 0l-.065.056.01.009zm.078.669h-.086a.086.086 0 0 0 .155.051zm3.579-.123l-.067.053zm.636 1.9h-.086zm0 .758l-.085-.007zm-.636 1.9l.067.054zm-3.557-.1l.068-.052a.086.086 0 0 0-.154.052zm-.067 2.765l-.061-.06zm2.787-3.323l-.069-.051zm.4-1.293l-.085-.008v.005zm-2.709-1.918l-.068-.052zm-.413 1.2h-.086zm-.011.423h-.085zm.011.435h-.086zm.424 1.149l.066-.054zm-1.216 3.315a.173.173 0 0 1-.129-.053l-.121.121a.342.342 0 0 0 .25.1zm-.129-.053a.157.157 0 0 1-.042-.118h-.172a.325.325 0 0 0 .092.239zm-.042-.118v-7.4h-.172v7.4zm0-7.4a.157.157 0 0 1 .042-.118l-.121-.121a.324.324 0 0 0-.092.239zm.042-.118a.173.173 0 0 1 .129-.053v-.172a.342.342 0 0 0-.25.1zm.129-.053h.513v-.172h-.513zm.513 0a.137.137 0 0 1 .113.048l.13-.111a.309.309 0 0 0-.244-.108zm.123.058a.137.137 0 0 1 .048.113h.171a.309.309 0 0 0-.108-.243zm.048.113v.49h.171v-.49zm.155.541a2.033 2.033 0 0 1 1.759-.823v-.171a2.2 2.2 0 0 0-1.9.894zm1.759-.823a2.007 2.007 0 0 1 1.683.7l.135-.106a2.177 2.177 0 0 0-1.818-.768zm1.683.7a3.045 3.045 0 0 1 .617 1.845l.171-.007a3.218 3.218 0 0 0-.654-1.946zm.617 1.85c.007.078.011.2.011.372h.171c0-.171 0-.3-.012-.387zm.011.372c0 .171 0 .294-.011.372l.17.015c.008-.086.012-.216.012-.387zm-.011.376a3.08 3.08 0 0 1-.617 1.846l.134.106a3.25 3.25 0 0 0 .654-1.945zm-.617 1.845a2.025 2.025 0 0 1-1.683.7v.171a2.2 2.2 0 0 0 1.817-.768zm-1.683.7a2.068 2.068 0 0 1-1.739-.8l-.136.1a2.239 2.239 0 0 0 1.874.87zm-1.892-.75v2.587h.172v-2.587zm0 2.587a.156.156 0 0 1-.042.118l.121.121a.325.325 0 0 0 .092-.239zm-.046.123a.138.138 0 0 1-.114.048v.172a.308.308 0 0 0 .244-.108zm-.114.048h-.546v.172h.546zm1.817-2.739a1.408 1.408 0 0 0 1.218-.526l-.138-.1a1.24 1.24 0 0 1-1.079.455zm1.217-.525a2.355 2.355 0 0 0 .419-1.341l-.171-.007a2.182 2.182 0 0 1-.385 1.246zm.418-1.336c.008-.079.012-.19.012-.332h-.172c0 .14 0 .245-.011.315zm.012-.332a2.726 2.726 0 0 0-.407-1.632 1.448 1.448 0 0 0-1.24-.562v.171a1.278 1.278 0 0 1 1.1.492 2.565 2.565 0 0 1 .374 1.53zm-1.647-2.193a1.452 1.452 0 0 0-1.228.547l.136.1a1.282 1.282 0 0 1 1.091-.479zm-1.228.547a2.2 2.2 0 0 0-.43 1.252l.172.008a2.028 2.028 0 0 1 .4-1.157zm-.43 1.254l-.011.424h.171l.011-.424zm-.011.428l.011.435h.172l-.011-.435zm.011.436a1.95 1.95 0 0 0 .443 1.2l.133-.109a1.776 1.776 0 0 1-.4-1.1zm.443 1.2a1.484 1.484 0 0 0 1.214.522v-.171a1.314 1.314 0 0 1-1.082-.459zm5.828 1.117l.037-.077zm-.747-.6l-.07.049zm.335-2.063l.052.068zm1.65-.624l.012.085zm1.661-.234l.012.085a.086.086 0 0 0 .074-.085zm-2.107-1.249l.046.072zm-.468.48l-.075-.042a.083.083 0 0 0-.006.015zm-.089.145l-.054-.067-.007.006zm-.792-.022l-.065.056.009.009zm-.067-.178h-.086zm.245-.6l-.07-.049zm.747-.591l.038.077zm3.033.334l-.063.058zm.468 5.252l.06.061zm-.881 0l-.065.056a.043.043 0 0 0 .009.009zm-.067-.669h.086a.086.086 0 0 0-.156-.048zm-.714.6l-.04-.076zm.223-1.059l-.062-.06zm.468-1.684h.086a.086.086 0 0 0-.1-.085zm-1.293.189l.012.085zm-1.193.379l.046.072zm-.033 1.349l-.047.071zm.635.985a2.241 2.241 0 0 1-.978-.215l-.074.155a2.412 2.412 0 0 0 1.051.231zm-.978-.215a1.859 1.859 0 0 1-.715-.576l-.138.1a2.024 2.024 0 0 0 .779.629zm-.713-.573a1.4 1.4 0 0 1-.253-.81h-.172a1.571 1.571 0 0 0 .283.907zm-.253-.81a1.374 1.374 0 0 1 .569-1.136l-.105-.135a1.544 1.544 0 0 0-.635 1.272zm.569-1.137a3.316 3.316 0 0 1 1.609-.607l-.024-.17a3.481 3.481 0 0 0-1.691.642zm1.609-.607l1.661-.234-.024-.17-1.662.234zm1.735-.319v-.323h-.171v.323zm0-.323a1.156 1.156 0 0 0-.355-.917 1.536 1.536 0 0 0-1.035-.306v.172a1.37 1.37 0 0 1 .922.263.986.986 0 0 1 .3.788zm-1.39-1.223a1.486 1.486 0 0 0-.851.227l.1.142a1.316 1.316 0 0 1 .755-.2zm-.849.226a1.452 1.452 0 0 0-.5.51l.15.084a1.286 1.286 0 0 1 .44-.449zm-.5.524a.226.226 0 0 1-.062.105l.107.134a.391.391 0 0 0 .117-.185zm-.068.112a.1.1 0 0 1-.073.019v.171a.266.266 0 0 0 .194-.07zm-.073.019h-.48v.171h.48zm-.48 0a.18.18 0 0 1-.122-.046l-.112.13a.352.352 0 0 0 .234.087zm-.113-.037a.18.18 0 0 1-.047-.123h-.171a.352.352 0 0 0 .087.234zm-.047-.119a1.1 1.1 0 0 1 .23-.557l-.14-.1a1.253 1.253 0 0 0-.261.648zm.23-.556a1.843 1.843 0 0 1 .715-.564l-.075-.154a2.018 2.018 0 0 0-.78.618zm.716-.564a2.611 2.611 0 0 1 1.2-.247v-.171a2.781 2.781 0 0 0-1.277.266zm1.2-.247a2.268 2.268 0 0 1 1.732.563l.126-.116a2.435 2.435 0 0 0-1.858-.618zm1.733.564a1.945 1.945 0 0 1 .523 1.391h.171a2.117 2.117 0 0 0-.57-1.508zm.523 1.391v3.613h.171v-3.613zm0 3.613a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.157.157 0 0 1-.118.042v.171a.326.326 0 0 0 .239-.092zm-.118.042h-.513v.171h.513zm-.513 0a.2.2 0 0 1-.134-.046l-.111.13a.367.367 0 0 0 .245.088zm-.124-.037a.194.194 0 0 1-.047-.134h-.171a.366.366 0 0 0 .087.245zm-.047-.134v-.479h-.171v.479zm-.156-.528a1.846 1.846 0 0 1-.683.575l.079.152a2.012 2.012 0 0 0 .745-.629zm-.683.575a2.476 2.476 0 0 1-1.153.236v.171a2.644 2.644 0 0 0 1.233-.255zm-.919-.429a1.666 1.666 0 0 0 1.244-.494l-.123-.12a1.493 1.493 0 0 1-1.121.442zm1.244-.494a1.969 1.969 0 0 0 .492-1.431h-.171a1.8 1.8 0 0 1-.444 1.312zm.492-1.431v-.312h-.171v.312zm-.1-.4l-1.293.189.025.17 1.293-.189zm-1.293.189a3 3 0 0 0-1.228.393l.095.143a2.837 2.837 0 0 1 1.158-.365zm-1.227.392a.845.845 0 0 0-.441.73h.172a.676.676 0 0 1 .362-.586zm-.441.73a.869.869 0 0 0 .406.762l.095-.142a.7.7 0 0 1-.33-.62zm.408.764a1.673 1.673 0 0 0 .916.247v-.171a1.5 1.5 0 0 1-.823-.221zm5.686.329l-.061.06zm-.714-1.9h-.085zm-.011-.446h-.085zm.011-.446h-.085zm.714-1.885l.061.061zm3.234-.39l-.04.076zm.825.713l-.073.046zm.3.848h-.086zm-.067.178l.056.065zm-.892.022l.054-.067zm-.112-.178l-.081.029zm-.535-.758l-.048.071zm-1.974.2l-.062-.059zm-.435 1.3h-.086zm-.011.4h-.086zm.011.379h-.086zm.435 1.316l-.062.059zm1.974.2l.046.072zm.535-.769l-.079-.033zm.112-.178l.054.067.007-.006zm.892.022l-.061.06zm.067.178l-.085-.009zm-.3.847l-.072-.046zm-.825.714l-.04-.076zm-1.36.2a2.471 2.471 0 0 1-1.814-.644l-.12.122a2.64 2.64 0 0 0 1.933.694zm-1.813-.643a2.653 2.653 0 0 1-.689-1.839l-.171.006a2.822 2.822 0 0 0 .738 1.952zm-.689-1.838l-.011-.446h-.171l.011.446zm-.011-.442l.011-.446h-.171l-.011.446zm.011-.445a2.611 2.611 0 0 1 .689-1.827l-.122-.121a2.78 2.78 0 0 0-.738 1.942zm.689-1.827a2.447 2.447 0 0 1 1.813-.655v-.171a2.617 2.617 0 0 0-1.934.705zm1.813-.655a2.836 2.836 0 0 1 1.32.28l.079-.152a3 3 0 0 0-1.4-.3zm1.32.28a1.99 1.99 0 0 1 .792.683l.145-.091a2.158 2.158 0 0 0-.858-.744zm.793.685a1.617 1.617 0 0 1 .287.8l.171-.009a1.789 1.789 0 0 0-.315-.89zm.287.809a.11.11 0 0 1-.037.1l.112.13a.281.281 0 0 0 .1-.252zm-.037.1a.2.2 0 0 1-.134.046v.171a.369.369 0 0 0 .246-.088zm-.134.046h-.535v.171h.535zm-.535 0a.184.184 0 0 1-.114-.026l-.107.134a.345.345 0 0 0 .221.064zm-.114-.026a.389.389 0 0 1-.086-.144l-.158.066a.533.533 0 0 0 .137.212zm-.084-.14a1.514 1.514 0 0 0-.57-.8l-.093.144a1.343 1.343 0 0 1 .5.715zm-.568-.8a1.6 1.6 0 0 0-.918-.249v.171a1.435 1.435 0 0 1 .822.219zm-.918-.249a1.535 1.535 0 0 0-1.166.462l.124.118a1.364 1.364 0 0 1 1.042-.408zm-1.166.462a2.036 2.036 0 0 0-.458 1.36l.171.006a1.872 1.872 0 0 1 .411-1.249zm-.458 1.361l-.011.4h.171l.011-.4zm-.011.406l.011.379.171-.005-.011-.379zm.011.38a2.052 2.052 0 0 0 .458 1.371l.124-.118a1.889 1.889 0 0 1-.411-1.26zm.458 1.371a1.533 1.533 0 0 0 1.166.451v-.172a1.363 1.363 0 0 1-1.042-.4zm1.166.451a1.661 1.661 0 0 0 .916-.237l-.093-.144a1.491 1.491 0 0 1-.823.209zm.918-.238a1.576 1.576 0 0 0 .568-.812l-.162-.057a1.409 1.409 0 0 1-.5.727zm.566-.807a.39.39 0 0 1 .086-.144l-.107-.134a.533.533 0 0 0-.137.213zm.093-.151a.144.144 0 0 1 .107-.031v-.171a.31.31 0 0 0-.228.081zm.107-.031h.535v-.171h-.535zm.535 0a.173.173 0 0 1 .129.053l.121-.121a.344.344 0 0 0-.25-.1zm.134.057a.11.11 0 0 1 .037.1l.17.017a.281.281 0 0 0-.1-.252zm.037.109a1.664 1.664 0 0 1-.288.806l.144.092a1.839 1.839 0 0 0 .315-.889zm-.288.806a1.989 1.989 0 0 1-.792.683l.079.152a2.162 2.162 0 0 0 .858-.744zm-.793.684a2.8 2.8 0 0 1-1.32.28v.171a2.96 2.96 0 0 0 1.4-.3zm2.568.187l-.065.056.01.009zm0-7.772l.061.06zm.926 0l-.065.056.009.009zm.078 2.776h-.085a.086.086 0 0 0 .153.053zm.758-.624l.038.077zm2.743.468l-.065.056zm.524 5.151l-.061-.06zm-.925 0l-.065.056.009.009zm-.457-4.5l-.065.056zm-2.23.011l-.062-.059zm-.49 4.493l-.061-.06zm-.736-.019a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.367.367 0 0 0 .087.245zm-.046-.134v-7.4h-.172v7.4zm0-7.4a.156.156 0 0 1 .042-.118l-.121-.121a.326.326 0 0 0-.092.239zm.042-.118a.172.172 0 0 1 .129-.053v-.171a.343.343 0 0 0-.25.1zm.129-.053h.557v-.171h-.557zm.557 0a.137.137 0 0 1 .113.048l.13-.112a.308.308 0 0 0-.244-.108zm.122.057a.137.137 0 0 1 .048.113h.172a.309.309 0 0 0-.108-.243zm.048.113v2.6h.172v-2.6zm.153 2.651a2.076 2.076 0 0 1 .728-.6l-.075-.154a2.248 2.248 0 0 0-.788.649zm.73-.6a2.272 2.272 0 0 1 1.043-.214v-.171a2.438 2.438 0 0 0-1.121.232zm1.043-.214a1.982 1.982 0 0 1 1.6.661l.13-.112a2.152 2.152 0 0 0-1.727-.721zm1.6.663a2.557 2.557 0 0 1 .581 1.761h.171a2.727 2.727 0 0 0-.624-1.874zm.581 1.761v3.144h.171v-3.144zm0 3.144a.173.173 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm-.557 0a.2.2 0 0 1-.134-.046l-.112.13a.367.367 0 0 0 .245.088zm-.124-.037a.2.2 0 0 1-.046-.134h-.172a.368.368 0 0 0 .087.245zm-.046-.134V823.8h-.172v3.088zm0-3.088a1.859 1.859 0 0 0-.412-1.284l-.128.114a1.69 1.69 0 0 1 .368 1.169zm-.411-1.283a1.471 1.471 0 0 0-1.169-.464v.171a1.3 1.3 0 0 1 1.039.406zm-1.169-.464a1.566 1.566 0 0 0-1.188.473l.124.118a1.4 1.4 0 0 1 1.064-.419zm-1.188.473a1.779 1.779 0 0 0-.436 1.275h.172a1.609 1.609 0 0 1 .389-1.156zm-.436 1.275v3.088h.172V823.8zm0 3.088a.172.172 0 0 1-.053.129l.121.121a.344.344 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-.557v.171h.557zm6.449-.505l-.062.059zm-.747-1.94h-.086zm-.012-.379h-.085v.005zm.012-.368l-.086-.006zm.758-1.918l-.061-.06zm3.735.078l-.065.056zm.6 2.5l.061.061zm-4.036.067v-.086a.086.086 0 0 0-.086.086zm0 .1h-.086zm.435 1.238l-.068.053zm1.918.3l.045.073zm.491-.435l-.069-.051zm.145-.156l.039.077h.006zm.9.022l-.055.066zm-.245.747l-.064-.057zm-.858.6l.035.078zm.267-3.189v.086a.086.086 0 0 0 .086-.086zm-.424-1.282l-.066.055zm-2.23 0l-.065-.055zm-.4 1.282h-.086a.086.086 0 0 0 .086.086zm1.528 3.349a2.38 2.38 0 0 1-1.779-.677l-.122.12a2.55 2.55 0 0 0 1.9.728zm-1.778-.676a2.86 2.86 0 0 1-.724-1.886l-.171.009a3.027 3.027 0 0 0 .771 1.995zm-.723-1.884l-.011-.379h-.171l.011.379zm-.011-.374l.011-.368-.172-.005-.011.368zm.011-.365a2.871 2.871 0 0 1 .735-1.864l-.124-.118a3.042 3.042 0 0 0-.782 1.971zm.734-1.864a2.331 2.331 0 0 1 1.756-.687v-.171a2.5 2.5 0 0 0-1.879.74zm1.756-.687a2.307 2.307 0 0 1 1.853.762l.13-.112a2.477 2.477 0 0 0-1.983-.821zm1.854.762a3.03 3.03 0 0 1 .659 2.062h.172a3.2 3.2 0 0 0-.7-2.175zm.659 2.062v.19h.172v-.19zm0 .19a.172.172 0 0 1-.053.129l.121.121a.345.345 0 0 0 .1-.25zm-.053.129a.156.156 0 0 1-.118.042v.171a.327.327 0 0 0 .239-.092zm-.118.042h-3.858v.171h3.858zm-3.944.086v.1h.172v-.1zm0 .1a2.2 2.2 0 0 0 .453 1.287l.135-.106a2.027 2.027 0 0 1-.417-1.189zm.454 1.288a1.418 1.418 0 0 0 1.148.533v-.171a1.247 1.247 0 0 1-1.015-.47zm1.148.533a1.647 1.647 0 0 0 .882-.214l-.09-.146a1.481 1.481 0 0 1-.791.188zm.882-.214a1.777 1.777 0 0 0 .515-.458l-.14-.1a1.613 1.613 0 0 1-.466.412zm.513-.456a1.251 1.251 0 0 1 .081-.1.28.28 0 0 1 .026-.025l.008-.006-.077-.153a.326.326 0 0 0-.083.068 1.55 1.55 0 0 0-.092.113zm.12-.134a.328.328 0 0 1 .146-.021v-.171a.468.468 0 0 0-.234.046zm.146-.021h.547v-.171h-.547zm.547 0a.166.166 0 0 1 .112.036l.11-.132a.337.337 0 0 0-.222-.076zm.112.036a.107.107 0 0 1 .036.09h.171a.277.277 0 0 0-.1-.222zm.036.09a.9.9 0 0 1-.291.534l.128.115a1.055 1.055 0 0 0 .334-.649zm-.291.535a2.42 2.42 0 0 1-.83.581l.072.156a2.6 2.6 0 0 0 .888-.624zm-.829.58a2.964 2.964 0 0 1-1.224.238v.171a3.133 3.133 0 0 0 1.295-.253zm.389-3.111v-.033h-.171v.033zm0-.033a1.9 1.9 0 0 0-.445-1.306l-.129.114a1.731 1.731 0 0 1 .4 1.192zm-.444-1.3a1.466 1.466 0 0 0-1.181-.521v.172a1.3 1.3 0 0 1 1.049.46zm-1.181-.521a1.466 1.466 0 0 0-1.18.521l.131.11a1.3 1.3 0 0 1 1.049-.46zm-1.181.521a1.965 1.965 0 0 0-.422 1.3h.172a1.794 1.794 0 0 1 .382-1.194zm-.422 1.3v.033h.172v-.033zm.086.119h3.055v-.171h-3.055z" fill="#51504f" data-name="Path 10" transform="translate(-1460.636 -807.945)"></path>
<path id="Path_11" d="M1519.066 884.011a.581.581 0 0 1-.567-.567 1.151 1.151 0 0 1 .028-.312l7.026-18.328a.881.881 0 0 1 .906-.623h1.926a.882.882 0 0 1 .907.623l7 18.328.057.312a.583.583 0 0 1-.567.567h-1.445a.735.735 0 0 1-.482-.142.9.9 0 0 1-.226-.34l-1.558-4.023h-9.292l-1.558 4.023a.8.8 0 0 1-.255.34.688.688 0 0 1-.453.142zm12.181-6.94l-3.824-10.056-3.823 10.055zm8.184-10.538a.592.592 0 0 1-.652-.651v-1.53a.714.714 0 0 1 .17-.482.656.656 0 0 1 .482-.2h1.785a.677.677 0 0 1 .68.68v1.53a.655.655 0 0 1-.2.481.713.713 0 0 1-.481.17zm.227 17.479a.593.593 0 0 1-.652-.652v-13.428a.611.611 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.359a.679.679 0 0 1 .652.651v13.427a.655.655 0 0 1-.2.482.613.613 0 0 1-.453.17zm6.861 0a.592.592 0 0 1-.651-.652v-13.4a.715.715 0 0 1 .17-.481.656.656 0 0 1 .482-.2h1.3a.677.677 0 0 1 .68.68v1.246a4.255 4.255 0 0 1 3.966-1.926h1.1a.679.679 0 0 1 .651.651v1.161a.566.566 0 0 1-.2.453.612.612 0 0 1-.453.17h-1.7a3.2 3.2 0 0 0-2.408.907 3.253 3.253 0 0 0-.879 2.408v8.328a.656.656 0 0 1-.2.482.716.716 0 0 1-.482.17zm12.234 0a.593.593 0 0 1-.651-.652v-11.814h-2.408a.592.592 0 0 1-.651-.651v-.963a.611.611 0 0 1 .17-.453.654.654 0 0 1 .481-.2h2.408v-1.417q0-4.816 4.872-4.815h1.586a.679.679 0 0 1 .652.651v.963a.656.656 0 0 1-.2.481.613.613 0 0 1-.453.17h-1.529a2.1 2.1 0 0 0-1.785.68 3.248 3.248 0 0 0-.51 2.011v1.275h6.062V863.7a.613.613 0 0 1 .17-.453.656.656 0 0 1 .482-.2h1.3a.679.679 0 0 1 .652.651v19.659a.655.655 0 0 1-.2.482.613.613 0 0 1-.454.17h-1.3a.592.592 0 0 1-.652-.652v-11.811h-6.062v11.813a.657.657 0 0 1-.2.482.614.614 0 0 1-.454.17zm20.9.283a6.487 6.487 0 0 1-4.844-1.757 6.837 6.837 0 0 1-1.813-4.674l-.029-1.218.029-1.218a6.732 6.732 0 0 1 1.841-4.646 7.389 7.389 0 0 1 9.631 0 6.736 6.736 0 0 1 1.841 4.646q.028.311.028 1.218t-.028 1.218a6.772 6.772 0 0 1-1.841 4.674 6.391 6.391 0 0 1-4.82 1.756zm0-2.181a3.582 3.582 0 0 0 2.8-1.133 4.931 4.931 0 0 0 1.133-3.258q.028-.283.028-1.076t-.028-1.076a4.931 4.931 0 0 0-1.133-3.258 3.582 3.582 0 0 0-2.8-1.133 3.671 3.671 0 0 0-2.833 1.133 4.83 4.83 0 0 0-1.1 3.258l-.028 1.076.028 1.076a4.83 4.83 0 0 0 1.1 3.258 3.671 3.671 0 0 0 2.828 1.132zm13.755 1.9a.846.846 0 0 1-.566-.17 1.321 1.321 0 0 1-.34-.538l-4.023-13.144-.056-.283a.575.575 0 0 1 .17-.425.641.641 0 0 1 .425-.17h1.246a.612.612 0 0 1 .453.17.646.646 0 0 1 .255.312l3.145 10.679 3.371-10.566a.761.761 0 0 1 .255-.4.726.726 0 0 1 .538-.2h.963a.728.728 0 0 1 .539.2.76.76 0 0 1 .255.4l3.371 10.566 3.144-10.679a.655.655 0 0 1 .2-.312.714.714 0 0 1 .482-.17h1.275a.542.542 0 0 1 .4.17.576.576 0 0 1 .17.425l-.057.283-3.994 13.144a1.323 1.323 0 0 1-.34.538.9.9 0 0 1-.6.17h-1.1a.86.86 0 0 1-.935-.708l-3.286-10.141-3.286 10.141a.928.928 0 0 1-.963.708z" fill="#51504f" data-name="Path 11" transform="translate(-1454.66 -838.62)"></path>
</g>
</g>
</g>
</svg>
</a>
</div>
<div id="content-close-button">
<svg xmlns="http://www.w3.org/2000/svg" width="19.799" height="19.799" viewBox="0 0 19.799 19.799">
<g id="Group_1574" data-name="Group 1574" transform="translate(-41.892 290.899)">
<g id="Group_1291" data-name="Group 1291" transform="rotate(-45 -308.114 -187.077)">
<rect id="Rectangle_461" width="26" height="2" fill="#51504f" data-name="Rectangle 461" rx="1" transform="translate(-.209)"></rect>
</g>
<g id="Group_1292" data-name="Group 1292" transform="rotate(45 372.48 -93.011)">
<rect id="Rectangle_462" width="26" height="2" fill="#51504f" data-name="Rectangle 462" rx="1" transform="translate(-.209 -.178)"></rect>
</g>
</g>
</svg>
</div>
</nav>
<div class="content-drawer-container" id="content-drawer">
<div class="content-drawer">
<div class="td-sidebar">
<div id="docs-version-selector" class="docs-version-selector sidebar__version-selector">
<a class="dropdown-toggle" href="#" id="versionDropdown" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<span class="bodytext__medium--greyish-brown">Version: </span><span class="version">2.3.2</span>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
</div>
<script type="application/x-template" id="version-item-template">
<a class="dropdown-item"></a>
</script>
</div>
<div class="searchb-box">
<form class="search-form" action="../search.html" method="get">
<input class="search-form__input" type="text" name="q" placeholder="Search docs" size="16">
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<button class="search-form__button" type="submit">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<g id="Group_1579" data-name="Group 1579" transform="translate(-41.001 -41)">
<path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728 7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169" transform="translate(-14.277 -14.276)"></path>
<path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06 1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512 49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f" data-name="Path 170"></path>
</g>
</svg>
</button>
</form>
</div>
<style>
.searchb-box {
margin-bottom: 26px;
}
.searchb-box .search-form {
width: 100%;
margin-top: 20px;
}
</style>
<div class="toctree" role="navigation" aria-label="main navigation">
<p class="caption" role="heading"><span class="caption-text">Content</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../project.html">Project</a></li>
<li class="toctree-l1"><a class="reference internal" href="../license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="../start/index.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../upgrading-from-1-10/index.html">Upgrading from 1.10 to 2</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tutorial.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tutorial_taskflow_api.html">Tutorial on the TaskFlow API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../howto/index.html">How-to Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../ui.html">UI / Screenshots</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Concepts</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="overview.html">Architecture Overview</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">DAGs</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#declaring-a-dag">Declaring a DAG</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#task-dependencies">Task Dependencies</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#loading-dags">Loading DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#running-dags">Running DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-assignment">DAG Assignment</a></li>
<li class="toctree-l3"><a class="reference internal" href="#default-arguments">Default Arguments</a></li>
<li class="toctree-l3"><a class="reference internal" href="#the-dag-decorator">The DAG decorator</a></li>
<li class="toctree-l3"><a class="reference internal" href="#control-flow">Control Flow</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#branching">Branching</a></li>
<li class="toctree-l4"><a class="reference internal" href="#latest-only">Latest Only</a></li>
<li class="toctree-l4"><a class="reference internal" href="#depends-on-past">Depends On Past</a></li>
<li class="toctree-l4"><a class="reference internal" href="#trigger-rules">Trigger Rules</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#dynamic-dags">Dynamic DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-visualization">DAG Visualization</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#taskgroups">TaskGroups</a></li>
<li class="toctree-l4"><a class="reference internal" href="#edge-labels">Edge Labels</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#dag-task-documentation">DAG &amp; Task Documentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="#subdags">SubDAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#taskgroups-vs-subdags">TaskGroups vs SubDAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#packaging-dags">Packaging DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#airflowignore"><code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-dependencies">DAG Dependencies</a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-pausing-deactivation-and-deletion">DAG pausing, deactivation and deletion</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="tasks.html">Tasks</a></li>
<li class="toctree-l2"><a class="reference internal" href="operators.html">Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="dynamic-task-mapping.html">Dynamic Task Mapping</a></li>
<li class="toctree-l2"><a class="reference internal" href="sensors.html">Sensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="deferring.html">Deferrable Operators &amp; Triggers</a></li>
<li class="toctree-l2"><a class="reference internal" href="smart-sensors.html">Smart Sensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="taskflow.html">TaskFlow</a></li>
<li class="toctree-l2"><a class="reference internal" href="../executor/index.html">Executor</a></li>
<li class="toctree-l2"><a class="reference internal" href="scheduler.html">Scheduler</a></li>
<li class="toctree-l2"><a class="reference internal" href="dagfile-processing.html">DAG File Processing</a></li>
<li class="toctree-l2"><a class="reference internal" href="pools.html">Pools</a></li>
<li class="toctree-l2"><a class="reference internal" href="timetable.html">Timetables</a></li>
<li class="toctree-l2"><a class="reference internal" href="priority-weight.html">Priority Weights</a></li>
<li class="toctree-l2"><a class="reference internal" href="cluster-policies.html">Cluster Policies</a></li>
<li class="toctree-l2"><a class="reference internal" href="xcoms.html">XComs</a></li>
<li class="toctree-l2"><a class="reference internal" href="variables.html">Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="connections.html">Connections &amp; Hooks</a></li>
<li class="toctree-l2"><a class="reference internal" href="params.html">Params</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../executor/index.html">Executor</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dag-run.html">DAG Runs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../plugins.html">Plugins</a></li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../logging-monitoring/index.html">Logging &amp; Monitoring</a></li>
<li class="toctree-l1"><a class="reference internal" href="../timezone.html">Time Zones</a></li>
<li class="toctree-l1"><a class="reference internal" href="../usage-cli.html">Using the CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../integration.html">Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kubernetes.html">Kubernetes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../lineage.html">Lineage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../listeners.html">Listeners</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dag-serialization.html">DAG Serialization</a></li>
<li class="toctree-l1"><a class="reference internal" href="../modules_management.html">Modules Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release-process.html">Release Policies</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release_notes.html">Release Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../best-practices.html">Best Practices</a></li>
<li class="toctree-l1"><a class="reference internal" href="../production-deployment.html">Production Deployment</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../privacy_notice.html">Privacy Notice</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">References</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../operators-and-hooks-ref.html">Operators and hooks</a></li>
<li class="toctree-l1"><a class="reference internal" href="../cli-and-env-variables-ref.html">CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../templates-ref.html">Templates</a></li>
<li class="toctree-l1"><a class="reference internal" href="../python-api-ref.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../stable-rest-api-ref.html">Stable REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../deprecated-rest-api-ref.html">Deprecated REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../configurations-ref.html">Configurations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../extra-packages-ref.html">Extra packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="../migrations-ref.html">Database Migrations</a></li>
</ul>
</div>
<style type="text/css">
.toctree {
}
.toctree li {
list-style: none;
}
.toctree .caption {
font-family: Roboto;
font-size: 18px;
font-weight: bold;
font-stretch: normal;
font-style: normal;
line-height: 1.33;
letter-spacing: normal;
color: #51504f;
padding-bottom: 13px;
text-transform: uppercase;
margin-bottom: 0;
}
.toctree .current > a:not([href="#"]) {
color: #017cee;
}
.toctree > ul {
padding-left: 0;
}
.toctree ul {
padding-left: 15px;
display: none;
}
.toctree > ul,
.toctree li.current > ul {
display: block;
}
.toctree a .toctree-expand {
display: inline-block;
position: relative;
height: 1em;
}
.toctree a .toctree-expand:before {
position: absolute;
top: 6px;
left: -12px;
content: '►';
font-size: 7px;
}
.toctree .current > a > .toctree-expand:before {
content: '▼';
}
.toctree .current {
color: #017cee;
}
.toctree li {
font-family: Roboto;
font-size: 16px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 1.63;
letter-spacing: normal;
color: #707070;
}
</style>
</div>
</div>
</div>
</div>
<div class="d-flex">
<div class="td-sidebar desktop-only d-print-none">
<div id="docs-version-selector" class="docs-version-selector sidebar__version-selector">
<a class="dropdown-toggle" href="#" id="versionDropdown" role="button" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
<span class="bodytext__medium--greyish-brown">Version: </span><span class="version">2.3.2</span>
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
</div>
<script type="application/x-template" id="version-item-template">
<a class="dropdown-item"></a>
</script>
</div>
<div class="searchb-box">
<form class="search-form" action="../search.html" method="get">
<input class="search-form__input" type="text" name="q" placeholder="Search docs" size="16">
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<button class="search-form__button" type="submit">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<g id="Group_1579" data-name="Group 1579" transform="translate(-41.001 -41)">
<path id="Path_169" d="M71.415 64.687a7.215 7.215 0 1 0-6.729 6.728 7.222 7.222 0 0 0 6.729-6.728z" fill="none" data-name="Path 169" transform="translate(-14.277 -14.276)"></path>
<path id="Path_170" d="M60.863 59.8l-6.093-6.09a7.78 7.78 0 1 0-1.06 1.06l6.09 6.093a.468.468 0 0 0 .662 0l.4-.4a.468.468 0 0 0 .001-.663zM42.512 49.183a6.274 6.274 0 1 1 5.851 5.85 6.28 6.28 0 0 1-5.851-5.85z" fill="#51504f" data-name="Path 170"></path>
</g>
</svg>
</button>
</form>
</div>
<style>
.searchb-box {
margin-bottom: 26px;
}
.searchb-box .search-form {
width: 100%;
margin-top: 20px;
}
</style>
<div class="toctree" role="navigation" aria-label="main navigation">
<p class="caption" role="heading"><span class="caption-text">Content</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../project.html">Project</a></li>
<li class="toctree-l1"><a class="reference internal" href="../license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="../start/index.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="../installation/index.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../upgrading-from-1-10/index.html">Upgrading from 1.10 to 2</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tutorial.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="../tutorial_taskflow_api.html">Tutorial on the TaskFlow API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../howto/index.html">How-to Guides</a></li>
<li class="toctree-l1"><a class="reference internal" href="../ui.html">UI / Screenshots</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Concepts</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="overview.html">Architecture Overview</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">DAGs</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#declaring-a-dag">Declaring a DAG</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#task-dependencies">Task Dependencies</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#loading-dags">Loading DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#running-dags">Running DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-assignment">DAG Assignment</a></li>
<li class="toctree-l3"><a class="reference internal" href="#default-arguments">Default Arguments</a></li>
<li class="toctree-l3"><a class="reference internal" href="#the-dag-decorator">The DAG decorator</a></li>
<li class="toctree-l3"><a class="reference internal" href="#control-flow">Control Flow</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#branching">Branching</a></li>
<li class="toctree-l4"><a class="reference internal" href="#latest-only">Latest Only</a></li>
<li class="toctree-l4"><a class="reference internal" href="#depends-on-past">Depends On Past</a></li>
<li class="toctree-l4"><a class="reference internal" href="#trigger-rules">Trigger Rules</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#dynamic-dags">Dynamic DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-visualization">DAG Visualization</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#taskgroups">TaskGroups</a></li>
<li class="toctree-l4"><a class="reference internal" href="#edge-labels">Edge Labels</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#dag-task-documentation">DAG &amp; Task Documentation</a></li>
<li class="toctree-l3"><a class="reference internal" href="#subdags">SubDAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#taskgroups-vs-subdags">TaskGroups vs SubDAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#packaging-dags">Packaging DAGs</a></li>
<li class="toctree-l3"><a class="reference internal" href="#airflowignore"><code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code></a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-dependencies">DAG Dependencies</a></li>
<li class="toctree-l3"><a class="reference internal" href="#dag-pausing-deactivation-and-deletion">DAG pausing, deactivation and deletion</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="tasks.html">Tasks</a></li>
<li class="toctree-l2"><a class="reference internal" href="operators.html">Operators</a></li>
<li class="toctree-l2"><a class="reference internal" href="dynamic-task-mapping.html">Dynamic Task Mapping</a></li>
<li class="toctree-l2"><a class="reference internal" href="sensors.html">Sensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="deferring.html">Deferrable Operators &amp; Triggers</a></li>
<li class="toctree-l2"><a class="reference internal" href="smart-sensors.html">Smart Sensors</a></li>
<li class="toctree-l2"><a class="reference internal" href="taskflow.html">TaskFlow</a></li>
<li class="toctree-l2"><a class="reference internal" href="../executor/index.html">Executor</a></li>
<li class="toctree-l2"><a class="reference internal" href="scheduler.html">Scheduler</a></li>
<li class="toctree-l2"><a class="reference internal" href="dagfile-processing.html">DAG File Processing</a></li>
<li class="toctree-l2"><a class="reference internal" href="pools.html">Pools</a></li>
<li class="toctree-l2"><a class="reference internal" href="timetable.html">Timetables</a></li>
<li class="toctree-l2"><a class="reference internal" href="priority-weight.html">Priority Weights</a></li>
<li class="toctree-l2"><a class="reference internal" href="cluster-policies.html">Cluster Policies</a></li>
<li class="toctree-l2"><a class="reference internal" href="xcoms.html">XComs</a></li>
<li class="toctree-l2"><a class="reference internal" href="variables.html">Variables</a></li>
<li class="toctree-l2"><a class="reference internal" href="connections.html">Connections &amp; Hooks</a></li>
<li class="toctree-l2"><a class="reference internal" href="params.html">Params</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../executor/index.html">Executor</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dag-run.html">DAG Runs</a></li>
<li class="toctree-l1"><a class="reference internal" href="../plugins.html">Plugins</a></li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../logging-monitoring/index.html">Logging &amp; Monitoring</a></li>
<li class="toctree-l1"><a class="reference internal" href="../timezone.html">Time Zones</a></li>
<li class="toctree-l1"><a class="reference internal" href="../usage-cli.html">Using the CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../integration.html">Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../kubernetes.html">Kubernetes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../lineage.html">Lineage</a></li>
<li class="toctree-l1"><a class="reference internal" href="../listeners.html">Listeners</a></li>
<li class="toctree-l1"><a class="reference internal" href="../dag-serialization.html">DAG Serialization</a></li>
<li class="toctree-l1"><a class="reference internal" href="../modules_management.html">Modules Management</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release-process.html">Release Policies</a></li>
<li class="toctree-l1"><a class="reference internal" href="../release_notes.html">Release Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="../best-practices.html">Best Practices</a></li>
<li class="toctree-l1"><a class="reference internal" href="../production-deployment.html">Production Deployment</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../privacy_notice.html">Privacy Notice</a></li>
</ul>
<p class="caption" role="heading"><span class="caption-text">References</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../operators-and-hooks-ref.html">Operators and hooks</a></li>
<li class="toctree-l1"><a class="reference internal" href="../cli-and-env-variables-ref.html">CLI</a></li>
<li class="toctree-l1"><a class="reference internal" href="../templates-ref.html">Templates</a></li>
<li class="toctree-l1"><a class="reference internal" href="../python-api-ref.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../stable-rest-api-ref.html">Stable REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../deprecated-rest-api-ref.html">Deprecated REST API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../configurations-ref.html">Configurations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../extra-packages-ref.html">Extra packages</a></li>
<li class="toctree-l1"><a class="reference internal" href="../migrations-ref.html">Database Migrations</a></li>
</ul>
</div>
<style type="text/css">
.toctree {
}
.toctree li {
list-style: none;
}
.toctree .caption {
font-family: Roboto;
font-size: 18px;
font-weight: bold;
font-stretch: normal;
font-style: normal;
line-height: 1.33;
letter-spacing: normal;
color: #51504f;
padding-bottom: 13px;
text-transform: uppercase;
margin-bottom: 0;
}
.toctree .current > a:not([href="#"]) {
color: #017cee;
}
.toctree > ul {
padding-left: 0;
}
.toctree ul {
padding-left: 15px;
display: none;
}
.toctree > ul,
.toctree li.current > ul {
display: block;
}
.toctree a .toctree-expand {
display: inline-block;
position: relative;
height: 1em;
}
.toctree a .toctree-expand:before {
position: absolute;
top: 6px;
left: -12px;
content: '►';
font-size: 7px;
}
.toctree .current > a > .toctree-expand:before {
content: '▼';
}
.toctree .current {
color: #017cee;
}
.toctree li {
font-family: Roboto;
font-size: 16px;
font-weight: normal;
font-stretch: normal;
font-style: normal;
line-height: 1.63;
letter-spacing: normal;
color: #707070;
}
</style>
</div>
<main class="col-12 col-md-9 col-xl-8" role="main">
<div role="navigation" aria-label="breadcrumbs navigation" class="d-none d-md-block d-print-none">
<ul class="breadcrumb">
<li class="breadcrumb-item"><a href="../index.html" class="icon icon-home"> Home</a></li>
<li class="breadcrumb-item"><a href="index.html">Concepts</a></li>
<li class="breadcrumb-item"><a href="dags.html"> DAGs</a></li>
</ul>
</div>
<div class="rst-content">
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<blockquote>
<div></div></blockquote>
<div class="section" id="dags">
<span id="concepts-dags"></span><h1>DAGs<a class="headerlink" href="#dags" title="Permalink to this headline"></a></h1>
<p>A <em>DAG</em> (Directed Acyclic Graph) is the core concept of Airflow, collecting <a class="reference internal" href="tasks.html"><span class="doc">Tasks</span></a> together, organized with dependencies and relationships to say how they should run.</p>
<p>Here’s a basic example DAG:</p>
<img alt="../_images/basic-dag.png" src="../_images/basic-dag.png" />
<p>It defines four Tasks - A, B, C, and D - and dictates the order in which they have to run, and which tasks depend on what others. It will also say how often to run the DAG - maybe “every 5 minutes starting tomorrow”, or “every day since January 1st, 2020”.</p>
<p>The DAG itself doesn’t care about <em>what</em> is happening inside the tasks; it is merely concerned with <em>how</em> to execute them - the order to run them in, how many times to retry them, if they have timeouts, and so on.</p>
<div class="section" id="declaring-a-dag">
<h2>Declaring a DAG<a class="headerlink" href="#declaring-a-dag" title="Permalink to this headline"></a></h2>
<p>There are three ways to declare a DAG - either you can use a context manager,
which will add the DAG to anything inside it implicitly:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
<span class="s2">&quot;my_dag_name&quot;</span><span class="p">,</span> <span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span> <span class="n">catchup</span><span class="o">=</span><span class="kc">False</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">op</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;task&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Or, you can use a standard constructor, passing the dag into any
operators you use:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">my_dag</span> <span class="o">=</span> <span class="n">DAG</span><span class="p">(</span><span class="s2">&quot;my_dag_name&quot;</span><span class="p">,</span> <span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span> <span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">op</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;task&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">my_dag</span><span class="p">)</span>
</pre></div>
</div>
<p>Or, you can use the <code class="docutils literal notranslate"><span class="pre">&#64;dag</span></code> decorator to <a class="reference internal" href="#concepts-dag-decorator"><span class="std std-ref">turn a function into a DAG generator</span></a>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="nd">@dag</span><span class="p">(</span><span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span> <span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">generate_dag</span><span class="p">():</span>
<span class="n">op</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;task&quot;</span><span class="p">)</span>
<span class="n">dag</span> <span class="o">=</span> <span class="n">generate_dag</span><span class="p">()</span>
</pre></div>
</div>
<p>DAGs are nothing without <a class="reference internal" href="tasks.html"><span class="doc">Tasks</span></a> to run, and those will usually either come in the form of either <a class="reference internal" href="operators.html"><span class="doc">Operators</span></a>, <a class="reference internal" href="sensors.html"><span class="doc">Sensors</span></a> or <a class="reference internal" href="taskflow.html"><span class="doc">TaskFlow</span></a>.</p>
<div class="section" id="task-dependencies">
<h3>Task Dependencies<a class="headerlink" href="#task-dependencies" title="Permalink to this headline"></a></h3>
<p>A Task/Operator does not usually live alone; it has dependencies on other tasks (those <em>upstream</em> of it), and other tasks depend on it (those <em>downstream</em> of it). Declaring these dependencies between tasks is what makes up the DAG structure (the <em>edges</em> of the <em>directed acyclic graph</em>).</p>
<p>There are two main ways to declare individual task dependencies. The recommended one is to use the <code class="docutils literal notranslate"><span class="pre">&gt;&gt;</span></code> and <code class="docutils literal notranslate"><span class="pre">&lt;&lt;</span></code> operators:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">first_task</span> <span class="o">&gt;&gt;</span> <span class="p">[</span><span class="n">second_task</span><span class="p">,</span> <span class="n">third_task</span><span class="p">]</span>
<span class="n">third_task</span> <span class="o">&lt;&lt;</span> <span class="n">fourth_task</span>
</pre></div>
</div>
<p>Or, you can also use the more explicit <code class="docutils literal notranslate"><span class="pre">set_upstream</span></code> and <code class="docutils literal notranslate"><span class="pre">set_downstream</span></code> methods:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">first_task</span><span class="o">.</span><span class="n">set_downstream</span><span class="p">(</span><span class="n">second_task</span><span class="p">,</span> <span class="n">third_task</span><span class="p">)</span>
<span class="n">third_task</span><span class="o">.</span><span class="n">set_upstream</span><span class="p">(</span><span class="n">fourth_task</span><span class="p">)</span>
</pre></div>
</div>
<p>There are also shortcuts to declaring more complex dependencies. If you want to make two lists of tasks depend on all parts of each other, you can’t use either of the approaches above, so you need to use <code class="docutils literal notranslate"><span class="pre">cross_downstream</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">airflow.models.baseoperator</span> <span class="kn">import</span> <span class="n">cross_downstream</span>
<span class="c1"># Replaces</span>
<span class="c1"># [op1, op2] &gt;&gt; op3</span>
<span class="c1"># [op1, op2] &gt;&gt; op4</span>
<span class="n">cross_downstream</span><span class="p">([</span><span class="n">op1</span><span class="p">,</span> <span class="n">op2</span><span class="p">],</span> <span class="p">[</span><span class="n">op3</span><span class="p">,</span> <span class="n">op4</span><span class="p">])</span>
</pre></div>
</div>
<p>And if you want to chain together dependencies, you can use <code class="docutils literal notranslate"><span class="pre">chain</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">airflow.models.baseoperator</span> <span class="kn">import</span> <span class="n">chain</span>
<span class="c1"># Replaces op1 &gt;&gt; op2 &gt;&gt; op3 &gt;&gt; op4</span>
<span class="n">chain</span><span class="p">(</span><span class="n">op1</span><span class="p">,</span> <span class="n">op2</span><span class="p">,</span> <span class="n">op3</span><span class="p">,</span> <span class="n">op4</span><span class="p">)</span>
<span class="c1"># You can also do it dynamically</span>
<span class="n">chain</span><span class="p">(</span><span class="o">*</span><span class="p">[</span><span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;op&#39;</span> <span class="o">+</span> <span class="n">i</span><span class="p">)</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">6</span><span class="p">)])</span>
</pre></div>
</div>
<p>Chain can also do <em>pairwise</em> dependencies for lists the same size (this is different to the <em>cross dependencies</em> done by <code class="docutils literal notranslate"><span class="pre">cross_downstream</span></code>!):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">airflow.models.baseoperator</span> <span class="kn">import</span> <span class="n">chain</span>
<span class="c1"># Replaces</span>
<span class="c1"># op1 &gt;&gt; op2 &gt;&gt; op4 &gt;&gt; op6</span>
<span class="c1"># op1 &gt;&gt; op3 &gt;&gt; op5 &gt;&gt; op6</span>
<span class="n">chain</span><span class="p">(</span><span class="n">op1</span><span class="p">,</span> <span class="p">[</span><span class="n">op2</span><span class="p">,</span> <span class="n">op3</span><span class="p">],</span> <span class="p">[</span><span class="n">op4</span><span class="p">,</span> <span class="n">op5</span><span class="p">],</span> <span class="n">op6</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="loading-dags">
<span id="concepts-dag-loading"></span><h2>Loading DAGs<a class="headerlink" href="#loading-dags" title="Permalink to this headline"></a></h2>
<p>Airflow loads DAGs from Python source files, which it looks for inside its configured <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code>. It will take each file, execute it, and then load any DAG objects from that file.</p>
<p>This means you can define multiple DAGs per Python file, or even spread one very complex DAG across multiple Python files using imports.</p>
<p>Note, though, that when Airflow comes to load DAGs from a Python file, it will only pull any objects at the <em>top level</em> that are a DAG instance. For example, take this DAG file:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">dag_1</span> <span class="o">=</span> <span class="n">DAG</span><span class="p">(</span><span class="s1">&#39;this_dag_will_be_discovered&#39;</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">my_function</span><span class="p">():</span>
<span class="n">dag_2</span> <span class="o">=</span> <span class="n">DAG</span><span class="p">(</span><span class="s1">&#39;but_this_dag_will_not&#39;</span><span class="p">)</span>
<span class="n">my_function</span><span class="p">()</span>
</pre></div>
</div>
<p>While both DAG constructors get called when the file is accessed, only <code class="docutils literal notranslate"><span class="pre">dag_1</span></code> is at the top level (in the <code class="docutils literal notranslate"><span class="pre">globals()</span></code>), and so only it is added to Airflow. <code class="docutils literal notranslate"><span class="pre">dag_2</span></code> is not loaded.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>When searching for DAGs inside the <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code>, Airflow only considers Python files that contain the strings <code class="docutils literal notranslate"><span class="pre">airflow</span></code> and <code class="docutils literal notranslate"><span class="pre">dag</span></code> (case-insensitively) as an optimization.</p>
<p>To consider all Python files instead, disable the <code class="docutils literal notranslate"><span class="pre">DAG_DISCOVERY_SAFE_MODE</span></code> configuration flag.</p>
</div>
<p>You can also provide an <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code> file inside your <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code>, or any of its subfolders, which describes patterns of files for the loader to ignore. It covers the directory it’s in plus all subfolders underneath it. See <a class="reference internal" href="#concepts-airflowignore"><span class="std std-ref">.airflowignore</span></a> below for details of the file syntax.</p>
</div>
<div class="section" id="running-dags">
<span id="concepts-dag-run"></span><h2>Running DAGs<a class="headerlink" href="#running-dags" title="Permalink to this headline"></a></h2>
<p>DAGs will run in one of two ways:</p>
<blockquote>
<div><ul class="simple">
<li><p>When they are <em>triggered</em> either manually or via the API</p></li>
<li><p>On a defined <em>schedule</em>, which is defined as part of the DAG</p></li>
</ul>
</div></blockquote>
<p>DAGs do not <em>require</em> a schedule, but it’s very common to define one. You define it via the <code class="docutils literal notranslate"><span class="pre">schedule_interval</span></code> argument, like this:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="s2">&quot;my_daily_dag&quot;</span><span class="p">,</span> <span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">):</span>
<span class="o">...</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">schedule_interval</span></code> argument takes any value that is a valid <a class="reference external" href="https://en.wikipedia.org/wiki/Cron">Crontab</a> schedule value, so you could also do:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="s2">&quot;my_daily_dag&quot;</span><span class="p">,</span> <span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;0 * * * *&quot;</span><span class="p">):</span>
<span class="o">...</span>
</pre></div>
</div>
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>For more information on <code class="docutils literal notranslate"><span class="pre">schedule_interval</span></code> values, see <a class="reference internal" href="../dag-run.html"><span class="doc">DAG Run</span></a>.</p>
<p>If <code class="docutils literal notranslate"><span class="pre">schedule_interval</span></code> is not enough to express the DAG’s schedule, see <a class="reference internal" href="../howto/timetable.html"><span class="doc">Timetables</span></a>.
For more information on <code class="docutils literal notranslate"><span class="pre">logical</span> <span class="pre">date</span></code>, see <a class="reference internal" href="../dag-run.html#data-interval"><span class="std std-ref">Data Interval</span></a> and
<a class="reference internal" href="../faq.html#faq-what-does-execution-date-mean"><span class="std std-ref">What does execution_date mean?</span></a>.</p>
</div>
<p>Every time you run a DAG, you are creating a new instance of that DAG which
Airflow calls a <a class="reference internal" href="../dag-run.html"><span class="doc">DAG Run</span></a>. DAG Runs can run in parallel for the
same DAG, and each has a defined data interval, which identifies the period of
data the tasks should operate on.</p>
<p>As an example of why this is useful, consider writing a DAG that processes a
daily set of experimental data. It’s been rewritten, and you want to run it on
the previous 3 months of data—no problem, since Airflow can <em>backfill</em> the DAG
and run copies of it for every day in those previous 3 months, all at once.</p>
<p>Those DAG Runs will all have been started on the same actual day, but each DAG
run will have one data interval covering a single day in that 3 month period,
and that data interval is all the tasks, operators and sensors inside the DAG
look at when they run.</p>
<p>In much the same way a DAG instantiates into a DAG Run every time it’s run,
Tasks specified inside a DAG are also instantiated into
<a class="reference internal" href="tasks.html#concepts-task-instances"><span class="std std-ref">Task Instances</span></a> along with it.</p>
<p>A DAG run will have a start date when it starts, and end date when it ends.
This period describes the time when the DAG actually ‘ran.’ Aside from the DAG
run’s start and end date, there is another date called <em>logical date</em>
(formally known as execution date), which describes the intended time a
DAG run is scheduled or triggered. The reason why this is called
<em>logical</em> is because of the abstract nature of it having multiple meanings,
depending on the context of the DAG run itself.</p>
<p>For example, if a DAG run is manually triggered by the user, its logical date would be the
date and time of which the DAG run was triggered, and the value should be equal
to DAG run’s start date. However, when the DAG is being automatically scheduled, with certain
schedule interval put in place, the logical date is going to indicate the time
at which it marks the start of the data interval, where the DAG run’s start
date would then be the logical date + scheduled interval.</p>
</div>
<div class="section" id="dag-assignment">
<h2>DAG Assignment<a class="headerlink" href="#dag-assignment" title="Permalink to this headline"></a></h2>
<p>Note that every single Operator/Task must be assigned to a DAG in order to run. Airflow has several ways of calculating the DAG without you passing it explicitly:</p>
<ul class="simple">
<li><p>If you declare your Operator inside a <code class="docutils literal notranslate"><span class="pre">with</span> <span class="pre">DAG</span></code> block</p></li>
<li><p>If you declare your Operator inside a <code class="docutils literal notranslate"><span class="pre">&#64;dag</span></code> decorator,</p></li>
<li><p>If you put your Operator upstream or downstream of a Operator that has a DAG</p></li>
</ul>
<p>Otherwise, you must pass it into each Operator with <code class="docutils literal notranslate"><span class="pre">dag=</span></code>.</p>
</div>
<div class="section" id="default-arguments">
<span id="concepts-default-arguments"></span><h2>Default Arguments<a class="headerlink" href="#default-arguments" title="Permalink to this headline"></a></h2>
<p>Often, many Operators inside a DAG need the same set of default arguments (such as their <code class="docutils literal notranslate"><span class="pre">retries</span></code>). Rather than having to specify this individually for every Operator, you can instead pass <code class="docutils literal notranslate"><span class="pre">default_args</span></code> to the DAG when you create it, and it will auto-apply them to any operator tied to it:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pendulum</span>
<span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="s1">&#39;my_dag&#39;</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s1">&#39;@daily&#39;</span><span class="p">,</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">default_args</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;retries&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">op</span> <span class="o">=</span> <span class="n">BashOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;dummy&#39;</span><span class="p">,</span> <span class="n">bash_command</span><span class="o">=</span><span class="s1">&#39;Hello World!&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">op</span><span class="o">.</span><span class="n">retries</span><span class="p">)</span> <span class="c1"># 2</span>
</pre></div>
</div>
</div>
<div class="section" id="the-dag-decorator">
<span id="concepts-dag-decorator"></span><h2>The DAG decorator<a class="headerlink" href="#the-dag-decorator" title="Permalink to this headline"></a></h2>
<div class="versionadded">
<p><span class="versionmodified added">New in version 2.0.</span></p>
</div>
<p>As well as the more traditional ways of declaring a single DAG using a context manager or the <code class="docutils literal notranslate"><span class="pre">DAG()</span></code> constructor, you can also decorate a function with <code class="docutils literal notranslate"><span class="pre">&#64;dag</span></code> to turn it into a DAG generator function:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/example_dags/example_dag_decorator.py</span><a class="example-header-button viewcode-button reference internal" href="https://github.com/apache/airflow/tree/2.3.2/airflow/example_dags/example_dag_decorator.py" target="_blank"><span class="viewcode-link">[source]</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="nd">@dag</span><span class="p">(</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;example&#39;</span><span class="p">],</span>
<span class="p">)</span>
<span class="k">def</span> <span class="nf">example_dag_decorator</span><span class="p">(</span><span class="n">email</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s1">&#39;example@example.com&#39;</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> DAG to send server IP to email.</span>
<span class="sd"> :param email: Email to send IP to. Defaults to example@example.com.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">get_ip</span> <span class="o">=</span> <span class="n">GetRequestOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;get_ip&#39;</span><span class="p">,</span> <span class="n">url</span><span class="o">=</span><span class="s2">&quot;http://httpbin.org/get&quot;</span><span class="p">)</span>
<span class="nd">@task</span><span class="p">(</span><span class="n">multiple_outputs</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">prepare_email</span><span class="p">(</span><span class="n">raw_json</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
<span class="n">external_ip</span> <span class="o">=</span> <span class="n">raw_json</span><span class="p">[</span><span class="s1">&#39;origin&#39;</span><span class="p">]</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s1">&#39;subject&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;Server connected from </span><span class="si">{</span><span class="n">external_ip</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="s1">&#39;body&#39;</span><span class="p">:</span> <span class="sa">f</span><span class="s1">&#39;Seems like today your server executing Airflow is connected from IP </span><span class="si">{</span><span class="n">external_ip</span><span class="si">}</span><span class="s1">&lt;br&gt;&#39;</span><span class="p">,</span>
<span class="p">}</span>
<span class="n">email_info</span> <span class="o">=</span> <span class="n">prepare_email</span><span class="p">(</span><span class="n">get_ip</span><span class="o">.</span><span class="n">output</span><span class="p">)</span>
<span class="n">EmailOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;send_email&#39;</span><span class="p">,</span> <span class="n">to</span><span class="o">=</span><span class="n">email</span><span class="p">,</span> <span class="n">subject</span><span class="o">=</span><span class="n">email_info</span><span class="p">[</span><span class="s1">&#39;subject&#39;</span><span class="p">],</span> <span class="n">html_content</span><span class="o">=</span><span class="n">email_info</span><span class="p">[</span><span class="s1">&#39;body&#39;</span><span class="p">]</span>
<span class="p">)</span>
<span class="n">dag</span> <span class="o">=</span> <span class="n">example_dag_decorator</span><span class="p">()</span>
</pre></div>
</div>
</div>
<p>As well as being a new way of making DAGs cleanly, the decorator also sets up any parameters you have in your function as DAG parameters, letting you <a class="reference internal" href="../dag-run.html#dagrun-parameters"><span class="std std-ref">set those parameters when triggering the DAG</span></a>. You can then access the parameters from Python code, or from <code class="docutils literal notranslate"><span class="pre">{{</span> <span class="pre">context.params</span> <span class="pre">}}</span></code> inside a <a class="reference internal" href="operators.html#concepts-jinja-templating"><span class="std std-ref">Jinja template</span></a>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Airflow will only load DAGs that <a class="reference internal" href="#concepts-dag-loading"><span class="std std-ref">appear in the top level</span></a> of a DAG file. This means you cannot just declare a function with <code class="docutils literal notranslate"><span class="pre">&#64;dag</span></code> - you must also call it at least once in your DAG file and assign it to a top-level object, as you can see in the example above.</p>
</div>
</div>
<div class="section" id="control-flow">
<span id="concepts-control-flow"></span><h2>Control Flow<a class="headerlink" href="#control-flow" title="Permalink to this headline"></a></h2>
<p>By default, a DAG will only run a Task when all the Tasks it depends on are successful. There are several ways of modifying this, however:</p>
<ul class="simple">
<li><p><a class="reference internal" href="#concepts-branching"><span class="std std-ref">Branching</span></a>, where you can select which Task to move onto based on a condition</p></li>
<li><p><a class="reference internal" href="#concepts-latest-only"><span class="std std-ref">Latest Only</span></a>, a special form of branching that only runs on DAGs running against the present</p></li>
<li><p><a class="reference internal" href="#concepts-depends-on-past"><span class="std std-ref">Depends On Past</span></a>, where tasks can depend on themselves <em>from a previous run</em></p></li>
<li><p><a class="reference internal" href="#concepts-trigger-rules"><span class="std std-ref">Trigger Rules</span></a>, which let you set the conditions under which a DAG will run a task.</p></li>
</ul>
<div class="section" id="branching">
<span id="concepts-branching"></span><h3>Branching<a class="headerlink" href="#branching" title="Permalink to this headline"></a></h3>
<p>You can make use of branching in order to tell the DAG <em>not</em> to run all dependent tasks, but instead to pick and choose one or more paths to go down. This is where the branching Operators come in.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">BranchPythonOperator</span></code> is much like the PythonOperator except that it expects a <code class="docutils literal notranslate"><span class="pre">python_callable</span></code> that returns a task_id (or list of task_ids). The task_id returned is followed, and all of the other paths are skipped. It can also return None to skip all downstream task.</p>
<p>The task_id returned by the Python function has to reference a task directly downstream from the BranchPythonOperator task.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>When a Task is downstream of both the branching operator <em>and</em> downstream of one or more of the selected tasks, it will not be skipped:</p>
<img alt="../_images/branch_note.png" src="../_images/branch_note.png" />
<p>The paths of the branching task are <code class="docutils literal notranslate"><span class="pre">branch_a</span></code>, <code class="docutils literal notranslate"><span class="pre">join</span></code> and <code class="docutils literal notranslate"><span class="pre">branch_b</span></code>. Since <code class="docutils literal notranslate"><span class="pre">join</span></code> is a downstream task of <code class="docutils literal notranslate"><span class="pre">branch_a</span></code>, it will still be run, even though it was not returned as part of the branch decision.</p>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">BranchPythonOperator</span></code> can also be used with XComs allowing branching context to dynamically decide what branch to follow based on upstream tasks. For example:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">branch_func</span><span class="p">(</span><span class="n">ti</span><span class="p">):</span>
<span class="n">xcom_value</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">ti</span><span class="o">.</span><span class="n">xcom_pull</span><span class="p">(</span><span class="n">task_ids</span><span class="o">=</span><span class="s2">&quot;start_task&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="n">xcom_value</span> <span class="o">&gt;=</span> <span class="mi">5</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;continue_task&quot;</span>
<span class="k">elif</span> <span class="n">xcom_value</span> <span class="o">&gt;=</span> <span class="mi">3</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;stop_task&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">start_op</span> <span class="o">=</span> <span class="n">BashOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;start_task&quot;</span><span class="p">,</span>
<span class="n">bash_command</span><span class="o">=</span><span class="s2">&quot;echo 5&quot;</span><span class="p">,</span>
<span class="n">xcom_push</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">branch_op</span> <span class="o">=</span> <span class="n">BranchPythonOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;branch_task&quot;</span><span class="p">,</span>
<span class="n">python_callable</span><span class="o">=</span><span class="n">branch_func</span><span class="p">,</span>
<span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">continue_op</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;continue_task&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">stop_op</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;stop_task&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">start_op</span> <span class="o">&gt;&gt;</span> <span class="n">branch_op</span> <span class="o">&gt;&gt;</span> <span class="p">[</span><span class="n">continue_op</span><span class="p">,</span> <span class="n">stop_op</span><span class="p">]</span>
</pre></div>
</div>
<p>If you wish to implement your own operators with branching functionality, you can inherit from <a class="reference internal" href="../_api/airflow/operators/branch/index.html#airflow.operators.branch.BaseBranchOperator" title="airflow.operators.branch.BaseBranchOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">BaseBranchOperator</span></code></a>, which behaves similarly to <code class="docutils literal notranslate"><span class="pre">BranchPythonOperator</span></code> but expects you to provide an implementation of the method <code class="docutils literal notranslate"><span class="pre">choose_branch</span></code>.</p>
<p>As with the callable for <code class="docutils literal notranslate"><span class="pre">BranchPythonOperator</span></code>, this method can return the ID of a downstream task, or a list of task IDs, which will be run, and all others will be skipped. It can also return None to skip all downstream task:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">MyBranchOperator</span><span class="p">(</span><span class="n">BaseBranchOperator</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">choose_branch</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Run an extra branch on the first day of the month</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">context</span><span class="p">[</span><span class="s1">&#39;data_interval_start&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[</span><span class="s1">&#39;daily_task_id&#39;</span><span class="p">,</span> <span class="s1">&#39;monthly_task_id&#39;</span><span class="p">]</span>
<span class="k">elif</span> <span class="n">context</span><span class="p">[</span><span class="s1">&#39;data_interval_start&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">day</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;daily_task_id&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
</pre></div>
</div>
</div>
<div class="section" id="latest-only">
<span id="concepts-latest-only"></span><h3>Latest Only<a class="headerlink" href="#latest-only" title="Permalink to this headline"></a></h3>
<p>Airflow’s DAG Runs are often run for a date that is not the same as the current date - for example, running one copy of a DAG for every day in the last month to backfill some data.</p>
<p>There are situations, though, where you <em>don’t</em> want to let some (or all) parts of a DAG run for a previous date; in this case, you can use the <code class="docutils literal notranslate"><span class="pre">LatestOnlyOperator</span></code>.</p>
<p>This special Operator skips all tasks downstream of itself if you are not on the “latest” DAG run (if the wall-clock time right now is between its execution_time and the next scheduled execution_time, and it was not an externally-triggered run).</p>
<p>Here’s an example:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/example_dags/example_latest_only_with_trigger.py</span><a class="example-header-button viewcode-button reference internal" href="https://github.com/apache/airflow/tree/2.3.2/airflow/example_dags/example_latest_only_with_trigger.py" target="_blank"><span class="viewcode-link">[source]</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">import</span> <span class="nn">pendulum</span>
<span class="kn">from</span> <span class="nn">airflow</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="kn">from</span> <span class="nn">airflow.operators.empty</span> <span class="kn">import</span> <span class="n">EmptyOperator</span>
<span class="kn">from</span> <span class="nn">airflow.operators.latest_only</span> <span class="kn">import</span> <span class="n">LatestOnlyOperator</span>
<span class="kn">from</span> <span class="nn">airflow.utils.trigger_rule</span> <span class="kn">import</span> <span class="n">TriggerRule</span>
<span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="s1">&#39;latest_only_with_trigger&#39;</span><span class="p">,</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">hours</span><span class="o">=</span><span class="mi">4</span><span class="p">),</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;example3&#39;</span><span class="p">],</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">latest_only</span> <span class="o">=</span> <span class="n">LatestOnlyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;latest_only&#39;</span><span class="p">)</span>
<span class="n">task1</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;task1&#39;</span><span class="p">)</span>
<span class="n">task2</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;task2&#39;</span><span class="p">)</span>
<span class="n">task3</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;task3&#39;</span><span class="p">)</span>
<span class="n">task4</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;task4&#39;</span><span class="p">,</span> <span class="n">trigger_rule</span><span class="o">=</span><span class="n">TriggerRule</span><span class="o">.</span><span class="n">ALL_DONE</span><span class="p">)</span>
<span class="n">latest_only</span> <span class="o">&gt;&gt;</span> <span class="n">task1</span> <span class="o">&gt;&gt;</span> <span class="p">[</span><span class="n">task3</span><span class="p">,</span> <span class="n">task4</span><span class="p">]</span>
<span class="n">task2</span> <span class="o">&gt;&gt;</span> <span class="p">[</span><span class="n">task3</span><span class="p">,</span> <span class="n">task4</span><span class="p">]</span>
</pre></div>
</div>
</div>
<p>In the case of this DAG:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">task1</span></code> is directly downstream of <code class="docutils literal notranslate"><span class="pre">latest_only</span></code> and will be skipped for all runs except the latest.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">task2</span></code> is entirely independent of <code class="docutils literal notranslate"><span class="pre">latest_only</span></code> and will run in all scheduled periods</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">task3</span></code> is downstream of <code class="docutils literal notranslate"><span class="pre">task1</span></code> and <code class="docutils literal notranslate"><span class="pre">task2</span></code> and because of the default <a class="reference internal" href="#concepts-trigger-rules"><span class="std std-ref">trigger rule</span></a> being <code class="docutils literal notranslate"><span class="pre">all_success</span></code> will receive a cascaded skip from <code class="docutils literal notranslate"><span class="pre">task1</span></code>.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">task4</span></code> is downstream of <code class="docutils literal notranslate"><span class="pre">task1</span></code> and <code class="docutils literal notranslate"><span class="pre">task2</span></code>, but it will not be skipped, since its <code class="docutils literal notranslate"><span class="pre">trigger_rule</span></code> is set to <code class="docutils literal notranslate"><span class="pre">all_done</span></code>.</p></li>
</ul>
<img alt="../_images/latest_only_with_trigger.png" src="../_images/latest_only_with_trigger.png" />
</div>
<div class="section" id="depends-on-past">
<span id="concepts-depends-on-past"></span><h3>Depends On Past<a class="headerlink" href="#depends-on-past" title="Permalink to this headline"></a></h3>
<p>You can also say a task can only run if the <em>previous</em> run of the task in the previous DAG Run succeeded. To use this, you just need to set the <code class="docutils literal notranslate"><span class="pre">depends_on_past</span></code> argument on your Task to <code class="docutils literal notranslate"><span class="pre">True</span></code>.</p>
<p>Note that if you are running the DAG at the very start of its life—specifically, its first ever <em>automated</em> run—then the Task will still run, as there is no previous run to depend on.</p>
</div>
<div class="section" id="trigger-rules">
<span id="concepts-trigger-rules"></span><h3>Trigger Rules<a class="headerlink" href="#trigger-rules" title="Permalink to this headline"></a></h3>
<p>By default, Airflow will wait for all upstream (direct parents) tasks for a task to be <a class="reference internal" href="tasks.html#concepts-task-states"><span class="std std-ref">successful</span></a> before it runs that task.</p>
<p>However, this is just the default behaviour, and you can control it using the <code class="docutils literal notranslate"><span class="pre">trigger_rule</span></code> argument to a Task. The options for <code class="docutils literal notranslate"><span class="pre">trigger_rule</span></code> are:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">all_success</span></code> (default): All upstream tasks have succeeded</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">all_failed</span></code>: All upstream tasks are in a <code class="docutils literal notranslate"><span class="pre">failed</span></code> or <code class="docutils literal notranslate"><span class="pre">upstream_failed</span></code> state</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">all_done</span></code>: All upstream tasks are done with their execution</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">all_skipped</span></code>: All upstream tasks are in a <code class="docutils literal notranslate"><span class="pre">skipped</span></code> state</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">one_failed</span></code>: At least one upstream task has failed (does not wait for all upstream tasks to be done)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">one_success</span></code>: At least one upstream task has succeeded (does not wait for all upstream tasks to be done)</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">none_failed</span></code>: All upstream tasks have not <code class="docutils literal notranslate"><span class="pre">failed</span></code> or <code class="docutils literal notranslate"><span class="pre">upstream_failed</span></code> - that is, all upstream tasks have succeeded or been skipped</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">none_failed_min_one_success</span></code>: All upstream tasks have not <code class="docutils literal notranslate"><span class="pre">failed</span></code> or <code class="docutils literal notranslate"><span class="pre">upstream_failed</span></code>, and at least one upstream task has succeeded.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">none_skipped</span></code>: No upstream task is in a <code class="docutils literal notranslate"><span class="pre">skipped</span></code> state - that is, all upstream tasks are in a <code class="docutils literal notranslate"><span class="pre">success</span></code>, <code class="docutils literal notranslate"><span class="pre">failed</span></code>, or <code class="docutils literal notranslate"><span class="pre">upstream_failed</span></code> state</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">always</span></code>: No dependencies at all, run this task at any time</p></li>
</ul>
<p>You can also combine this with the <a class="reference internal" href="#concepts-depends-on-past"><span class="std std-ref">Depends On Past</span></a> functionality if you wish.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>It’s important to be aware of the interaction between trigger rules and skipped tasks, especially tasks that are skipped as part of a branching operation. <em>You almost never want to use all_success or all_failed downstream of a branching operation</em>.</p>
<p>Skipped tasks will cascade through trigger rules <code class="docutils literal notranslate"><span class="pre">all_success</span></code> and <code class="docutils literal notranslate"><span class="pre">all_failed</span></code>, and cause them to skip as well. Consider the following DAG:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># dags/branch_without_trigger.py</span>
<span class="kn">import</span> <span class="nn">pendulum</span>
<span class="kn">from</span> <span class="nn">airflow.models</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="kn">from</span> <span class="nn">airflow.operators.empty</span> <span class="kn">import</span> <span class="n">EmptyOperator</span>
<span class="kn">from</span> <span class="nn">airflow.operators.python</span> <span class="kn">import</span> <span class="n">BranchPythonOperator</span>
<span class="n">dag</span> <span class="o">=</span> <span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="s2">&quot;branch_without_trigger&quot;</span><span class="p">,</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@once&quot;</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2019</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">run_this_first</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;run_this_first&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">branching</span> <span class="o">=</span> <span class="n">BranchPythonOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;branching&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">,</span> <span class="n">python_callable</span><span class="o">=</span><span class="k">lambda</span><span class="p">:</span> <span class="s2">&quot;branch_a&quot;</span>
<span class="p">)</span>
<span class="n">branch_a</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;branch_a&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">follow_branch_a</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;follow_branch_a&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">branch_false</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;branch_false&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">join</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;join&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">run_this_first</span> <span class="o">&gt;&gt;</span> <span class="n">branching</span>
<span class="n">branching</span> <span class="o">&gt;&gt;</span> <span class="n">branch_a</span> <span class="o">&gt;&gt;</span> <span class="n">follow_branch_a</span> <span class="o">&gt;&gt;</span> <span class="n">join</span>
<span class="n">branching</span> <span class="o">&gt;&gt;</span> <span class="n">branch_false</span> <span class="o">&gt;&gt;</span> <span class="n">join</span>
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">join</span></code> is downstream of <code class="docutils literal notranslate"><span class="pre">follow_branch_a</span></code> and <code class="docutils literal notranslate"><span class="pre">branch_false</span></code>. The <code class="docutils literal notranslate"><span class="pre">join</span></code> task will show up as skipped because its <code class="docutils literal notranslate"><span class="pre">trigger_rule</span></code> is set to <code class="docutils literal notranslate"><span class="pre">all_success</span></code> by default, and the skip caused by the branching operation cascades down to skip a task marked as <code class="docutils literal notranslate"><span class="pre">all_success</span></code>.</p>
<img alt="../_images/branch_without_trigger.png" src="../_images/branch_without_trigger.png" />
<p>By setting <code class="docutils literal notranslate"><span class="pre">trigger_rule</span></code> to <code class="docutils literal notranslate"><span class="pre">none_failed_min_one_success</span></code> in the <code class="docutils literal notranslate"><span class="pre">join</span></code> task, we can instead get the intended behaviour:</p>
<img alt="../_images/branch_with_trigger.png" src="../_images/branch_with_trigger.png" />
</div>
</div>
</div>
<div class="section" id="dynamic-dags">
<h2>Dynamic DAGs<a class="headerlink" href="#dynamic-dags" title="Permalink to this headline"></a></h2>
<p>Since a DAG is defined by Python code, there is no need for it to be purely declarative; you are free to use loops, functions, and more to define your DAG.</p>
<p>For example, here is a DAG that uses a <code class="docutils literal notranslate"><span class="pre">for</span></code> loop to define some Tasks:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">DAG</span><span class="p">(</span><span class="s2">&quot;loop_example&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">first</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;first&quot;</span><span class="p">)</span>
<span class="n">last</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;last&quot;</span><span class="p">)</span>
<span class="n">options</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;branch_a&quot;</span><span class="p">,</span> <span class="s2">&quot;branch_b&quot;</span><span class="p">,</span> <span class="s2">&quot;branch_c&quot;</span><span class="p">,</span> <span class="s2">&quot;branch_d&quot;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">options</span><span class="p">:</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="n">option</span><span class="p">)</span>
<span class="n">first</span> <span class="o">&gt;&gt;</span> <span class="n">t</span> <span class="o">&gt;&gt;</span> <span class="n">last</span>
</pre></div>
</div>
<p>In general, we advise you to try and keep the <em>topology</em> (the layout) of your DAG tasks relatively stable; dynamic DAGs are usually better used for dynamically loading configuration options or changing operator options.</p>
</div>
<div class="section" id="dag-visualization">
<h2>DAG Visualization<a class="headerlink" href="#dag-visualization" title="Permalink to this headline"></a></h2>
<p>If you want to see a visual representation of a DAG, you have two options:</p>
<ul class="simple">
<li><p>You can load up the Airflow UI, navigate to your DAG, and select “Graph”</p></li>
<li><p>You can run <code class="docutils literal notranslate"><span class="pre">airflow</span> <span class="pre">dags</span> <span class="pre">show</span></code>, which renders it out as an image file</p></li>
</ul>
<p>We generally recommend you use the Graph view, as it will also show you the state of all the <a class="reference internal" href="tasks.html#concepts-task-instances"><span class="std std-ref">Task Instances</span></a> within any DAG Run you select.</p>
<p>Of course, as you develop out your DAGs they are going to get increasingly complex, so we provide a few ways to modify these DAG views to make them easier to understand.</p>
<div class="section" id="taskgroups">
<span id="concepts-taskgroups"></span><h3>TaskGroups<a class="headerlink" href="#taskgroups" title="Permalink to this headline"></a></h3>
<p>A TaskGroup can be used to organize tasks into hierarchical groups in Graph view. It is useful for creating repeating patterns and cutting down visual clutter.</p>
<p>Unlike <a class="reference internal" href="#concepts-subdags"><span class="std std-ref">SubDAGs</span></a>, TaskGroups are purely a UI grouping concept. Tasks in TaskGroups live on the same original DAG, and honor all the DAG settings and pool configurations.</p>
<img alt="../_images/task_group.gif" src="../_images/task_group.gif" />
<p>Dependency relationships can be applied across all tasks in a TaskGroup with the <code class="docutils literal notranslate"><span class="pre">&gt;&gt;</span></code> and <code class="docutils literal notranslate"><span class="pre">&lt;&lt;</span></code> operators. For example, the following code puts <code class="docutils literal notranslate"><span class="pre">task1</span></code> and <code class="docutils literal notranslate"><span class="pre">task2</span></code> in TaskGroup <code class="docutils literal notranslate"><span class="pre">group1</span></code> and then puts both tasks upstream of <code class="docutils literal notranslate"><span class="pre">task3</span></code>:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">TaskGroup</span><span class="p">(</span><span class="s2">&quot;group1&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">group1</span><span class="p">:</span>
<span class="n">task1</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;task1&quot;</span><span class="p">)</span>
<span class="n">task2</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;task2&quot;</span><span class="p">)</span>
<span class="n">task3</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;task3&quot;</span><span class="p">)</span>
<span class="n">group1</span> <span class="o">&gt;&gt;</span> <span class="n">task3</span>
</pre></div>
</div>
<p>TaskGroup also supports <code class="docutils literal notranslate"><span class="pre">default_args</span></code> like DAG, it will overwrite the <code class="docutils literal notranslate"><span class="pre">default_args</span></code> in DAG level:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pendulum</span>
<span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="s1">&#39;dag1&#39;</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2016</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">default_args</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;retries&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">},</span>
<span class="p">):</span>
<span class="k">with</span> <span class="n">TaskGroup</span><span class="p">(</span><span class="s1">&#39;group1&#39;</span><span class="p">,</span> <span class="n">default_args</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;retries&#39;</span><span class="p">:</span> <span class="mi">3</span><span class="p">}):</span>
<span class="n">task1</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;task1&#39;</span><span class="p">)</span>
<span class="n">task2</span> <span class="o">=</span> <span class="n">BashOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;task2&#39;</span><span class="p">,</span> <span class="n">bash_command</span><span class="o">=</span><span class="s1">&#39;echo Hello World!&#39;</span><span class="p">,</span> <span class="n">retries</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">task1</span><span class="o">.</span><span class="n">retries</span><span class="p">)</span> <span class="c1"># 3</span>
<span class="nb">print</span><span class="p">(</span><span class="n">task2</span><span class="o">.</span><span class="n">retries</span><span class="p">)</span> <span class="c1"># 2</span>
</pre></div>
</div>
<p>If you want to see a more advanced use of TaskGroup, you can look at the <code class="docutils literal notranslate"><span class="pre">example_task_group.py</span></code> example DAG that comes with Airflow.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>By default, child tasks/TaskGroups have their IDs prefixed with the group_id of their parent TaskGroup. This helps to ensure uniqueness of group_id and task_id throughout the DAG.</p>
<p>To disable the prefixing, pass <code class="docutils literal notranslate"><span class="pre">prefix_group_id=False</span></code> when creating the TaskGroup, but note that you will now be responsible for ensuring every single task and group has a unique ID of its own.</p>
</div>
</div>
<div class="section" id="edge-labels">
<span id="concepts-edge-labels"></span><h3>Edge Labels<a class="headerlink" href="#edge-labels" title="Permalink to this headline"></a></h3>
<p>As well as grouping tasks into groups, you can also label the <em>dependency edges</em> between different tasks in the Graph view - this can be especially useful for branching areas of your DAG, so you can label the conditions under which certain branches might run.</p>
<p>To add labels, you can use them directly inline with the <code class="docutils literal notranslate"><span class="pre">&gt;&gt;</span></code> and <code class="docutils literal notranslate"><span class="pre">&lt;&lt;</span></code> operators:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">airflow.utils.edgemodifier</span> <span class="kn">import</span> <span class="n">Label</span>
<span class="n">my_task</span> <span class="o">&gt;&gt;</span> <span class="n">Label</span><span class="p">(</span><span class="s2">&quot;When empty&quot;</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="n">other_task</span>
</pre></div>
</div>
<p>Or, you can pass a Label object to <code class="docutils literal notranslate"><span class="pre">set_upstream</span></code>/<code class="docutils literal notranslate"><span class="pre">set_downstream</span></code>:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">airflow.utils.edgemodifier</span> <span class="kn">import</span> <span class="n">Label</span>
<span class="n">my_task</span><span class="o">.</span><span class="n">set_downstream</span><span class="p">(</span><span class="n">other_task</span><span class="p">,</span> <span class="n">Label</span><span class="p">(</span><span class="s2">&quot;When empty&quot;</span><span class="p">))</span>
</pre></div>
</div>
<p>Here’s an example DAG which illustrates labeling different branches:</p>
<img alt="../_images/edge_label_example.png" src="../_images/edge_label_example.png" />
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/example_dags/example_branch_labels.py</span><a class="example-header-button viewcode-button reference internal" href="https://github.com/apache/airflow/tree/2.3.2/airflow/example_dags/example_branch_labels.py" target="_blank"><span class="viewcode-link">[source]</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span>
<span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
<span class="s2">&quot;example_branch_labels&quot;</span><span class="p">,</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">ingest</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;ingest&quot;</span><span class="p">)</span>
<span class="n">analyse</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;analyze&quot;</span><span class="p">)</span>
<span class="n">check</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;check_integrity&quot;</span><span class="p">)</span>
<span class="n">describe</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;describe_integrity&quot;</span><span class="p">)</span>
<span class="n">error</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;email_error&quot;</span><span class="p">)</span>
<span class="n">save</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;save&quot;</span><span class="p">)</span>
<span class="n">report</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;report&quot;</span><span class="p">)</span>
<span class="n">ingest</span> <span class="o">&gt;&gt;</span> <span class="n">analyse</span> <span class="o">&gt;&gt;</span> <span class="n">check</span>
<span class="n">check</span> <span class="o">&gt;&gt;</span> <span class="n">Label</span><span class="p">(</span><span class="s2">&quot;No errors&quot;</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="n">save</span> <span class="o">&gt;&gt;</span> <span class="n">report</span>
<span class="n">check</span> <span class="o">&gt;&gt;</span> <span class="n">Label</span><span class="p">(</span><span class="s2">&quot;Errors found&quot;</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="n">describe</span> <span class="o">&gt;&gt;</span> <span class="n">error</span> <span class="o">&gt;&gt;</span> <span class="n">report</span>
</pre></div>
</div>
</div>
</div>
</div>
<div class="section" id="dag-task-documentation">
<h2>DAG &amp; Task Documentation<a class="headerlink" href="#dag-task-documentation" title="Permalink to this headline"></a></h2>
<p>It’s possible to add documentation or notes to your DAGs &amp; task objects that are visible in the web interface (“Graph” &amp; “Tree” for DAGs, “Task Instance Details” for tasks).</p>
<p>There are a set of special task attributes that get rendered as rich content if defined:</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 38%" />
<col style="width: 62%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>attribute</p></th>
<th class="head"><p>rendered to</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>doc</p></td>
<td><p>monospace</p></td>
</tr>
<tr class="row-odd"><td><p>doc_json</p></td>
<td><p>json</p></td>
</tr>
<tr class="row-even"><td><p>doc_yaml</p></td>
<td><p>yaml</p></td>
</tr>
<tr class="row-odd"><td><p>doc_md</p></td>
<td><p>markdown</p></td>
</tr>
<tr class="row-even"><td><p>doc_rst</p></td>
<td><p>reStructuredText</p></td>
</tr>
</tbody>
</table>
<p>Please note that for DAGs, <code class="docutils literal notranslate"><span class="pre">doc_md</span></code> is the only attribute interpreted.</p>
<p>This is especially useful if your tasks are built dynamically from configuration files, as it allows you to expose the configuration that led to the related tasks in Airflow:</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">### My great DAG</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span> <span class="nn">pendulum</span>
<span class="n">dag</span> <span class="o">=</span> <span class="n">DAG</span><span class="p">(</span>
<span class="s2">&quot;my_dag&quot;</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">dag</span><span class="o">.</span><span class="n">doc_md</span> <span class="o">=</span> <span class="vm">__doc__</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">BashOperator</span><span class="p">(</span><span class="s2">&quot;foo&quot;</span><span class="p">,</span> <span class="n">dag</span><span class="o">=</span><span class="n">dag</span><span class="p">)</span>
<span class="n">t</span><span class="o">.</span><span class="n">doc_md</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span><span class="se">\</span>
<span class="s2">#Title&quot;</span>
<span class="s2">Here&#39;s a [url](www.airbnb.com)</span>
<span class="s2">&quot;&quot;&quot;</span>
</pre></div>
</div>
</div>
<div class="section" id="subdags">
<span id="concepts-subdags"></span><h2>SubDAGs<a class="headerlink" href="#subdags" title="Permalink to this headline"></a></h2>
<p>Sometimes, you will find that you are regularly adding exactly the same set of tasks to every DAG, or you want to group a lot of tasks into a single, logical unit. This is what SubDAGs are for.</p>
<p>For example, here’s a DAG that has a lot of parallel tasks in two sections:</p>
<img alt="../_images/subdag_before.png" src="../_images/subdag_before.png" />
<p>We can combine all of the parallel <code class="docutils literal notranslate"><span class="pre">task-*</span></code> operators into a single SubDAG, so that the resulting DAG resembles the following:</p>
<img alt="../_images/subdag_after.png" src="../_images/subdag_after.png" />
<p>Note that SubDAG operators should contain a factory method that returns a DAG object. This will prevent the SubDAG from being treated like a separate DAG in the main UI - remember, if Airflow sees a DAG at the top level of a Python file, it will <a class="reference internal" href="#concepts-dag-loading"><span class="std std-ref">load it as its own DAG</span></a>. For example:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/example_dags/subdags/subdag.py</span><a class="example-header-button viewcode-button reference internal" href="https://github.com/apache/airflow/tree/2.3.2/airflow/example_dags/subdags/subdag.py" target="_blank"><span class="viewcode-link">[source]</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">pendulum</span>
<span class="kn">from</span> <span class="nn">airflow</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="kn">from</span> <span class="nn">airflow.operators.empty</span> <span class="kn">import</span> <span class="n">EmptyOperator</span>
<span class="k">def</span> <span class="nf">subdag</span><span class="p">(</span><span class="n">parent_dag_name</span><span class="p">,</span> <span class="n">child_dag_name</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Generate a DAG to be used as a subdag.</span>
<span class="sd"> :param str parent_dag_name: Id of the parent DAG</span>
<span class="sd"> :param str child_dag_name: Id of the child DAG</span>
<span class="sd"> :param dict args: Default arguments to provide to the subdag</span>
<span class="sd"> :return: DAG to use as a subdag</span>
<span class="sd"> :rtype: airflow.models.DAG</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">dag_subdag</span> <span class="o">=</span> <span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">parent_dag_name</span><span class="si">}</span><span class="s1">.</span><span class="si">{</span><span class="n">child_dag_name</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">default_args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">pendulum</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2021</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">tz</span><span class="o">=</span><span class="s2">&quot;UTC&quot;</span><span class="p">),</span>
<span class="n">catchup</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@daily&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">):</span>
<span class="n">EmptyOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="n">child_dag_name</span><span class="si">}</span><span class="s1">-task-</span><span class="si">{</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="n">default_args</span><span class="o">=</span><span class="n">args</span><span class="p">,</span>
<span class="n">dag</span><span class="o">=</span><span class="n">dag_subdag</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">dag_subdag</span>
</pre></div>
</div>
</div>
<p>This SubDAG can then be referenced in your main DAG file:</p>
<div class="example-block-wrapper docutils container">
<p class="example-header"><span class="example-title">airflow/example_dags/example_subdag_operator.py</span></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">from</span> <span class="nn">airflow</span> <span class="kn">import</span> <span class="n">DAG</span>
<span class="kn">from</span> <span class="nn">airflow.example_dags.subdags.subdag</span> <span class="kn">import</span> <span class="n">subdag</span>
<span class="kn">from</span> <span class="nn">airflow.operators.empty</span> <span class="kn">import</span> <span class="n">EmptyOperator</span>
<span class="kn">from</span> <span class="nn">airflow.operators.subdag</span> <span class="kn">import</span> <span class="n">SubDagOperator</span>
<span class="n">DAG_NAME</span> <span class="o">=</span> <span class="s1">&#39;example_subdag_operator&#39;</span>
<span class="k">with</span> <span class="n">DAG</span><span class="p">(</span>
<span class="n">dag_id</span><span class="o">=</span><span class="n">DAG_NAME</span><span class="p">,</span>
<span class="n">default_args</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;retries&quot;</span><span class="p">:</span> <span class="mi">2</span><span class="p">},</span>
<span class="n">start_date</span><span class="o">=</span><span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2022</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
<span class="n">schedule_interval</span><span class="o">=</span><span class="s2">&quot;@once&quot;</span><span class="p">,</span>
<span class="n">tags</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;example&#39;</span><span class="p">],</span>
<span class="p">)</span> <span class="k">as</span> <span class="n">dag</span><span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;start&#39;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">section_1</span> <span class="o">=</span> <span class="n">SubDagOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;section-1&#39;</span><span class="p">,</span>
<span class="n">subdag</span><span class="o">=</span><span class="n">subdag</span><span class="p">(</span><span class="n">DAG_NAME</span><span class="p">,</span> <span class="s1">&#39;section-1&#39;</span><span class="p">,</span> <span class="n">dag</span><span class="o">.</span><span class="n">default_args</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">some_other_task</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;some-other-task&#39;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">section_2</span> <span class="o">=</span> <span class="n">SubDagOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;section-2&#39;</span><span class="p">,</span>
<span class="n">subdag</span><span class="o">=</span><span class="n">subdag</span><span class="p">(</span><span class="n">DAG_NAME</span><span class="p">,</span> <span class="s1">&#39;section-2&#39;</span><span class="p">,</span> <span class="n">dag</span><span class="o">.</span><span class="n">default_args</span><span class="p">),</span>
<span class="p">)</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">EmptyOperator</span><span class="p">(</span>
<span class="n">task_id</span><span class="o">=</span><span class="s1">&#39;end&#39;</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">start</span> <span class="o">&gt;&gt;</span> <span class="n">section_1</span> <span class="o">&gt;&gt;</span> <span class="n">some_other_task</span> <span class="o">&gt;&gt;</span> <span class="n">section_2</span> <span class="o">&gt;&gt;</span> <span class="n">end</span>
</pre></div>
</div>
</div>
<p>You can zoom into a <a class="reference internal" href="../_api/airflow/operators/subdag/index.html#airflow.operators.subdag.SubDagOperator" title="airflow.operators.subdag.SubDagOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">SubDagOperator</span></code></a> from the graph view of the main DAG to show the tasks contained within the SubDAG:</p>
<img alt="../_images/subdag_zoom.png" src="../_images/subdag_zoom.png" />
<p>Some other tips when using SubDAGs:</p>
<ul class="simple">
<li><p>By convention, a SubDAG’s <code class="docutils literal notranslate"><span class="pre">dag_id</span></code> should be prefixed by the name of its parent DAG and a dot (<code class="docutils literal notranslate"><span class="pre">parent.child</span></code>)</p></li>
<li><p>You should share arguments between the main DAG and the SubDAG by passing arguments to the SubDAG operator (as demonstrated above)</p></li>
<li><p>SubDAGs must have a schedule and be enabled. If the SubDAG’s schedule is set to <code class="docutils literal notranslate"><span class="pre">None</span></code> or <code class="docutils literal notranslate"><span class="pre">&#64;once</span></code>, the SubDAG will succeed without having done anything.</p></li>
<li><p>Clearing a <a class="reference internal" href="../_api/airflow/operators/subdag/index.html#airflow.operators.subdag.SubDagOperator" title="airflow.operators.subdag.SubDagOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">SubDagOperator</span></code></a> also clears the state of the tasks within it.</p></li>
<li><p>Marking success on a <a class="reference internal" href="../_api/airflow/operators/subdag/index.html#airflow.operators.subdag.SubDagOperator" title="airflow.operators.subdag.SubDagOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">SubDagOperator</span></code></a> does not affect the state of the tasks within it.</p></li>
<li><p>Refrain from using <a class="reference internal" href="#concepts-depends-on-past"><span class="std std-ref">Depends On Past</span></a> in tasks within the SubDAG as this can be confusing.</p></li>
<li><p>You can specify an executor for the SubDAG. It is common to use the SequentialExecutor if you want to run the SubDAG in-process and effectively limit its parallelism to one. Using LocalExecutor can be problematic as it may over-subscribe your worker, running multiple tasks in a single slot.</p></li>
</ul>
<p>See <code class="docutils literal notranslate"><span class="pre">airflow/example_dags</span></code> for a demonstration.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>Parallelism is <em>not honored</em> by <a class="reference internal" href="../_api/airflow/operators/subdag/index.html#airflow.operators.subdag.SubDagOperator" title="airflow.operators.subdag.SubDagOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">SubDagOperator</span></code></a>, and so resources could be consumed by SubdagOperators beyond any limits you may have set.</p>
</div>
</div>
<div class="section" id="taskgroups-vs-subdags">
<h2>TaskGroups vs SubDAGs<a class="headerlink" href="#taskgroups-vs-subdags" title="Permalink to this headline"></a></h2>
<p>SubDAGs, while serving a similar purpose as TaskGroups, introduces both performance and functional issues due to its implementation.</p>
<ul class="simple">
<li><p>The SubDagOperator starts a BackfillJob, which ignores existing parallelism configurations potentially oversubscribing the worker environment.</p></li>
<li><p>SubDAGs have their own DAG attributes. When the SubDAG DAG attributes are inconsistent with its parent DAG, unexpected behavior can occur.</p></li>
<li><p>Unable to see the “full” DAG in one view as SubDAGs exists as a full fledged DAG.</p></li>
<li><p>SubDAGs introduces all sorts of edge cases and caveats. This can disrupt user experience and expectation.</p></li>
</ul>
<p>TaskGroups, on the other hand, is a better option given that it is purely a UI grouping concept. All tasks within the TaskGroup still behave as any other tasks outside of the TaskGroup.</p>
<p>You can see the core differences between these two constructs.</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 50%" />
<col style="width: 50%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>TaskGroup</p></th>
<th class="head"><p>SubDAG</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p>Repeating patterns as part of the same DAG</p></td>
<td><p>Repeating patterns as a separate DAG</p></td>
</tr>
<tr class="row-odd"><td><p>One set of views and statistics for the DAG</p></td>
<td><p>Separate set of views and statistics between parent
and child DAGs</p></td>
</tr>
<tr class="row-even"><td><p>One set of DAG configuration</p></td>
<td><p>Several sets of DAG configurations</p></td>
</tr>
<tr class="row-odd"><td><p>Honors parallelism configurations through existing
SchedulerJob</p></td>
<td><p>Does not honor parallelism configurations due to
newly spawned BackfillJob</p></td>
</tr>
<tr class="row-even"><td><p>Simple construct declaration with context manager</p></td>
<td><p>Complex DAG factory with naming restrictions</p></td>
</tr>
</tbody>
</table>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>SubDAG is deprecated hence TaskGroup is always the preferred choice.</p>
</div>
</div>
<div class="section" id="packaging-dags">
<h2>Packaging DAGs<a class="headerlink" href="#packaging-dags" title="Permalink to this headline"></a></h2>
<p>While simpler DAGs are usually only in a single Python file, it is not uncommon that more complex DAGs might be spread across multiple files and have dependencies that should be shipped with them (“vendored”).</p>
<p>You can either do this all inside of the <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code>, with a standard filesystem layout, or you can package the DAG and all of its Python files up as a single zip file. For instance, you could ship two dags along with a dependency they need as a zip file with the following contents:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">my_dag1</span><span class="o">.</span><span class="n">py</span>
<span class="n">my_dag2</span><span class="o">.</span><span class="n">py</span>
<span class="n">package1</span><span class="o">/</span><span class="fm">__init__</span><span class="o">.</span><span class="n">py</span>
<span class="n">package1</span><span class="o">/</span><span class="n">functions</span><span class="o">.</span><span class="n">py</span>
</pre></div>
</div>
<p>Note that packaged DAGs come with some caveats:</p>
<ul class="simple">
<li><p>They cannot be used if you have picking enabled for serialization</p></li>
<li><p>They cannot contain compiled libraries (e.g. <code class="docutils literal notranslate"><span class="pre">libz.so</span></code>), only pure Python</p></li>
<li><p>They will be inserted into Python’s <code class="docutils literal notranslate"><span class="pre">sys.path</span></code> and importable by any other code in the Airflow process, so ensure the package names don’t clash with other packages already installed on your system.</p></li>
</ul>
<p>In general, if you have a complex set of compiled dependencies and modules, you are likely better off using the Python <code class="docutils literal notranslate"><span class="pre">virtualenv</span></code> system and installing the necessary packages on your target systems with <code class="docutils literal notranslate"><span class="pre">pip</span></code>.</p>
</div>
<div class="section" id="airflowignore">
<span id="concepts-airflowignore"></span><h2><code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code><a class="headerlink" href="#airflowignore" title="Permalink to this headline"></a></h2>
<p>An <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code> file specifies the directories or files in <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code>
or <code class="docutils literal notranslate"><span class="pre">PLUGINS_FOLDER</span></code> that Airflow should intentionally ignore. Airflow supports
two syntax flavors for patterns in the file, as specified by the <code class="docutils literal notranslate"><span class="pre">DAG_IGNORE_FILE_SYNTAX</span></code>
configuration parameter (<em>added in Airflow 2.3</em>): <code class="docutils literal notranslate"><span class="pre">regexp</span></code> and <code class="docutils literal notranslate"><span class="pre">glob</span></code>.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The default <code class="docutils literal notranslate"><span class="pre">DAG_IGNORE_FILE_SYNTAX</span></code> is <code class="docutils literal notranslate"><span class="pre">regexp</span></code> to ensure backwards compatibility.</p>
</div>
<p>For the <code class="docutils literal notranslate"><span class="pre">regexp</span></code> pattern syntax (the default), each line in <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code>
specifies a regular expression pattern, and directories or files whose names (not DAG id)
match any of the patterns would be ignored (under the hood, <code class="docutils literal notranslate"><span class="pre">Pattern.search()</span></code> is used
to match the pattern). Use the <code class="docutils literal notranslate"><span class="pre">#</span></code> character to indicate a comment; all characters
on a line following a <code class="docutils literal notranslate"><span class="pre">#</span></code> will be ignored.</p>
<p>With the <code class="docutils literal notranslate"><span class="pre">glob</span></code> syntax, the patterns work just like those in a <code class="docutils literal notranslate"><span class="pre">.gitignore</span></code> file:</p>
<ul class="simple">
<li><p>The <code class="docutils literal notranslate"><span class="pre">*</span></code> character will any number of characters, except <code class="docutils literal notranslate"><span class="pre">/</span></code></p></li>
<li><p>The <code class="docutils literal notranslate"><span class="pre">?</span></code> character will match any single character, except <code class="docutils literal notranslate"><span class="pre">/</span></code></p></li>
<li><p>The range notation, e.g. <code class="docutils literal notranslate"><span class="pre">[a-zA-Z]</span></code>, can be used to match one of the characters in a range</p></li>
<li><p>A pattern can be negated by prefixing with <code class="docutils literal notranslate"><span class="pre">!</span></code>. Patterns are evaluated in order so
a negation can override a previously defined pattern in the same file or patterns defined in
a parent directory.</p></li>
<li><p>A double asterisk (<code class="docutils literal notranslate"><span class="pre">**</span></code>) can be used to match across directories. For example, <code class="docutils literal notranslate"><span class="pre">**/__pycache__/</span></code>
will ignore <code class="docutils literal notranslate"><span class="pre">__pycache__</span></code> directories in each sub-directory to infinite depth.</p></li>
<li><p>If there is a <code class="docutils literal notranslate"><span class="pre">/</span></code> at the beginning or middle (or both) of the pattern, then the pattern
is relative to the directory level of the particular .airflowignore file itself. Otherwise the
pattern may also match at any level below the .airflowignore level.</p></li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code> file should be put in your <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code>. For example, you can prepare
a <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code> file using the <code class="docutils literal notranslate"><span class="pre">regexp</span></code> syntax with content</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">project_a</span>
<span class="n">tenant_</span><span class="p">[</span>\<span class="n">d</span><span class="p">]</span>
</pre></div>
</div>
<p>Or, equivalently, in the <code class="docutils literal notranslate"><span class="pre">glob</span></code> syntax</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">**/*</span><span class="n">project_a</span><span class="o">*</span>
<span class="n">tenant_</span><span class="p">[</span><span class="mi">0</span><span class="o">-</span><span class="mi">9</span><span class="p">]</span><span class="o">*</span>
</pre></div>
</div>
<p>Then files like <code class="docutils literal notranslate"><span class="pre">project_a_dag_1.py</span></code>, <code class="docutils literal notranslate"><span class="pre">TESTING_project_a.py</span></code>, <code class="docutils literal notranslate"><span class="pre">tenant_1.py</span></code>,
<code class="docutils literal notranslate"><span class="pre">project_a/dag_1.py</span></code>, and <code class="docutils literal notranslate"><span class="pre">tenant_1/dag_1.py</span></code> in your <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code> would be ignored
(If a directory’s name matches any of the patterns, this directory and all its subfolders
would not be scanned by Airflow at all. This improves efficiency of DAG finding).</p>
<p>The scope of a <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code> file is the directory it is in plus all its subfolders.
You can also prepare <code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code> file for a subfolder in <code class="docutils literal notranslate"><span class="pre">DAG_FOLDER</span></code> and it
would only be applicable for that subfolder.</p>
</div>
<div class="section" id="dag-dependencies">
<h2>DAG Dependencies<a class="headerlink" href="#dag-dependencies" title="Permalink to this headline"></a></h2>
<p><em>Added in Airflow 2.1</em></p>
<p>While dependencies between tasks in a DAG are explicitly defined through upstream and downstream
relationships, dependencies between DAGs are a bit more complex. In general, there are two ways
in which one DAG can depend on another:</p>
<ul class="simple">
<li><p>triggering - <a class="reference internal" href="../_api/airflow/operators/trigger_dagrun/index.html#airflow.operators.trigger_dagrun.TriggerDagRunOperator" title="airflow.operators.trigger_dagrun.TriggerDagRunOperator"><code class="xref py py-class docutils literal notranslate"><span class="pre">TriggerDagRunOperator</span></code></a></p></li>
<li><p>waiting - <code class="xref py py-class docutils literal notranslate"><span class="pre">ExternalTaskSensor</span></code></p></li>
</ul>
<p>Additional difficulty is that one DAG could wait for or trigger several runs of the other DAG
with different data intervals. The <strong>Dag Dependencies</strong> view
<code class="docutils literal notranslate"><span class="pre">Menu</span> <span class="pre">-&gt;</span> <span class="pre">Browse</span> <span class="pre">-&gt;</span> <span class="pre">DAG</span> <span class="pre">Dependencies</span></code> helps visualize dependencies between DAGs. The dependencies
are calculated by the scheduler during DAG serialization and the webserver uses them to build
the dependency graph.</p>
<p>The dependency detector is configurable, so you can implement your own logic different than the defaults in
<code class="xref py py-class docutils literal notranslate"><span class="pre">DependencyDetector</span></code></p>
</div>
<div class="section" id="dag-pausing-deactivation-and-deletion">
<h2>DAG pausing, deactivation and deletion<a class="headerlink" href="#dag-pausing-deactivation-and-deletion" title="Permalink to this headline"></a></h2>
<p>The DAGs have several states when it comes to being “not running”. DAGs can be paused, deactivated
and finally all metadata for the DAG can be deleted.</p>
<p>Dag can be paused via UI when it is present in the <code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code>, and scheduler stored it in
the database, but the user chose to disable it via the UI. The “pause” and “unpause” actions are available
via UI and API. Paused DAG is not scheduled by the Scheduler, but you can trigger them via UI for
manual runs. In the UI, you can see Paused DAGs (in <code class="docutils literal notranslate"><span class="pre">Paused</span></code> tab). The DAGs that are un-paused
can be found in the <code class="docutils literal notranslate"><span class="pre">Active</span></code> tab.</p>
<p>Dag can be deactivated (do not confuse it with <code class="docutils literal notranslate"><span class="pre">Active</span></code> tag in the UI) by removing them from the
<code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code>. When scheduler parses the <code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code> and misses the DAG that it had seen
before and stored in the database it will set is as deactivated. The metadata and history of the
DAG` is kept for deactivated DAGs and when the DAG is re-added to the <code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code> it will be again
activated and history will be visible. You cannot activate/deactivate DAG via UI or API, this
can only be done by removing files from the <code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code>. Once again - no data for historical runs of the
DAG are lost when it is deactivated by the scheduler. Note that the <code class="docutils literal notranslate"><span class="pre">Active</span></code> tab in Airflow UI
refers to DAGs that are not both <code class="docutils literal notranslate"><span class="pre">Activated</span></code> and <code class="docutils literal notranslate"><span class="pre">Not</span> <span class="pre">paused</span></code> so this might initially be a
little confusing.</p>
<p>You can’t see the deactivated DAGs in the UI - you can sometimes see the historical runs, but when you try to
see the information about those you will see the error that the DAG is missing.</p>
<p>You can also delete the DAG metadata from the metadata database using UI or API, but it does not
always result in disappearing of the DAG from the UI - which might be also initially a bit confusing.
If the DAG is still in <code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code> when you delete the metadata, the DAG will re-appear as
Scheduler will parse the folder, only historical runs information for the DAG will be removed.</p>
<p>This all means that if you want to actually delete a DAG and its all historical metadata, you need to do
it in three steps:</p>
<ul class="simple">
<li><p>pause the DAG</p></li>
<li><p>delete the historical metadata from the database, via UI or API</p></li>
<li><p>delete the DAG file from the <code class="docutils literal notranslate"><span class="pre">DAGS_FOLDER</span></code> and wait until it becomes inactive</p></li>
</ul>
</div>
</div>
<div class="pager" role="navigation" aria-label="related navigation">
<a rel="prev" title="Architecture Overview" href="overview.html" >
<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" accesskey="p">Previous</button>
</a>
<a rel="next" title="Tasks" href="tasks.html" >
<button class="btn-hollow btn-blue bodytext__medium--cerulean-blue" accesskey="n">Next</button>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="rating-container">
<p class="bodytext__medium--greyish-brown font-weight-500">Was this entry helpful?</p>
<div class="rating">
<div id="rate-star-5" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-4" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-3" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-2" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
<div id="rate-star-1" class="rate-star">
<svg xmlns="http://www.w3.org/2000/svg" width="21.05" height="20.02" viewBox="0 0 21.05 20.02">
<g id="Group_806" data-name="Group 806" transform="translate(-774.404 -13.178)">
<path id="Path_715" d="M791.434 33.2l-6.5-3.42-6.5 3.42 1.242-7.243-5.262-5.13 7.273-1.057 3.252-6.59 3.252 6.59 7.273 1.057-5.262 5.13z" fill="#017cee" data-name="Path 715"></path>
</g>
</svg>
</div>
</div>
</div>
</main>
<nav class="wy-nav-side-toc">
<div class="wy-menu-vertical">
<ul>
<li><a class="reference internal" href="#">DAGs</a><ul>
<li><a class="reference internal" href="#declaring-a-dag">Declaring a DAG</a><ul>
<li><a class="reference internal" href="#task-dependencies">Task Dependencies</a></li>
</ul>
</li>
<li><a class="reference internal" href="#loading-dags">Loading DAGs</a></li>
<li><a class="reference internal" href="#running-dags">Running DAGs</a></li>
<li><a class="reference internal" href="#dag-assignment">DAG Assignment</a></li>
<li><a class="reference internal" href="#default-arguments">Default Arguments</a></li>
<li><a class="reference internal" href="#the-dag-decorator">The DAG decorator</a></li>
<li><a class="reference internal" href="#control-flow">Control Flow</a><ul>
<li><a class="reference internal" href="#branching">Branching</a></li>
<li><a class="reference internal" href="#latest-only">Latest Only</a></li>
<li><a class="reference internal" href="#depends-on-past">Depends On Past</a></li>
<li><a class="reference internal" href="#trigger-rules">Trigger Rules</a></li>
</ul>
</li>
<li><a class="reference internal" href="#dynamic-dags">Dynamic DAGs</a></li>
<li><a class="reference internal" href="#dag-visualization">DAG Visualization</a><ul>
<li><a class="reference internal" href="#taskgroups">TaskGroups</a></li>
<li><a class="reference internal" href="#edge-labels">Edge Labels</a></li>
</ul>
</li>
<li><a class="reference internal" href="#dag-task-documentation">DAG &amp; Task Documentation</a></li>
<li><a class="reference internal" href="#subdags">SubDAGs</a></li>
<li><a class="reference internal" href="#taskgroups-vs-subdags">TaskGroups vs SubDAGs</a></li>
<li><a class="reference internal" href="#packaging-dags">Packaging DAGs</a></li>
<li><a class="reference internal" href="#airflowignore"><code class="docutils literal notranslate"><span class="pre">.airflowignore</span></code></a></li>
<li><a class="reference internal" href="#dag-dependencies">DAG Dependencies</a></li>
<li><a class="reference internal" href="#dag-pausing-deactivation-and-deletion">DAG pausing, deactivation and deletion</a></li>
</ul>
</li>
</ul>
</div>
</nav>
</div>
<div class="base-layout--button">
<a href="https://github.com/apache/airflow/edit/main/docs/apache-airflow/concepts/dags.rst" rel="nofollow">
<button class="btn-hollow btn-brown btn-with-icon with-box-shadow button-fixed">
<svg xmlns="http://www.w3.org/2000/svg" width="30.76" height="30">
<path d="M15.379 0a15.381 15.381 0 00-4.86 29.974c.769.141 1.05-.334 1.05-.741 0-.365-.013-1.332-.021-2.616-4.278.929-5.181-2.062-5.181-2.062a4.071 4.071 0 00-1.708-2.25c-1.4-.954.106-.935.106-.935a3.231 3.231 0 012.356 1.585 3.274 3.274 0 004.476 1.278 3.287 3.287 0 01.976-2.056c-3.415-.388-7.005-1.707-7.005-7.6a5.947 5.947 0 011.583-4.127 5.53 5.53 0 01.151-4.07s1.291-.413 4.229 1.577a14.577 14.577 0 017.7 0c2.936-1.99 4.225-1.577 4.225-1.577a5.523 5.523 0 01.153 4.07 5.937 5.937 0 011.581 4.127c0 5.909-3.6 7.209-7.022 7.589a3.672 3.672 0 011.044 2.848c0 2.056-.019 3.715-.019 4.219 0 .411.277.89 1.057.74A15.382 15.382 0 0015.378.001z" data-name="Path 224" fill="#51504f" fill-rule="evenodd"></path>
</svg>
<span class="bodytext__medium--brownish-grey">Suggest a change on this page</span>
</button>
</a>
</div>
</div>
<footer>
<div class="footer-section footer-section__media-section">
<div class="d-flex align-items-center">
<a class="footer-section__media-section--link" target="_blank" href="https://github.com/apache/airflow">
<svg xmlns="http://www.w3.org/2000/svg" width="46.14" height="45" viewBox="0 0 46.14 45">
<path id="Path_207" d="M228.962 1078.578a23.072 23.072 0 0 0-7.29 44.96c1.154.212 1.574-.5 1.574-1.112 0-.548-.02-2-.031-3.924-6.417 1.394-7.771-3.093-7.771-3.093a6.109 6.109 0 0 0-2.562-3.375c-2.095-1.431.159-1.4.159-1.4a4.846 4.846 0 0 1 3.533 2.377c2.058 3.525 5.4 2.507 6.714 1.917a4.926 4.926 0 0 1 1.464-3.084c-5.123-.582-10.508-2.562-10.508-11.4a8.919 8.919 0 0 1 2.374-6.191 8.3 8.3 0 0 1 .226-6.105s1.937-.62 6.344 2.365a21.857 21.857 0 0 1 11.551 0c4.4-2.985 6.338-2.365 6.338-2.365a8.284 8.284 0 0 1 .23 6.105 8.9 8.9 0 0 1 2.371 6.191c0 8.862-5.393 10.812-10.533 11.384a5.506 5.506 0 0 1 1.566 4.272c0 3.084-.028 5.572-.028 6.329 0 .617.415 1.334 1.586 1.109a23.073 23.073 0 0 0-7.308-44.958z" fill="#fff" fill-rule="evenodd" data-name="Path 207" transform="translate(-205.894 -1078.578)"></path>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://github.com/apache/airflow/issues">
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45" viewBox="0 0 45 45">
<g id="Group_210" data-name="Group 210" transform="translate(-339.789 -1315.282)">
<path id="Path_218" d="M394.82 1315.282h-21.671a9.784 9.784 0 0 0 9.784 9.778h3.986v3.857a9.784 9.784 0 0 0 9.784 9.771v-21.523a1.884 1.884 0 0 0-1.883-1.883z" fill="#fff" data-name="Path 218" transform="translate(-11.914)"></path>
<path id="Path_219" d="M378.14 1332.072h-21.671a9.778 9.778 0 0 0 9.778 9.778h4.018v3.857a9.784 9.784 0 0 0 9.752 9.778v-21.536a1.877 1.877 0 0 0-1.877-1.877z" fill="#fff" data-name="Path 219" transform="translate(-5.957 -5.996)"></path>
<path id="Path_220" d="M361.46 1348.862h-21.671a9.778 9.778 0 0 0 9.778 9.778h3.992v3.857a9.778 9.778 0 0 0 9.778 9.778v-21.529a1.883 1.883 0 0 0-1.877-1.884z" fill="#fff" data-name="Path 220" transform="translate(0 -11.993)"></path>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://s.apache.org/airflow-slack">
<svg xmlns="http://www.w3.org/2000/svg" width="45.073" height="45.073" viewBox="0 0 45.073 45.073">
<g id="Group_208" data-name="Group 208" transform="translate(-661.145 -806.287)">
<g id="Group_204" data-name="Group 204" transform="translate(661.145 830.01)">
<path id="Path_208" d="M670.634 856.859a4.744 4.744 0 1 1-4.744-4.744h4.744z" fill="#fff" data-name="Path 208" transform="translate(-661.145 -852.115)"></path>
<path id="Path_209" d="M684.059 856.859a4.744 4.744 0 0 1 9.489 0v11.861a4.744 4.744 0 1 1-9.489 0z" fill="#fff" data-name="Path 209" transform="translate(-672.198 -852.115)"></path>
</g>
<g id="Group_205" data-name="Group 205" transform="translate(661.145 806.287)">
<path id="Path_210" d="M688.8 815.776a4.744 4.744 0 1 1 4.744-4.745v4.745z" fill="#fff" data-name="Path 210" transform="translate(-672.198 -806.287)"></path>
<path id="Path_211" d="M677.751 829.2a4.744 4.744 0 0 1 0 9.489H665.89a4.744 4.744 0 1 1 0-9.489z" fill="#fff" data-name="Path 211" transform="translate(-661.145 -817.34)"></path>
</g>
<g id="Group_206" data-name="Group 206" transform="translate(684.868 806.287)">
<path id="Path_212" d="M729.887 833.945a4.744 4.744 0 1 1 4.745 4.745h-4.745z" fill="#fff" data-name="Path 212" transform="translate(-718.026 -817.34)"></path>
<path id="Path_213" d="M716.462 822.893a4.744 4.744 0 1 1-9.489 0v-11.862a4.744 4.744 0 0 1 9.489 0z" fill="#fff" data-name="Path 213" transform="translate(-706.973 -806.287)"></path>
</g>
<g id="Group_207" data-name="Group 207" transform="translate(684.868 830.01)">
<path id="Path_214" d="M711.718 875.029a4.744 4.744 0 1 1-4.745 4.744v-4.744z" fill="#fff" data-name="Path 214" transform="translate(-706.973 -863.168)"></path>
<path id="Path_215" d="M711.718 861.6a4.744 4.744 0 1 1 0-9.489h11.861a4.744 4.744 0 0 1 0 9.489z" fill="#fff" data-name="Path 215" transform="translate(-706.973 -852.115)"></path>
</g>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://stackoverflow.com/questions/tagged/airflow">
<svg xmlns="http://www.w3.org/2000/svg" width="37.647" height="44.6" viewBox="0 0 37.647 44.6">
<g id="Group_209" data-name="Group 209" transform="translate(-645.2 -975.455)">
<path id="Path_216" d="M677.028 1043.1v-11.948h3.966v15.914H645.2v-15.914h3.966v11.948z" fill="#fff" data-name="Path 216" transform="translate(0 -27.014)"></path>
<path id="Path_217" d="M661.012 1003.008l19.467 4.069.824-3.914-19.467-4.069zm2.575-9.27l18.025 8.395 1.648-3.605-18.025-8.446zm5-8.858l15.3 12.721 2.524-3.039-15.3-12.721zm9.888-9.425l-3.193 2.369 11.845 15.965 3.193-2.369zm-17.875 36.617h19.879v-3.966H660.6z" fill="#fff" data-name="Path 217" transform="translate(-7.469)"></path>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://twitter.com/ApacheAirflow">
<svg xmlns="http://www.w3.org/2000/svg" width="44.355" height="44.355" viewBox="0 0 44.355 44.355">
<g id="Group_211" data-name="Group 211" transform="translate(-503 -1382.2)">
<path id="Path_221" d="M541.811 1382.2h-33.267a5.546 5.546 0 0 0-5.544 5.544v33.266a5.547 5.547 0 0 0 5.544 5.545h33.267a5.546 5.546 0 0 0 5.544-5.545v-33.266a5.546 5.546 0 0 0-5.544-5.544zm-5.611 16.533c.011.244.011.488.011.732 0 7.507-5.722 16.178-16.179 16.178a16.173 16.173 0 0 1-8.7-2.539 10.92 10.92 0 0 0 1.353.078 11.4 11.4 0 0 0 7.064-2.44 5.685 5.685 0 0 1-5.311-3.947 5.725 5.725 0 0 0 2.561-.1 5.7 5.7 0 0 1-4.557-5.578v-.078a5.752 5.752 0 0 0 2.572.71 5.709 5.709 0 0 1-1.763-7.6 16.146 16.146 0 0 0 11.721 5.944 6.282 6.282 0 0 1-.144-1.3 5.688 5.688 0 0 1 9.836-3.892 11.3 11.3 0 0 0 3.615-1.375 5.721 5.721 0 0 1-2.506 3.149 11.538 11.538 0 0 0 3.271-.9 11.585 11.585 0 0 1-2.844 2.958z" fill="#fff" data-name="Path 221"></path>
</g>
</svg>
</a>
<a class="footer-section__media-section--link" target="_blank" href="https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA">
<svg xmlns="http://www.w3.org/2000/svg" width="49.594" height="34.941" viewBox="0 0 49.594 34.941">
<path id="Path_223" d="M1124.557 1230a6.232 6.232 0 0 0-4.385-4.413c-3.867-1.043-19.376-1.043-19.376-1.043s-15.508 0-19.376 1.043a6.232 6.232 0 0 0-4.385 4.413c-1.036 3.893-1.036 12.014-1.036 12.014s0 8.122 1.036 12.015a6.232 6.232 0 0 0 4.385 4.413c3.867 1.043 19.376 1.043 19.376 1.043s15.509 0 19.376-1.043a6.232 6.232 0 0 0 4.385-4.413c1.036-3.893 1.036-12.015 1.036-12.015s.001-8.123-1.036-12.014zm-28.833 19.388v-14.748l12.962 7.374z" fill="#fff" data-name="Path 223" transform="translate(-1076 -1224.542)"></path>
</svg>
</a>
</div>
<div class="footer-section__media-section--button-with-text">
<span class="footer-section__media-section--text">Want to be a part of Apache Airflow?</span>
<a href="/community">
<button id="" class="btn-filled bodytext__medium--white ">Join community</button>
</a>
</div>
</div>
<div class="footer-section footer-section__policies-section">
<div class="footer-section">
<span>© The Apache Software Foundation <script>document.write(new Date().getFullYear())</script></span>
<div class="footer-section__policies-section--policies">
<a href="https://www.apache.org/licenses/" class="footer-section__policies-section--policy-item">
<span>License</span>
</a>
<a href="https://www.apache.org/foundation/sponsorship.html" class="footer-section__policies-section--policy-item">
<span>Donate</span>
</a>
<a href="https://www.apache.org/foundation/thanks.html" class="footer-section__policies-section--policy-item">
<span>Thanks</span>
</a>
<a href="https://www.apache.org/security/" class="footer-section__policies-section--policy-item">
<span>Security</span>
</a>
</div>
</div>
<span class="footer-section__policies-section--disclaimer">
Apache Airflow, Apache, Airflow, the Airflow logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation.
All other products or name brands are trademarks of their respective holders, including The Apache Software Foundation.
</span>
</div>
</footer>
<script type="text/javascript" src="../_static/_gen/js/docs.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/gh-jira-links.js"></script>
</body>
</html>