注意:这不是
的重复项我必须从Airflow
DAG
触发远程系统上的某些任务。实现这一目标的简单方法是SSHHook
。
问题在于,远程系统是一个EMR
集群,它本身是在运行时使用EmrCreateJobFlowOperator
创建的(通过上游任务)。因此,虽然我可以掌握已启动的EMR群集(using XCOM
)的job_flow_id
,但我需要将ssh_conn_id
传递给每个下游任务。
看看docs和code,很明显,Airflow会尝试在 db 和< em> environment variables ,因此现在问题归结为能够在运行时设置这两个属性中的任何一个(在 和conn_id
之内)。
这似乎是一个非常普遍的问题,因为如果无法实现,那么operator
的实用程序将受到严重阻碍;但是我还没有碰到任何展示它的例子。
我在
EmrCreateJobFlowOperator
Airflow v1.10
Python 3.6.6
(如果需要可以升级)答案 0 :(得分:3)
执行此操作的方法是在placeholder-loading
之后创建一个Airflow任务,该任务使用BashOperator可能使用aws-cli检索要在其中运行任务的虚拟机的IP地址,并在相同的任务运行aircli,使用该IP地址创建SSH连接。
答案 1 :(得分:2)
是的,您可以在运行时创建连接,即使足够小心也可以在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()
变量时,您只是在说明生成子进程时,您想要将该变量复制到孩子的环境中。这意味着父进程在创建后就无法更改其环境,并且该子进程也无法更改其父环境。
简而言之,只有进程本身在创建后才能更改其环境。并且考虑到工作进程是气流子进程,因此也很难控制其环境的创建。您可以做的是将环境变量写入文件,并在每次任务启动时有意使用该文件的替代内容来更新当前环境。