气流GKEPodOperator xcom_push返回None

时间:2019-10-11 23:44:00

标签: python docker kubernetes airflow apache-airflow-xcom

所以我已经为此苦苦挣扎了几个小时。这是我的操作员的代码:

task1 = GKEPodOperator(
        task_id="task1",
        project_id="proj",
        location="location",
        cluster_name="cluster_name",
        name="cluster-calculator",
        namespace="default",
        image=Variable.get("cluster_calculator_image"),
        arguments=['--name clustercalculator'],
        env_vars=env_vars,
        xcom_push=True,
        is_delete_operator_pod=True,
        get_logs=True,
        dag=dag
    )

吊舱运行一个简单的Docker容器,其中包含Java应用程序,内部执行一些操作并将结果写入默认的 /airflow/xcom/result.json 文件。

这是我尝试获取xcom_push结果的方法:

def print_xcom_result(*op_args, **kwargs):
        print(op_args)
        print(kwargs['task_instance'].xcom_pull(task_ids='task1'))

    test_values = PythonOperator(
        task_id="task1_test",
        python_callable=print_xcom_result,
        provide_context=True,
        op_args=["{{task_instance.xcom_pull(task_ids='task1')}}"],
        dag=dag
    )

无论我尝试什么,它总是不打印任何内容。

[2019-10-12 00:06:23,061] {{logging_mixin.py:95}} INFO - ('None',)
[2019-10-12 00:06:23,072] {{logging_mixin.py:95}} INFO - None

当我在Airflow UI上转到XCOM时,它什么也没显示。 我还从这里尝试了一个示例:Failed to extract xcom from airflow pod - Kubernetes Pod Operator,但也没有用。

肯定创建了sidecar容器,我在日志中看到了它的输出:

Running command... [1mcat /airflow/xcom/return.json[0m
Running command... [1mkill -s SIGINT 1[0m
INFO[0m - {"clusterSize":2}[0m

我什至尝试从外部运行docker容器,验证结果是否正确写入xcom目录,但在DAG执行期间无法获得此结果。

气流版本是最新的。 Python 3.7

如果这很重要,那么我有6个运行Airflow的容器(Web服务器,花卉,工作者,调度程序,postgre,rabbitmq)。芹菜是执行者。 Pod正在Google Cloud的Kubernetes引擎中运行。

没有错误,两个运算符都成功。

有人有什么想法吗?预先谢谢你。

1 个答案:

答案 0 :(得分:0)

气流存在错误,导致GKEPodOperator的执行没有返回语句

protected DataTable ExecuteSelectQuery(string query, params SqlParameter[] sqlParameters)
        {
            SqlCommand command = new SqlCommand();
            DataTable dataTable;
            DataSet dataSet = new DataSet();

            try
            {
                command.Connection = OpenConnection();
                command.CommandText = query;
                command.Parameters.AddRange(sqlParameters);
                command.ExecuteNonQuery();
                adapter.SelectCommand = command;
                adapter.Fill(dataSet);
                dataTable = dataSet.Tables[0];
            }
            catch (SqlException e)
            {
                return null;
                throw new Exception(e.ToString());
            }
            finally
            {
                CloseConnection();
            }
            return dataTable;
        }

应该是

super(GKEPodOperator, self).execute(context)

该错误已在气流2.0(https://issues.apache.org/jira/browse/AIRFLOW-4072)中得到修复

建议创建一个插件YourOwnGKEOperator,以在本地解决此问题。 (并将其部署到您的plugins文件夹中)