{"id":36730,"date":"2023-06-03T04:04:56","date_gmt":"2023-03-28T02:50:35","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/"},"modified":"2024-04-30T07:06:38","modified_gmt":"2024-04-29T23:06:38","slug":"%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/","title":{"rendered":"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1)"},"content":{"rendered":"<h1>\u69cb\u5efaAirflow\u74b0\u5883<\/h1>\n<h3>\u53c2\u8003Airflow\u7684\u5b98\u65b9\u7f51\u7ad9\uff0c\u4e0b\u8f7ddocker-compose.yaml\u6587\u4ef6\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>curl <span class=\"nt\">-LfO<\/span> <span class=\"s1\">'https:\/\/airflow.apache.org\/docs\/apache-airflow\/2.6.2\/docker-compose.yaml'<\/span>\r\n  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\r\n                                 Dload  Upload   Total   Spent    Left  Speed\r\n100 11632  100 11632    0     0  25841      0 <span class=\"nt\">--<\/span>:--:-- <span class=\"nt\">--<\/span>:--:-- <span class=\"nt\">--<\/span>:--:-- 25848\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528docker compose\u6765\u6784\u5efaAirflow\u73af\u5883\u3002<\/h3>\n<pre class=\"post-pre\"><code> docker-compose up <span class=\"nt\">-d<\/span>\r\nCreating network <span class=\"s2\">\"airflow_default\"<\/span> with the default driver\r\nPulling airflow-init <span class=\"o\">(<\/span>apache\/airflow:2.6.2<span class=\"o\">)<\/span>...\r\n2.6.2: Pulling from apache\/airflow\r\n759700526b78: Pull <span class=\"nb\">complete\r\n<\/span>0167f939c9b5: Pull <span class=\"nb\">complete\r\n<\/span>e460d26209ef: Pull <span class=\"nb\">complete\r\n<\/span>835221e3ec74: Pull <span class=\"nb\">complete\r\n<\/span>116eb26d30a0: Pull <span class=\"nb\">complete\r\n<\/span>5284abf95bb7: Pull <span class=\"nb\">complete\r\n<\/span>bcf24152424e: Pull <span class=\"nb\">complete\r\n<\/span>84a6c4d06a75: Pull <span class=\"nb\">complete\r\n<\/span>28328c623bce: Pull <span class=\"nb\">complete\r\n<\/span>8e39b8606b68: Pull <span class=\"nb\">complete\r\n<\/span>5cd403287497: Pull <span class=\"nb\">complete\r\n<\/span>835c1622ff4b: Pull <span class=\"nb\">complete\r\n<\/span>1b382cb186b7: Pull <span class=\"nb\">complete\r\n<\/span>0ca6778a4ad0: Pull <span class=\"nb\">complete\r\n<\/span>913a51e57913: Pull <span class=\"nb\">complete\r\n<\/span>eea8ac944152: Pull <span class=\"nb\">complete\r\n<\/span>01ff5004b362: Pull <span class=\"nb\">complete\r\n<\/span>0aad50ab46fb: Pull <span class=\"nb\">complete\r\n<\/span>4f4fb700ef54: Pull <span class=\"nb\">complete\r\n<\/span>Digest: sha256:7dbd78fc92b15c92edc222a2fc5096ac22acd46f0e5f2e1ac9de55ada671ef93\r\nStatus: Downloaded newer image <span class=\"k\">for <\/span>apache\/airflow:2.6.2\r\nCreating airflow_redis_1    ... <span class=\"k\">done\r\n<\/span>Creating airflow_postgres_1 ... <span class=\"k\">done\r\n<\/span>Creating airflow_airflow-init_1 ... <span class=\"k\">done\r\n<\/span>Creating airflow_airflow-scheduler_1 ... <span class=\"k\">done\r\n<\/span>Creating airflow_airflow-triggerer_1 ... <span class=\"k\">done\r\n<\/span>Creating airflow_airflow-webserver_1 ... <span class=\"k\">done\r\n<\/span>Creating airflow_airflow-worker_1    ... <span class=\"k\">done<\/span>\r\n<span class=\"nv\">$ <\/span>docker ps\r\nCONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS                   PORTS\r\n                            NAMES\r\nac67b37461ee   apache\/airflow:2.6.2   <span class=\"s2\">\"\/usr\/bin\/dumb-init \u2026\"<\/span>   5 minutes ago   Up 5 minutes <span class=\"o\">(<\/span>healthy<span class=\"o\">)<\/span>   8080\/tcp                                    airflow_airflow-worker_1\r\ndfaeb9997132   apache\/airflow:2.6.2   <span class=\"s2\">\"\/usr\/bin\/dumb-init \u2026\"<\/span>   5 minutes ago   Up 5 minutes <span class=\"o\">(<\/span>healthy<span class=\"o\">)<\/span>   0.0.0.0:8080-&gt;8080\/tcp, :::8080-&gt;8080\/tcp   airflow_airflow-webserver_1\r\nef3ec278ebc5   apache\/airflow:2.6.2   <span class=\"s2\">\"\/usr\/bin\/dumb-init \u2026\"<\/span>   5 minutes ago   Up 5 minutes <span class=\"o\">(<\/span>healthy<span class=\"o\">)<\/span>   8080\/tcp                                    airflow_airflow-triggerer_1\r\n4399d4d2f373   apache\/airflow:2.6.2   <span class=\"s2\">\"\/usr\/bin\/dumb-init \u2026\"<\/span>   5 minutes ago   Up 5 minutes <span class=\"o\">(<\/span>healthy<span class=\"o\">)<\/span>   8080\/tcp                                    airflow_airflow-scheduler_1\r\n1457368877ce   redis:latest           <span class=\"s2\">\"docker-entrypoint.s\u2026\"<\/span>   5 minutes ago   Up 5 minutes <span class=\"o\">(<\/span>healthy<span class=\"o\">)<\/span>   6379\/tcp                                    airflow_redis_1\r\n<\/code><\/pre>\n<h3>\u5728\u6d4f\u89c8\u5668\u4e2d\u8bbf\u95eeairflow-webserver\u3002<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/6-1.png\" alt=\"image.png\" \/><\/div>\n<h1>DAG \u7684\u8bd5\u9a8c\u6267\u884c<\/h1>\n<h3>\u786e\u8ba4\u6559\u7a0b\u7684DAG<\/h3>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/9-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u70b9\u51fbDAG\u8be6\u7ec6\u9875\u9762\u4e0a\u65b9\u7684\u94fe\u63a5\uff0c\u6253\u5f00[&lt;&gt; Code]\uff0c\u4ee5\u67e5\u770bDAG\u7684\u4ee3\u7801\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/11-0.png\" alt=\"image.png\" \/><\/div>\n<pre class=\"post-pre\"><code><span class=\"c1\">#\r\n# Licensed to the Apache Software Foundation (ASF) under one\r\n# or more contributor license agreements.  See the NOTICE file\r\n# distributed with this work for additional information\r\n# regarding copyright ownership.  The ASF licenses this file\r\n# to you under the Apache License, Version 2.0 (the\r\n# \"License\"); you may not use this file except in compliance\r\n# with the License.  You may obtain a copy of the License at\r\n#\r\n#   http:\/\/www.apache.org\/licenses\/LICENSE-2.0\r\n#\r\n# Unless required by applicable law or agreed to in writing,\r\n# software distributed under the License is distributed on an\r\n# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n# KIND, either express or implied.  See the License for the\r\n# specific language governing permissions and limitations\r\n# under the License.\r\n<\/span><span class=\"sh\">\"\"\"<\/span><span class=\"s\">\r\n### Tutorial Documentation\r\nDocumentation that goes along with the Airflow tutorial located\r\n[here](https:\/\/airflow.apache.org\/tutorial.html)\r\n<\/span><span class=\"sh\">\"\"\"<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">__future__<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">annotations<\/span>\r\n\r\n<span class=\"c1\"># [START tutorial]\r\n# [START import_module]\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"n\">datetime<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">datetime<\/span><span class=\"p\">,<\/span> <span class=\"n\">timedelta<\/span>\r\n<span class=\"kn\">from<\/span> <span class=\"n\">textwrap<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">dedent<\/span>\r\n\r\n<span class=\"c1\"># The DAG object; we'll need this to instantiate a DAG\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"n\">airflow<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">DAG<\/span>\r\n\r\n<span class=\"c1\"># Operators; we need this to operate!\r\n<\/span><span class=\"kn\">from<\/span> <span class=\"n\">airflow.operators.bash<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">BashOperator<\/span>\r\n\r\n<span class=\"c1\"># [END import_module]\r\n<\/span>\r\n\r\n<span class=\"c1\"># [START instantiate_dag]\r\n<\/span><span class=\"k\">with<\/span> <span class=\"nc\">DAG<\/span><span class=\"p\">(<\/span>\r\n    <span class=\"sh\">\"<\/span><span class=\"s\">tutorial<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"c1\"># [START default_args]\r\n<\/span>    <span class=\"c1\"># These args will get passed on to each operator\r\n<\/span>    <span class=\"c1\"># You can override them on a per-task basis during operator initialization\r\n<\/span>    <span class=\"n\">default_args<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">depends_on_past<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">email<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">airflow@example.com<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">email_on_failure<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">email_on_retry<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">retries<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"sh\">\"<\/span><span class=\"s\">retry_delay<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"nf\">timedelta<\/span><span class=\"p\">(<\/span><span class=\"n\">minutes<\/span><span class=\"o\">=<\/span><span class=\"mi\">5<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"c1\"># 'queue': 'bash_queue',\r\n<\/span>        <span class=\"c1\"># 'pool': 'backfill',\r\n<\/span>        <span class=\"c1\"># 'priority_weight': 10,\r\n<\/span>        <span class=\"c1\"># 'end_date': datetime(2016, 1, 1),\r\n<\/span>        <span class=\"c1\"># 'wait_for_downstream': False,\r\n<\/span>        <span class=\"c1\"># 'sla': timedelta(hours=2),\r\n<\/span>        <span class=\"c1\"># 'execution_timeout': timedelta(seconds=300),\r\n<\/span>        <span class=\"c1\"># 'on_failure_callback': some_function, # or list of functions\r\n<\/span>        <span class=\"c1\"># 'on_success_callback': some_other_function, # or list of functions\r\n<\/span>        <span class=\"c1\"># 'on_retry_callback': another_function, # or list of functions\r\n<\/span>        <span class=\"c1\"># 'sla_miss_callback': yet_another_function, # or list of functions\r\n<\/span>        <span class=\"c1\"># 'trigger_rule': 'all_success'\r\n<\/span>    <span class=\"p\">},<\/span>\r\n    <span class=\"c1\"># [END default_args]\r\n<\/span>    <span class=\"n\">description<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">A simple tutorial DAG<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">schedule<\/span><span class=\"o\">=<\/span><span class=\"nf\">timedelta<\/span><span class=\"p\">(<\/span><span class=\"n\">days<\/span><span class=\"o\">=<\/span><span class=\"mi\">1<\/span><span class=\"p\">),<\/span>\r\n    <span class=\"n\">start_date<\/span><span class=\"o\">=<\/span><span class=\"nf\">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>\r\n    <span class=\"n\">catchup<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"n\">tags<\/span><span class=\"o\">=<\/span><span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">example<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>\r\n<span class=\"p\">)<\/span> <span class=\"k\">as<\/span> <span class=\"n\">dag<\/span><span class=\"p\">:<\/span>\r\n    <span class=\"c1\"># [END instantiate_dag]\r\n<\/span>\r\n    <span class=\"c1\"># t1, t2 and t3 are examples of tasks created by instantiating operators\r\n<\/span>    <span class=\"c1\"># [START basic_task]\r\n<\/span>    <span class=\"n\">t1<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">BashOperator<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">task_id<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">print_date<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">bash_command<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">date<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">)<\/span>\r\n\r\n    <span class=\"n\">t2<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">BashOperator<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">task_id<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">sleep<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">depends_on_past<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">bash_command<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">sleep 5<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">retries<\/span><span class=\"o\">=<\/span><span class=\"mi\">3<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">)<\/span>\r\n    <span class=\"c1\"># [END basic_task]\r\n<\/span>\r\n    <span class=\"c1\"># [START documentation]\r\n<\/span>    <span class=\"n\">t1<\/span><span class=\"p\">.<\/span><span class=\"n\">doc_md<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">dedent<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"sh\">\"\"\"<\/span><span class=\"se\">\\\r\n<\/span><span class=\"s\">    #### Task Documentation\r\n    You can document your task using the attributes `doc_md` (markdown),\r\n    `doc` (plain text), `doc_rst`, `doc_json`, `doc_yaml` which gets\r\n    rendered in the UI<\/span><span class=\"sh\">'<\/span><span class=\"s\">s Task Instance Details page.\r\n    ![img](http:\/\/montcs.bloomu.edu\/~bobmon\/Semesters\/2012-01\/491\/import%20soul.png)\r\n    **Image Credit:** Randall Munroe, [XKCD](https:\/\/xkcd.com\/license.html)\r\n    <\/span><span class=\"sh\">\"\"\"<\/span>\r\n    <span class=\"p\">)<\/span>\r\n\r\n    <span class=\"n\">dag<\/span><span class=\"p\">.<\/span><span class=\"n\">doc_md<\/span> <span class=\"o\">=<\/span> <span class=\"n\">__doc__<\/span>  <span class=\"c1\"># providing that you have a docstring at the beginning of the DAG; OR\r\n<\/span>    <span class=\"n\">dag<\/span><span class=\"p\">.<\/span><span class=\"n\">doc_md<\/span> <span class=\"o\">=<\/span> <span class=\"sh\">\"\"\"<\/span><span class=\"s\">\r\n    This is a documentation placed anywhere\r\n    <\/span><span class=\"sh\">\"\"\"<\/span>  <span class=\"c1\"># otherwise, type it like this\r\n<\/span>    <span class=\"c1\"># [END documentation]\r\n<\/span>\r\n    <span class=\"c1\"># [START jinja_template]\r\n<\/span>    <span class=\"n\">templated_command<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">dedent<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"sh\">\"\"\"<\/span><span class=\"s\">\r\n    {% for i in range(5) %}\r\n        echo <\/span><span class=\"sh\">\"<\/span><span class=\"s\">{{ ds }}<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\r\n        echo <\/span><span class=\"sh\">\"<\/span><span class=\"s\">{{ macros.ds_add(ds, 7)}}<\/span><span class=\"sh\">\"<\/span><span class=\"s\">\r\n    {% endfor %}\r\n    <\/span><span class=\"sh\">\"\"\"<\/span>\r\n    <span class=\"p\">)<\/span>\r\n\r\n    <span class=\"n\">t3<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">BashOperator<\/span><span class=\"p\">(<\/span>\r\n        <span class=\"n\">task_id<\/span><span class=\"o\">=<\/span><span class=\"sh\">\"<\/span><span class=\"s\">templated<\/span><span class=\"sh\">\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">depends_on_past<\/span><span class=\"o\">=<\/span><span class=\"bp\">False<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">bash_command<\/span><span class=\"o\">=<\/span><span class=\"n\">templated_command<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">)<\/span>\r\n    <span class=\"c1\"># [END jinja_template]\r\n<\/span>\r\n    <span class=\"n\">t1<\/span> <span class=\"o\">&gt;&gt;<\/span> <span class=\"p\">[<\/span><span class=\"n\">t2<\/span><span class=\"p\">,<\/span> <span class=\"n\">t3<\/span><span class=\"p\">]<\/span>\r\n<span class=\"c1\"># [END tutorial]\r\n<\/span><\/code><\/pre>\n<p>\u5728\u6559\u7a0b\u4e2d\uff0c\u6709t1\uff0ct2\u548ct3\u4e09\u4e2a\u4efb\u52a1\uff0c\u5e76\u4e14\u6267\u884c\u987a\u5e8f\u662f\u5148\u6267\u884ct1\uff0c\u7136\u540e\u5e76\u884c\u6267\u884ct2\u548ct3\u3002<\/p>\n<div>\n<div class=\"post-table\">\u30bf\u30b9\u30aftask_id\u4e3b\u306a\u51e6\u7406\u5185\u5bb9t1print_datebash \u306e date \u30b3\u30de\u30f3\u30c9\u5b9f\u884c\u3057\u3066\u73fe\u5728\u65e5\u6642\u3092\u6a19\u6e96\u51fa\u529bt2sleepbash \u306e sleep \u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066 5 \u79d2\u30b9\u30ea\u30fc\u30d7t3templatedjinja \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u65e5\u4ed8\u5909\u6570[ds]\u3092\u6a19\u6e96\u51fa\u529b\u5f8c\u3001Airflow\u30de\u30af\u30ed\u3092\u4f7f\u3063\u3066\u65e5\u4ed8\u306b7\u65e5\u52a0\u7b97\u3057\u3066\u6a19\u6e96\u51fa\u529b\u3059\u308b\u51e6\u7406\u3092\u3001\u30eb\u30fc\u30d7\u30675\u56de\u5b9f\u884c<\/div>\n<\/div>\n<h3>\u6267\u884c\u6559\u7a0b\u7684DAG\u3002<\/h3>\n<p>\u5728DAG\u7684\u8be6\u7ec6\u9875\u9762\u4e0a\u5c06\u5f00\u5173\u7f6e\u4e8eON\u72b6\u6001\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/17-0.png\" alt=\"image.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/18-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u68c0\u67e5DAG\u7684\u6267\u884c\u7ed3\u679c\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/20-0.png\" alt=\"image.png\" \/><\/div>\n<h4>\u6253\u5370\u65e5\u671f\u4efb\u52a1\u7684\u786e\u8ba4<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/22-0.png\" alt=\"image.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/23-0.png\" alt=\"image.png\" \/><\/div>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/24-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u4f7f\u7528 `date` \u547d\u4ee4\u53ef\u4ee5\u8f93\u51fa\u5f53\u524d\u7684\u65e5\u671f\u548c\u65f6\u95f4\u3002<\/p>\n<pre class=\"post-pre\"><code>[2023-06-24, 21:04:20 JST] {subprocess.py:75} INFO - Running command: ['\/bin\/bash', '-c', 'date']\r\n[2023-06-24, 21:04:20 JST] {subprocess.py:86} INFO - Output:\r\n[2023-06-24, 21:04:20 JST] {subprocess.py:93} INFO - Sat Jun 24 12:04:20 UTC 2023\r\n[2023-06-24, 21:04:20 JST] {subprocess.py:97} INFO - Command exited with return code 0\r\n<\/code><\/pre>\n<h4>\u786e\u8ba4\u7761\u7720\u4efb\u52a1<\/h4>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/28-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u4ece\u65e5\u5fd7\u7684\u6267\u884c\u65e5\u671f\u65f6\u95f4\u53ef\u4ee5\u770b\u51fa\uff0c\u5df2\u7ecf\u4f11\u7720\u4e865\u79d2\u949f\u3002<\/p>\n<pre class=\"post-pre\"><code>[2023-06-24, 21:04:22 JST] {subprocess.py:75} INFO - Running command: ['\/bin\/bash', '-c', 'sleep 5']\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:86} INFO - Output:\r\n[2023-06-24, 21:04:27 JST] {subprocess.py:97} INFO - Command exited with return code 0\r\n<\/code><\/pre>\n<h4>\u6a21\u677f\u4efb\u52a1\u7684\u786e\u8ba4<\/h4>\n<p>\u540c\u6837\u5730\uff0c\u68c0\u67e5\u6a21\u677f\u5316\u4efb\u52a1\u7684\u6267\u884c\u65e5\u5fd7\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/33-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u80fd\u591f\u660e\u786e\u5730\u770b\u5230\u73b0\u5728\u65e5\u671f\u548c\u5f53\u524d\u65e5\u671f\u52a07\u5929\u91cd\u590d\u8f93\u51fa\u4e865\u6b21\u3002<\/p>\n<pre class=\"post-pre\"><code>[2023-06-24, 21:04:22 JST] {subprocess.py:75} INFO - Running command: ['\/bin\/bash', '-c', '\\n\\n    echo \"2023-06-23\"\\n    echo \"2023-06-30\"\\n\\n    echo \"2023-06-23\"\\n    echo \"2023-06-30\"\\n\\n    echo \"2023-06-23\"\\n    echo \"2023-06-30\"\\n\\n    echo \"2023-06-23\"\\n    echo \"2023-06-30\"\\n\\n    echo \"2023-06-23\"\\n    echo \"2023-06-30\"\\n']\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:86} INFO - Output:\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-23\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-30\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-23\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-30\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-23\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-30\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-23\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-30\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-23\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:93} INFO - 2023-06-30\r\n[2023-06-24, 21:04:22 JST] {subprocess.py:97} INFO - Command exited with return code 0\r\n<\/code><\/pre>\n<h2>\u901a\u8fc7\u4f7f\u7528REST API\u6267\u884cDAG\u3002<\/h2>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ ENDPOINT_URL<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"http:\/\/localhost:8080\/\"<\/span>\r\n<span class=\"nv\">$ <\/span>curl <span class=\"nt\">-X<\/span> POST <span class=\"nt\">--user<\/span> <span class=\"s2\">\"airflow:airflow\"<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nv\">ENDPOINT_URL<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/api\/v1\/dags\/tutorial\/dagRuns\"<\/span> <span class=\"se\">\\<\/span>\r\n <span class=\"nt\">-H<\/span> <span class=\"s2\">\"Content-Type: application\/json\"<\/span> <span class=\"nt\">-d<\/span> <span class=\"s1\">'{\"conf\": {},  \"dag_run_id\": \"string\",  \"logical_date\": \"2023-06-25T02:10:14.275Z\",  \"note\": \"string\"}'<\/span>\r\n\r\n<span class=\"o\">{<\/span>\r\n  <span class=\"s2\">\"conf\"<\/span>: <span class=\"o\">{}<\/span>,\r\n  <span class=\"s2\">\"dag_id\"<\/span>: <span class=\"s2\">\"tutorial\"<\/span>,\r\n  <span class=\"s2\">\"dag_run_id\"<\/span>: <span class=\"s2\">\"string\"<\/span>,\r\n  <span class=\"s2\">\"data_interval_end\"<\/span>: <span class=\"s2\">\"2023-06-25T02:10:14.275000+00:00\"<\/span>,\r\n  <span class=\"s2\">\"data_interval_start\"<\/span>: <span class=\"s2\">\"2023-06-24T02:10:14.275000+00:00\"<\/span>,\r\n  <span class=\"s2\">\"end_date\"<\/span>: null,\r\n  <span class=\"s2\">\"execution_date\"<\/span>: <span class=\"s2\">\"2023-06-25T02:10:14.275000+00:00\"<\/span>,\r\n  <span class=\"s2\">\"external_trigger\"<\/span>: <span class=\"nb\">true<\/span>,\r\n  <span class=\"s2\">\"last_scheduling_decision\"<\/span>: null,\r\n  <span class=\"s2\">\"logical_date\"<\/span>: <span class=\"s2\">\"2023-06-25T02:10:14.275000+00:00\"<\/span>,\r\n  <span class=\"s2\">\"note\"<\/span>: <span class=\"s2\">\"string\"<\/span>,\r\n  <span class=\"s2\">\"run_type\"<\/span>: <span class=\"s2\">\"manual\"<\/span>,\r\n  <span class=\"s2\">\"start_date\"<\/span>: null,\r\n  <span class=\"s2\">\"state\"<\/span>: <span class=\"s2\">\"queued\"<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/38-0.png\" alt=\"image.png\" \/><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u69cb\u5efaAirflow\u74b0\u5883 \u53c2\u8003Airflow\u7684\u5b98\u65b9\u7f51\u7ad9\uff0c\u4e0b\u8f7ddocker-compose.yaml\u6587\u4ef6\u3002 $ c [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-36730","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1) - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u901a\u8fc7apache-airflow\u521b\u5efa\u5de5\u4f5c\u6d411\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1)\" \/>\n<meta property=\"og:description\" content=\"\u69cb\u5efaAirflow\u74b0\u5883 \u53c2\u8003Airflow\u7684\u5b98\u65b9\u7f51\u7ad9\uff0c\u4e0b\u8f7ddocker-compose.yaml\u6587\u4ef6\u3002 $ c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u901a\u8fc7apache-airflow\u521b\u5efa\u5de5\u4f5c\u6d411\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-03-28T02:50:35+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T23:06:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/6-1.png\" \/>\n<meta name=\"author\" content=\"\u6587, \u7fd4\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6587, \u7fd4\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/\",\"name\":\"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1) - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-03-28T02:50:35+00:00\",\"dateModified\":\"2024-04-29T23:06:38+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\",\"name\":\"\u6587, \u7fd4\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"caption\":\"\u6587, \u7fd4\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1) - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u901a\u8fc7apache-airflow\u521b\u5efa\u5de5\u4f5c\u6d411\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1)","og_description":"\u69cb\u5efaAirflow\u74b0\u5883 \u53c2\u8003Airflow\u7684\u5b98\u65b9\u7f51\u7ad9\uff0c\u4e0b\u8f7ddocker-compose.yaml\u6587\u4ef6\u3002 $ c [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u901a\u8fc7apache-airflow\u521b\u5efa\u5de5\u4f5c\u6d411\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-03-28T02:50:35+00:00","article_modified_time":"2024-04-29T23:06:38+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d2aae37434c4406c48195\/6-1.png"}],"author":"\u6587, \u7fd4","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6587, \u7fd4","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"6 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/","name":"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1) - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-03-28T02:50:35+00:00","dateModified":"2024-04-29T23:06:38+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u901a\u8fc7Apache Airflow\u521b\u5efa\u5de5\u4f5c\u6d41(1)"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c","name":"\u6587, \u7fd4","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","caption":"\u6587, \u7fd4"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e9%80%9a%e8%bf%87apache-airflow%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%811%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/36730","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=36730"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/36730\/revisions"}],"predecessor-version":[{"id":90435,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/36730\/revisions\/90435"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=36730"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=36730"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=36730"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}