Airflow DAG-如何先检查BQ(必要时删除),然后运行数据流作业?

时间:2019-01-09 16:22:03

标签: python google-cloud-platform google-bigquery airflow google-cloud-composer

我正在使用云编写器来协调ETL,以便将GCS中到达BigQuery的文件传输给ETL。我有一个云函数,当文件到达时会触发dag,而云函数会将文件名/位置传递给DAG。在我的DAG中,我有2个任务:

1)使用DataflowPythonOperator运行一个数据流作业,该作业从GCS中的文本读取数据并将其转换并将其输入到BQ中,并且 2) >根据作业是成功还是失败将文件移动到失败/成功存储桶。 每个文件都有一个文件ID,该文件ID是bigquery表中的一列。有时,文件将被编辑一次或两次(通常不是流媒体),而我希望能够首先删除该文件的现有记录。

我调查了其他气流操作员,但希望在运行数据流作业之前在DAG中有2个任务:

  1. 根据文件名获取文件ID (现在我有一个bigquery表映射文件名->文件ID,但我也可以引入一个json作为我猜的映射如果这样更容易)
  2. 如果bigquery表(用于从数据流作业输出转换后的数据的表)中已经存在文件ID,请删除它,然后运行数据流作业,以便获得最新信息。我知道一种选择是仅添加一个时间戳记,并且仅使用最新记录,但是因为每个文件可能有100万条记录,这与我每天要删除100个文件(可能是1-2个顶部)不同看起来可能是混乱和混乱的。

在数据流作业之后,理想情况下,在将文件移动到成功/失败文件夹之前,我想附加到一些“记录”表中,说这是此时输入的游戏。这将是我查看发生的所有插入的方式。 我尝试寻找不同的方法来进行此操作,因为我是Cloud Composer的新手,所以我对10多个小时的研究后如何工作没有明确的想法,否则我会发布代码以供输入。

谢谢,我非常感谢大家的帮助,如果不能如您所愿,我们深表歉意。有关气流的文档非常强大,但是鉴于云作曲家和bigquery相对较新,因此很难深入学习完成一些GCP特定任务。

1 个答案:

答案 0 :(得分:2)

听起来有点复杂。很高兴,几乎所有的GCP服务都有运营商。另一件事是何时触发DAG执行。你知道了吗?您希望在每次有新文件进入该GCS存储桶时触发Google Cloud Function运行。

  1. 触发DAG

要触发DAG,您需要使用依赖于Object FinalizeMetadata Update触发器的Google Cloud Function来调用它。

  1. 将数据加载到BigQuery

如果您的文件已经是GCS,并且已经是JSON或CSV格式,那么使用数据流作业就显得过头了。您可以使用GoogleCloudStorageToBigQueryOperator将文件加载到BQ。

  1. 跟踪文件ID

计算文件ID最好的方法是使用Airflow的Bash或Python运算符。您可以直接从文件名中导出它吗?

如果是这样,则可以在GoogleCloudStorageObjectSensor上游使用Python运算符,以检查文件是否在成功目录中。

如果是,则可以使用BigQueryOperator在BQ上运行删除查询。

然后,您运行GoogleCloudStorageToBigQueryOperator。

  1. 移动文件

如果要将文件从GCS移到GCS位置,则GoogleCloudStorageToGoogleCloudStorageOperator应该可以满足您的需要。如果您的BQ加载运算符失败,则移至失败的文件位置,如果成功,则移至成功的作业位置。

  1. 记录任务日志

也许您只需要跟踪插入内容就是将任务信息记录到GCS。检出how to log task information to GCS

有帮助吗?