我使用Celery Executor有多个dag,但我想使用Kubernetes Executor运行一个特定的dag。我无法推断出实现此目标的好方法。
我有一个airflow.cfg
,其中已经声明要使用CeleryExecutor
。而且我不想更改它,因为除了一个以外,所有其他控件确实需要它。
# The executor class that airflow should use. Choices include
# SequentialExecutor, LocalExecutor, CeleryExecutor
executor = CeleryExecutor
我的验证码:
from datetime import datetime, timedelta
from airflow import DAG
from airflow.contrib.operators.kubernetes_pod_operator import \
KubernetesPodOperator
from airflow.operators.dummy_operator import DummyOperator
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime.utcnow(),
'email': ['airflow@example.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5)
}
dag = DAG(
'kubernetes_sample_1', default_args=default_args)
start = DummyOperator(task_id='run_this_first', dag=dag)
passing = KubernetesPodOperator(namespace='default',
image="Python:3.6",
cmds=["Python", "-c"],
arguments=["print('hello world')"],
labels={"foo": "bar"},
name="passing-test",
task_id="passing-task",
get_logs=True,
dag=dag
)
failing = KubernetesPodOperator(namespace='default',
image="ubuntu:1604",
cmds=["Python", "-c"],
arguments=["print('hello world')"],
labels={"foo": "bar"},
name="fail",
task_id="failing-task",
get_logs=True,
dag=dag
)
passing.set_upstream(start)
failing.set_upstream(start)
我可以设置if-else条件,然后从Airflow选择配置的位置更改该值。如果听起来不错,请告诉我路径和文件。尽管我希望获得一种更成熟的方法,但如果存在的话。
答案 0 :(得分:1)
现在有了 CeleryKubernetesExecutor(看不出它是什么时候引入的),它需要设置 Celery 和 Kubernetes,但也提供两者的功能。
在官方文档中,他们提供了一个经验法则来决定何时值得使用它:
<块引用>我们建议您在使用时考虑 CeleryKubernetesExecutor 案例满足:
高峰期需要调度的任务数超过 Kubernetes 集群可以轻松处理的规模
您的任务中相对较小的一部分需要运行时隔离。
你有很多可以在 Celery Worker 上执行的小任务 但你也有资源匮乏的任务,可以更好地运行 预定义的环境。
答案 1 :(得分:0)
我认为不可能同时使用两个执行器。但是,您只能使用CeleryExecutor,但可以使用KubernetesPodOperator声明资源密集型任务,解决问题的作业由CeleryExecutor安排/监视,并由Kubernetes运行以获取任务中的实际处理逻辑。