在运行时在Airflow操作员中创建和使用连接

时间:2018-12-12 10:23:58

标签: airflow

注意:这不是

的重复项

我必须从Airflow DAG触发远程系统上的某些任务。实现这一目标的简单方法是SSHHook

问题在于,远程系统是一个EMR集群,它本身是在运行时使用EmrCreateJobFlowOperator创建的(通过上游任务)。因此,虽然我可以掌握已启动的EMR群集(using XCOM)的job_flow_id,但我需要将ssh_conn_id传递给每个下游任务。


看看docscode,很明显,Airflow会尝试在 db 和< em> environment variables ,因此现在问题归结为能够在运行时设置这两个属性中的任何一个(在 conn_id之内)。

这似乎是一个非常普遍的问题,因为如果无法实现,那么operator的实用程序将受到严重阻碍;但是我还没有碰到任何展示它的例子。


  • 是否可以从Airflow操作员内部创建(并销毁)其中一个?
    1. Connection(位于Airflow的数据库中)
    2. 环境变量(应向所有下游任务访问,而不仅仅是here所说的当前任务)
  • 如果没有,我有什么选择?

我在

  • EmrCreateJobFlowOperator
  • Airflow v1.10
  • Python 3.6.6(如果需要可以升级)

2 个答案:

答案 0 :(得分:3)

执行此操作的方法是在placeholder-loading之后创建一个Airflow任务,该任务使用BashOperator可能使用aws-cli检索要在其中运行任务的虚拟机的IP地址,并在相同的任务运行aircli,使用该IP地址创建SSH连接。

答案 1 :(得分:2)

连接来自ORM

是的,您可以在运行时创建连接,即使足够小心也可以在DAG创建时创建连接。 Airflow在其内部模型上是完全透明的,因此您可以直接与基础SqlAlchemy进行交互。正如this answer中最初举例说明的那样,它很简单:

v1 <- as.numeric(gsub('\\D+', '', gsub(',.*', '', df$playerValue)))
v1[!grepl('Mill', df$playerValue)] <- v1[!grepl('Mill', df$playerValue)] / 1000
v1
#[1] 10.0  0.5

您当然可以在这里与EMR连接可能需要的其他任何其他连接属性进行交互。

环境受流程限制

这不是Airflow或Python的限制,但是(每个主要OS的AFAIK)环境都与进程的生命周期息息相关。例如,当您用bash from airflow.models import Connection from airflow import settings def create_conn(username, password, host=None): new_conn = Connection(conn_id=f'{username}_connection', login=username, host=host if host else None) new_conn.set_password(password) session = settings.Session() session.add(new_conn) session.commit() 变量时,您只是在说明生成子进程时,您想要将该变量复制到孩子的环境中。这意味着父进程在创建后就无法更改其环境,并且该子进程也无法更改其父环境。

简而言之,只有进程本身在创建后才能更改其环境。并且考虑到工作进程是气流子进程,因此也很难控制其环境的创建。您可以做的是将环境变量写入文件,并在每次任务启动时有意使用该文件的替代内容来更新当前环境。