blob: dc6c85b3097ff3f4ddc79416c2f667d4fd8a6e9a [file] [log] [blame]
<!--
Javascript to render AIRFLOW-XXX and PR references in text
as HTML links.
Overrides extrahead block from sphinx_rtd_theme
https://www.sphinx-doc.org/en/master/templating.html
-->
<!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]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cross-DAG Dependencies &mdash; Airflow Documentation</title>
<link rel="shortcut icon" href="../../_static/pin_32.png"/>
<script type="text/javascript" src="../../_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="../../" src="../../_static/documentation_options.js"></script>
<script type="text/javascript" src="../../_static/jquery.js"></script>
<script type="text/javascript" src="../../_static/underscore.js"></script>
<script type="text/javascript" src="../../_static/doctools.js"></script>
<script type="text/javascript" src="../../_static/language_data.js"></script>
<script type="text/javascript" src="../../_static/jira-links.js"></script>
<script type="text/javascript" src="../../_static/js/theme.js"></script>
<link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="../../_static/graphviz.css" type="text/css" />
<link rel="stylesheet" href="../../_static/exampleinclude.css" type="text/css" />
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
<link rel="next" title="Creating a custom Operator" href="../custom-operator.html" />
<link rel="prev" title="PythonOperator" href="python.html" />
<script>
</script>
<style>
</style>
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../../index.html" class="icon icon-home"> Airflow
</a>
<div class="version">
1.10.8
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<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.html">Quick Start</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../tutorial.html">Tutorial</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="../index.html">How-to Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="../set-config.html">Setting Configuration Options</a></li>
<li class="toctree-l2"><a class="reference internal" href="../initialize-database.html">Initializing a Database Backend</a></li>
<li class="toctree-l2 current"><a class="reference internal" href="index.html">Using Operators</a><ul class="current">
<li class="toctree-l3"><a class="reference internal" href="bash.html">BashOperator</a></li>
<li class="toctree-l3"><a class="reference internal" href="dingding.html">Dingding Operators</a></li>
<li class="toctree-l3"><a class="reference internal" href="gcp/index.html">Google Cloud Operators</a></li>
<li class="toctree-l3"><a class="reference internal" href="papermill.html">Papermill</a></li>
<li class="toctree-l3"><a class="reference internal" href="python.html">PythonOperator</a></li>
<li class="toctree-l3 current"><a class="current reference internal" href="#">Cross-DAG Dependencies</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#externaltasksensor">ExternalTaskSensor</a></li>
<li class="toctree-l4"><a class="reference internal" href="#externaltaskmarker">ExternalTaskMarker</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="../custom-operator.html">Creating a custom Operator</a></li>
<li class="toctree-l2"><a class="reference internal" href="../connection/index.html">Managing Connections</a></li>
<li class="toctree-l2"><a class="reference internal" href="../secure-connections.html">Securing Connections</a></li>
<li class="toctree-l2"><a class="reference internal" href="../secure-connections.html#rotating-encryption-keys">Rotating encryption keys</a></li>
<li class="toctree-l2"><a class="reference internal" href="../write-logs.html">Writing Logs</a></li>
<li class="toctree-l2"><a class="reference internal" href="../run-behind-proxy.html">Running Airflow behind a reverse proxy</a></li>
<li class="toctree-l2"><a class="reference internal" href="../run-with-systemd.html">Running Airflow with systemd</a></li>
<li class="toctree-l2"><a class="reference internal" href="../run-with-upstart.html">Running Airflow with upstart</a></li>
<li class="toctree-l2"><a class="reference internal" href="../use-test-config.html">Using the Test Mode Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../check-health.html">Checking Airflow Health Status</a></li>
<li class="toctree-l2"><a class="reference internal" href="../define_extra_link.html">Define an operator extra link</a></li>
<li class="toctree-l2"><a class="reference internal" href="../email-config.html">Email Configuration</a></li>
<li class="toctree-l2"><a class="reference internal" href="../tracking-user-activity.html">Tracking User Activity</a></li>
<li class="toctree-l2"><a class="reference internal" href="../cli-completion.html">Using the Command Line Interface</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../../ui.html">UI / Screenshots</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../concepts.html">Concepts</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../profiling.html">Data Profiling</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../cli.html">Command Line Interface Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../scheduler.html">Scheduling &amp; Triggers</a></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="../../plugins.html">Plugins</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../security.html">Security</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="../../api.html">REST API Reference</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="../../metrics.html">Metrics</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../errors.html">Error Tracking</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="../../dag-serialization.html">DAG Serialization</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../changelog.html">Changelog</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="../../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../macros.html">Macros reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../privacy_notice.html">Privacy Notice</a></li>
</ul>
<p class="caption"><span class="caption-text">References</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="../../_api/index.html">Python API</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../configurations-ref.html">Configurations</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../../index.html">Airflow</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="../../index.html">Docs</a> &raquo;</li>
<li><a href="../index.html">How-to Guides</a> &raquo;</li>
<li><a href="index.html">Using Operators</a> &raquo;</li>
<li>Cross-DAG Dependencies</li>
<li class="wy-breadcrumbs-aside">
<a href="../../_sources/howto/operator/external.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<blockquote>
<div></div></blockquote>
<div class="section" id="cross-dag-dependencies">
<span id="howto-operator-cross-dag-dependencies"></span><h1>Cross-DAG Dependencies<a class="headerlink" href="#cross-dag-dependencies" title="Permalink to this headline"></a></h1>
<p>When two DAGs have dependency relationships, it is worth considering combining them into a single
DAG, which is usually simpler to understand. Airflow also offers better visual representation of
dependencies for tasks on the same DAG. However, it is sometimes not practical to put all related
tasks on the same DAG. For example:</p>
<ul class="simple">
<li><p>Two DAGs may have different schedules. E.g. a weekly DAG may have tasks that depend on other tasks
on a daily DAG.</p></li>
<li><p>Different teams are responsible for different DAGs, but these DAGs have some cross-DAG
dependencies.</p></li>
<li><p>A task may depend on another task on the same DAG, but for a different <code class="docutils literal notranslate"><span class="pre">execution_date</span></code>.</p></li>
</ul>
<p><code class="docutils literal notranslate"><span class="pre">ExternalTaskSensor</span></code> can be used to establish such dependencies across different DAGs. When it is
used together with <code class="docutils literal notranslate"><span class="pre">ExternalTaskMarker</span></code>, clearing dependent tasks can also happen across different
DAGs.</p>
<div class="section" id="externaltasksensor">
<h2>ExternalTaskSensor<a class="headerlink" href="#externaltasksensor" title="Permalink to this headline"></a></h2>
<p>Use the <a class="reference internal" href="../../_api/airflow/sensors/external_task_sensor/index.html#airflow.sensors.external_task_sensor.ExternalTaskSensor" title="airflow.sensors.external_task_sensor.ExternalTaskSensor"><code class="xref py py-class docutils literal notranslate"><span class="pre">ExternalTaskSensor</span></code></a> to make tasks on a DAG
wait for another task on a different DAG for a specific <code class="docutils literal notranslate"><span class="pre">execution_date</span></code>.</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/example_dags/example_external_task_marker_dag.py</span><a class="example-header-button viewcode-button reference internal" href="../../_modules/airflow/example_dags/example_external_task_marker_dag.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="n">child_task1</span> <span class="o">=</span> <span class="n">ExternalTaskSensor</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;child_task1&quot;</span><span class="p">,</span>
<span class="n">external_dag_id</span><span class="o">=</span><span class="n">parent_dag</span><span class="o">.</span><span class="n">dag_id</span><span class="p">,</span>
<span class="n">external_task_id</span><span class="o">=</span><span class="n">parent_task</span><span class="o">.</span><span class="n">task_id</span><span class="p">,</span>
<span class="n">mode</span><span class="o">=</span><span class="s2">&quot;reschedule&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="externaltaskmarker">
<h2>ExternalTaskMarker<a class="headerlink" href="#externaltaskmarker" title="Permalink to this headline"></a></h2>
<p>If it is desirable that whenever <code class="docutils literal notranslate"><span class="pre">parent_task</span></code> on <code class="docutils literal notranslate"><span class="pre">parent_dag</span></code> is cleared, <code class="docutils literal notranslate"><span class="pre">child_task1</span></code>
on <code class="docutils literal notranslate"><span class="pre">child_dag</span></code> for a specific <code class="docutils literal notranslate"><span class="pre">execution_date</span></code> should also be cleared, <code class="docutils literal notranslate"><span class="pre">ExternalTaskMarker</span></code>
should be used. Note that <code class="docutils literal notranslate"><span class="pre">child_task1</span></code> will only be cleared if “Recursive” is selected when the
user clears <code class="docutils literal notranslate"><span class="pre">parent_task</span></code>.</p>
<div class="example-block-wrapper docutils container">
<p class="example-header example-header--with-button"><span class="example-title">airflow/example_dags/example_external_task_marker_dag.py</span><a class="example-header-button viewcode-button reference internal" href="../../_modules/airflow/example_dags/example_external_task_marker_dag.html"><span>View Source</span></a></p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span> <span class="n">parent_task</span> <span class="o">=</span> <span class="n">ExternalTaskMarker</span><span class="p">(</span><span class="n">task_id</span><span class="o">=</span><span class="s2">&quot;parent_task&quot;</span><span class="p">,</span>
<span class="n">external_dag_id</span><span class="o">=</span><span class="s2">&quot;example_external_task_marker_child&quot;</span><span class="p">,</span>
<span class="n">external_task_id</span><span class="o">=</span><span class="s2">&quot;child_task1&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="../custom-operator.html" class="btn btn-neutral float-right" title="Creating a custom Operator" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="python.html" class="btn btn-neutral float-left" title="PythonOperator" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
<div class="footer">This page uses <a href="https://analytics.google.com/">
Google Analytics</a> to collect statistics. You can disable it by blocking
the JavaScript coming from www.google-analytics.com. Check our
<a href="../../privacy_notice.html">Privacy Policy</a>
for more details.
</div>
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
<!-- Theme Analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-140539454-1', 'auto');
ga('send', 'pageview');
</script>
</body>
</html>