Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Airflow 气流-分别运行每个python函数_Airflow_Airflow Scheduler - Fatal编程技术网

Airflow 气流-分别运行每个python函数

Airflow 气流-分别运行每个python函数,airflow,airflow-scheduler,Airflow,Airflow Scheduler,我有一个脚本,它将所有python脚本作为一个函数运行。我想让每个python函数单独运行,这样我就可以跟踪每个函数及其状态 ## Third party Library Imports import psycopg2 import airflow from airflow import DAG from airflow.operators.python_operator import PythonOperator #from airflow.operators.bash_operator i

我有一个脚本,它将所有python脚本作为一个函数运行。我想让每个python函数单独运行,这样我就可以跟踪每个函数及其状态

## Third party Library Imports

import psycopg2
import airflow
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
#from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from sqlalchemy import create_engine
import io


# Following are defaults which can be overridden later on
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 1, 23, 12),
'email': ['airflow@airflow.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}

dag = DAG('sample_dag', default_args=default_args, catchup=False, schedule_interval="@once")


#######################
## Login to DB


def db_log():
    global db_con
    try:
    db_con = psycopg2.connect(
    " dbname = 'name' user = 'user' password = 'pass' host = 'host' port = 'port' sslmode = 'require' ")
    except:
        print("Connection Failed.")
        print('Connected successfully')
    return (db_con)

def insert_data():
    cur = db_con.cursor()
    cur.execute("""insert into tbl_1 select id,bill_no,status from tbl_2 limit 2;""")


def job_run():
    db_log()
    insert_data()



##########################################

t1 = PythonOperator(
    task_id='DB_Connect',
    python_callable=job_run,
    # bash_command='python3 ~/airflow/dags/sample.py',
    dag=dag)

t1
上面的脚本工作得很好,但希望按函数拆分此脚本,以便更好地跟踪。有人能帮忙吗。Tnx

更新代码版本2:

## Third party Library Imports

import psycopg2
import airflow
from airflow import DAG
from airflow.operators.python_operator import PythonOperator
#from airflow.operators.bash_operator import BashOperator
from datetime import datetime, timedelta
from sqlalchemy import create_engine
import io


# Following are defaults which can be overridden later on
default_args = {
'owner': 'airflow',
'depends_on_past': False,
'start_date': datetime(2018, 1, 23, 12),
'email': ['airflow@airflow.com'],
'email_on_failure': False,
'email_on_retry': False,
'retries': 1,
'retry_delay': timedelta(minutes=5),
}

dag = DAG('sample_dag', default_args=default_args, catchup=False, schedule_interval="@once")


#######################
## Login to DB


def db_log(**kwargs):
    global db_con
    try:
    db_con = psycopg2.connect(
    " dbname = 'name' user = 'user' password = 'pass' host = 'host' port = 'port' sslmode = 'require' ")
    except:
        print("Connection Failed.")
        print('Connected successfully')
        task_instance = kwargs['task_instance']
        task_instance.xcom_push(value="db_con", key="db_log")
        return (db_con)

def insert_data(**kwargs):
    v1 = task_instance.xcom_pull(key="db_con", task_ids='db_log')
    return (v1)
    cur = db_con.cursor()
    cur.execute("""insert into tbl_1 select id,bill_no,status from tbl_2 limit 2;""")

#def job_run():
#    db_log()
#    insert_data()


##########################################

t1 = PythonOperator(
    task_id='Connect',
    python_callable=db_log,provide_context=True,
    dag=dag)

t2 = PythonOperator(
    task_id='Query',
    python_callable=insert_data,provide_context=True,
    dag=dag)


t1 >> t2

有两种可能的解决方案:

A为每个函数创建多个任务

气流中的任务将在单独的进程中调用。定义为全局的变量将不起作用,因为第二个任务通常无法查看第一个任务的变量

简介:XCOM。这是气流的一个特征,我们已经回答了一些问题,例如,这里有一些例子:

编辑

您必须提供上下文,并按照示例中的说明传递上下文。例如,这意味着:

将provide_context=True添加到PythonOperator 将作业运行的签名更改为def作业运行**kwargs: 将kwargs传递给函数中带有data\u warehouse\u loginkwargs的data\u warehouse\u login 创建一个完整的函数

在这个场景中,我仍然会删除全局just call insert_data,从内部调用data_warehouse_login,返回连接并只使用一个任务


如果发生错误,则引发异常。气流将处理这些刚刚好。只需确保在异常中放入适当的消息,并使用最佳异常类型。

@tobi6,在更新代码的最后一行的第二行bash_命令语法中获取错误。你能告诉我哪里出了问题吗。Tnx.@tobi6错误消息是bash\u command='python3~/aiffair/dags/sample.py{{task\u instance.xcom\u pulltask\u id='job\u run',key='dwh\u connection'}',dag=dag,^SyntaxError:无效语法如何修复此问题。你能给我一些建议吗。。Tnx@tobi6,我认为我们需要以相同的方式传递insert_数据,因此以这种方式使用它。对于bash操作符,我不确定如何将登录详细信息传递给脚本中的多个函数引用的datawarehouse\u login。你能给我一些建议吗。Tnx..@tobi6,谢谢,我正在尝试将这些点关联到一个工作脚本中。我的问题是,我们需要使用bash_命令来正确传递task_instance.xcom_pull命令。此外,如果工作有不同的子功能,我们如何跟踪每个功能。因为据我所知,bash操作符在上面的代码中只调用了一次。请你澄清一下上述情况。再次,请问一个新问题,为什么会出现这个错误。我已经看到了问题的症结所在,但如果你的问题不断演变,并且有很多很多评论,通常是那些非正式的评论会被评论人删除,这对其他人来说是没有帮助的