Apache AIRFLOW - 如何将参数发送到Python脚本

时间:2018-06-12 07:18:38

标签: python airflow

Admin->Connection我设置Conn Type S3

基本上我在My Python脚本中有这个代码:

if __name__ == '__main__':
    AWS_ACCESS_KEY_ID = "..."
    AWS_SECRET_ACCESS_KEY = "..."
    AWS_DEFAULT_REGION = "..."
    Start_Work

我想要做的是从Airflow调用我的脚本并将连接的参数传递给它(而不是在脚本中硬编码)。

我该怎么做?

编辑: 让我们假设这是连接: https://redis.io/commands/memory-doctor

如何访问每个提交的数据?

2 个答案:

答案 0 :(得分:5)

您可以做的一件事是导入provide_session util,然后根据conn_id检索连接。然后,您可以将其传递给python运算符。

所以它看起来像这样:

from airflow.utils.db import provide_session

@provide_session
def get_conn(conn_id, session=None):
    conn = (session.query(Connection)
                   .filter(Connection.conn_id == conn_id)
                   .first())
    return conn

def my_python_function():

   conn = get_conn('connection_id')

   key_id = conn.extra_dejson.get('AWS_ACCESS_KEY_ID')
   secret_key = conn.extra_dejson.get('AWS_SECRET_ACCESS_KEY')
   default_region = conn.extra_dejson.get('DEFAULT_REGION')

task1 = PythonOperator(task_id='my_task', python_callable=my_python_function, dag=dag)

task1

编辑:从python callable中删除了引号

答案 1 :(得分:1)

我看到您的连接ID为M_1,您的连接类型为S3,因此您可以在PythonOperator(或从BashOperator调用的python脚本)中加载它:

from airflow.hooks.s3_hook import S3Hook

def py_op_callable:
    hook = S3Hook('M_1')
    botocore_credentials = hook.get_credentials()
    botocore_credentials.access_key
    botocore_credentials.secret_key
    botocore_credentials.token

在v1.9.0上似乎get_credentials尚未出现。在S3Hook继承的AwsHook上只有私有_get_credentials()。如果您确定将它们放入额外参数中,直接方法是:

from airflow.hooks.base_hook import BaseHook

def py_op_callable:
    hook = BaseHook('M_1')
    extra = hook.get_connection().extra_dejson
    key_id = extra.get('aws_access_key_id')
    secret_key = extra.get('aws_secret_access_key')
    default_region = extra.get('region_name')
    return key_id,secret_key,default_region