气流kubernetes执行器:在同一容器上运行2个作业

时间:2019-06-11 15:45:50

标签: kubernetes airflow

我正在使用带有Kubernetes执行器和KubernetesPodOperator的Airflow。我有两个工作:

  • A:从某些来源检索最大100MB的数据
  • B:分析来自A的数据。

为了能够在作业之间共享数据,我想在同一个Pod上运行它们,然后A将数据写入卷,B将读取该卷中的数据。

documentation指出:

  

Kubernetes执行器将为每个任务实例创建一个新的pod。

有什么办法可以做到这一点?如果没有,建议在作业之间传递数据的推荐方法是什么?

4 个答案:

答案 0 :(得分:2)

抱歉,这不可能-每个吊舱只能完成一项工作。

最好使用任务1将数据放在众所周知的位置(例如,在云桶中),然后从第二个任务中获取数据。或者只是将两个任务结合在一起。

答案 1 :(得分:1)

是的,您可以在job内部使用init容器来执行此操作,因此在同一个pod中,在init容器完成其任务之前不会触发该工作

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

这是广告连播的示例,您可以将其应用于同类工作

答案 2 :(得分:1)

您绝对可以使用subdags和SubDag运算符来完成此操作。当您开始子数据发布时,kubernetes执行程序会在子数据层次上创建一个Pod,所有子任务都在该Pod上运行。

似乎没有记录此行为。我们最近在对流程进行故障排除时发现了这一点。

答案 3 :(得分:0)

您可以有2个单独的任务A和B,可以将数据从A传送到B。K8S对此类卷具有开箱即用的支持。 例如。 https://kubernetes.io/docs/concepts/storage/volumes/#awselasticblockstore。 在这里,将由一个容器生成的数据将是持久的,因此当容器被删除时,数据不会丢失。相同的卷可以由另一个容器挂载,并且可以访问数据。