web-dev-qa-db-ja.com

エアフローが正しくスケジュールされていないPython

コード:

Pythonバージョン2.7.xおよびairflowバージョン1.5.1

私のdagスクリプトはこれです

from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta


default_args = {
'owner': 'xyz',
'depends_on_past': False,
'start_date': datetime(2015,10,13),
'email': ['[email protected]'],
'schedule_interval':timedelta(minutes=5),
'email_on_failure': True,
'email_on_retry': True,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG('testing', default_args=default_args)
run_this_first = BashOperator(task_id='Start1',bash_command='date', dag=dag)
for i in range(5):
    t = BashOperator(task_id="Orders1"+str(i), bash_command='sleep 5',dag=dag)
    t.set_upstream(run_this_first)

このことから、6つのタスクでDAGを作成していることがわかります。最初のタスク(Start1)が最初に開始され、その後、他の5つのタスクすべてが開始されます。

現在、DAGの開始の間に5分の時間遅延を与えています

最初のタイプの6つのタスクすべてで完全に実行されましたが、5分後にDAGは再開されません。

1時間以上経ちましたが、DAGは再開されません。私が間違っていたかどうかは本当にわかりません。

誰かが私に何が悪いのか指摘してくれると本当にいいでしょう。私はairflow testing clearを使用してクリアしようとしましたが、同じことが起こりました。最初のインスタンスを実行し、そこに立っていました。

コマンドラインに表示されるのはGetting all instance for DAG testingだけです。

Schedule_intervalの位置を変更すると、スケジュール間隔が並行せずに実行されます。つまり、5分で300以上のタスクインスタンスが完了します。 5分のスケジュール間隔はありません

コード2:

from airflow import DAG
from airflow.operators import BashOperator
from datetime import datetime, timedelta


default_args = {
'owner': 'xyz',
'depends_on_past': False,
'start_date': datetime(2015,10,13),
'email': ['[email protected]'],
'email_on_failure': True,
'email_on_retry': True,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}
dag = DAG('testing',schedule_interval=timedelta(minutes=5),default_args=default_args)#Schedule here
run_this_first = BashOperator(task_id='Start1',bash_command='date', dag=dag)
for i in range(5):
    t = BashOperator(task_id="Orders1"+str(i), bash_command='sleep 5',dag=dag)
    t.set_upstream(run_this_first)
11
The6thSense

コード2の場合、毎分実行される理由は次のとおりです。

  1. 開始時間は2015-10-1300:00です

  2. スケジュール間隔は5分です

  3. スケジューラーのハートビートごと(デフォルトでは5秒)、DAGがチェックされます

    • 最初のチェック:開始日(最後の実行日が見つかりません)+スケジューラー間隔<現在の時刻?はいの場合、DAGが実行され、最後の実行時間が記録されます。 (例:2015-10-13 00:00 + 5分<現在?)
    • 次のハートビートの2回目のチェック:最後の実行時間+スケジューラ間隔<現在の時間?その場合、DAGが再度実行されます。
    • ..。

解決策は、DAGstart_dateをdatetime.now() - schedule_intervalとして設定します。

また、デバッグする場合:

  1. Settings.pyでLOGGINGLEVELをdebugに設定する

  2. _airflow.models.TaskInstance_のクラスメソッドis_queueable()を次のように変更します

_def is_queueable(self, flag_upstream_failed=False):
    logging.debug('Checking whether task instance is queueable or not!')
    if self.execution_date > datetime.now() - self.task.schedule_interval:
        logging.debug('Too early to execute: execution_date {0} + task.schedule_interval {1} > datetime.now() {2}'.format(self.execution_date, self.task.schedule_interval, datetime.now()))
        return False
        ...
_
8
Yongyiw

開始時間(2015-10-13 00:00)が現在の時間よりも短いため、エアフローがトリガーされます バックフィル 。エアフロースケジューラが毎秒検出した(開始日)2015-10-13 00:00から実行されますが、実行日は5分(タスク間隔時間)の間です。

ログ名を参照してください:

$tree airflow/logs/testing/
testing/
|-- Orders10
|   |-- 2015-10-13T00:00:00
|   |-- 2015-10-13T00:05:00
|   -- 2015-10-13T00:10:00
|-- Orders11
|   |-- 2015-10-13T00:00:00
|   |-- 2015-10-13T00:05:00
|   -- 2015-10-13T00:10:00
|-- Orders12
|   |-- 2015-10-13T00:00:00
|   |-- 2015-10-13T00:05:00
|   -- 2015-10-13T00:10:00
|-- Orders13
|   |-- 2015-10-13T00:00:00
|   |-- 2015-10-13T00:05:00
|   -- 2015-10-13T00:10:00
|-- Orders14
|   |-- 2015-10-13T00:00:00
|   |-- 2015-10-13T00:05:00
|   -- 2015-10-13T00:10:00
-- Start1
    |-- 2015-10-13T00:00:00
    |-- 2015-10-13T00:05:00
    |-- 2015-10-13T00:10:00
    -- 2015-10-13T00:15:00

ログの作成時間を参照してください。

$ll airflow/logs/testing/Start1
-rw-rw-r-- 1 admin admin 4192 Nov  9 14:50 2015-10-13T00:00:00
-rw-rw-r-- 1 admin admin 4192 Nov  9 14:50 2015-10-13T00:05:00
-rw-rw-r-- 1 admin admin 4192 Nov  9 14:51 2015-10-13T00:10:00
-rw-rw-r-- 1 admin admin 4192 Nov  9 14:52 2015-10-13T00:15:00

また、WebUIでタスクインスタンスを確認できます。

air flow Task Instances

3
Kaibo Zhou