为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Cloud Functions 运行 Dataform 工作流?

除了SQL开发,Dataform也是一个编排工具。它允许我们通过调度工作流的执行来运行数据管道任务。但是如果我们需要从其他Google Cloud服务触发工作流,我们该怎么办?

照片由 WaldemarUnsplash 拍摄

这篇文章将讨论如何从Cloud Functions启动Dataform工作流的执行过程。这种情况下什么时候会有帮助呢?例如,如果一个数据管道利用Cloud Functions来处理Google Cloud Storage中新增加的文件,并且我们还需要在Dataform中进一步处理这些数据。

本文假设读者熟悉Cloud Functions和基本的Dataform概念[1],并知道如何创建一个Dataform仓库,配置开发环境,开发操作,以及创建和编译发布配置。

Dataform 代码周期[2]包括几个步骤来执行工作流,在我们将动作的代码创建并保存到 GitHub 之后。

  1. 根据 Git 分支创建发布配置 [3]。
  2. 编译发布。
  3. 配置工作流。
  4. 最后,通过启动一个工作流来执行工作流配置。

所有这些步骤都可以通过 Dataform UI(BigQuery 控制台)来进行,包括 Python 客户库 [4] 或 Dataform API 接口 [5]。

好消息是,如果我们想用Python代码来运行工作流执行,我们不需要在脚本里完成所有这些步骤。相反,我们可以在Dataform UI里面使用前三个步骤,而只需用Python代码执行最后一步。

创建工作流配置

所以,如果我们已经在 Dataform 中设置了发布配置并完成了编译,我们必须配置一个可以由外部触发的执行流程。

在“发布和调度”标签下的工作流配置部分,点击CREATE按钮。输入配置名称,选择发布设置,并选择要执行的操作的名称或标签。例如

创建工作流的配置

我们不需要填写频率字段。如果需要的话,请配置其他执行的选项。然后点击创建。新的配置会出现在工作流配置部分,Cron调度字段为空白。

云函数(Cloud Function)使用客户端库

接下来,我们需要创建云函数。代码可以是这样的。

    from google.cloud import dataform_v1beta1  

    df_client = dataform_v1beta1.DataformClient()  

    def run_workflow(project, location, repo_name, workflow_config_name):  
        # 运行工作流的函数定义
        repo_uri = f'projects/{project}/locations/{location}/repositories/{repo_name}'  
        workflow_config = f'projects/{project}/locations/{location}/repositories/{repo_name}/workflowConfigs/{workflow_config_name}'  

        request = dataform_v1beta1.CreateWorkflowInvocationRequest(  
            parent=repo_uri,  
            workflow_invocation=dataform_v1beta1.types.WorkflowInvocation(  
                workflow_config=workflow_config  
            )  
        )  

        response = df_client.create_workflow_invocation(request=request)  
        name = response.name  
        return name  

    def main():  
        # 主函数,定义项目、位置、仓库名和工作流配置名
        gcp_project = 'my-project'  
        location = 'us-east1'  
        repo_name = 'my-repo-name'  
        workflow_config_name = 'my_workflow_api_execution'  

        run_workflow(gcp_project, location, repo_name, workflow_config_name)  

        return 0

我们来看看上面的代码。

首先,我们从Google Cloud客户端库导入了dataform_v1beta1模块。接下来,我们创建了一个DataformClient实例,这使我们可以与Dataform API进行交互。

接下来,我们定义了 main 函数,该函数作为脚本的入口。我们设置了工作流的参数,包括 Google Cloud 项目、位置、仓库名称以及工作流配置名称。然后,我们调用了带有指定参数的 run_workflow 函数以运行工作流。

接下来,我们定义了名为 run_workflow 的函数。run_workflow 函数接收四个参数:projectlocationrepo_nameworkflow_config_name。我们构建了仓库和工作流配置的 URI,创建了一个 CreateWorkflowInvocationRequest 对象,并将父级设置为仓库 URI。然后,我们将 workflow_config 指定为 WorkflowInvocation 对象中的配置。

接下来,我们调用了 create_workflow_invocation 方法来,并传入了上一步创建的请求对象。并将响应存储在 response 变量中,并提取了工作流调用的名称,其中包含了其唯一的标识符。

如果我们不想使用客户端库的话,可以通过发送 HTTP 请求来使用 Dataform API。

使用 Dataform API HTTP 请求的云函数

使用HTTP请求的Dataform API代码可以像这样写。

import google.auth  
from google.auth.transport.requests import Request  
from googleapiclient.discovery import build  

def create_workflow_invocation(project_id, location, repository, workflow_config):  

    credentials, project = google.auth.default()  
    credentials.refresh(Request())  

    service = build('dataform', 'v1beta1', credentials=credentials)  

    parent = f'projects/{project_id}/locations/{location}/repositories/{repository}'  

    request_body = {  
        'workflowConfig': f'projects/{project_id}/locations/{location}/repositories/{repository}/workflowConfigs/{workflow_config}'  
    }  

    response = service.projects().locations().repositories().workflowInvocations().create(parent=parent, body=request_body).execute()  

    return response  

def main():      
    # 主函数,用于执行工作流调用
    gcp_project = 'my-project'  
    location = 'us-east1'  
    repo_name = 'my-repo-name'  
    workflow_config_name = 'my_workflow_api_execution'  

    result = create_workflow_invocation(gcp_project, location, repo_name, workflow_config_name)  

在导入和认证部分,我们导入了来自Google Cloud的库,用于认证和API交互。我们使用google.auth.default()获取默认凭证,并通过Request()方法刷新,确保凭证是最新的。

接下来,我们定义了名为 main 的函数,该函数作为脚本的入口。我们设置了包括 Google Cloud 项目、位置、仓库名称和工作流配置名称在内的工作流参数。然后,我们使用上述参数调用 create_workflow_invocation 函数来启动工作流。

create_workflow_invocation 函数中,我们利用 build 函数来初始化 Dataform 服务并刷新凭证,同时使用提供的项目 ID、位置和仓库名称来构建仓库的父路径 URI。

接下来,我们创建了一个请求正文,其中包含了工作流配置的 URI,这个 URI 是通过提供的项目 ID、位置、仓库名称和工作流配置名称构建的。

我们调用了 Dataform 服务的 workflowInvocations 资源上的 create 方法,并传入了父 URI 和请求体。该响应被保存在变量 response 中,包含创建的工作流调用详情。

在部署其中一个功能之后,我们就可以用它来触发Dataform的工作流执行,作为触发点。

总结

通过 Cloud Functions 触发 Dataform 工作流的执行增强了管理和编排的灵活性。无论是处理 GCS 中的新文件,还是响应其他云事件,将 Cloud Functions 与 Dataform 集成可以实现数据工作流的无缝高效执行。可以使用 Google Cloud 客户端库或 Dataform API,您可以通过编程方式轻松启动工作流配置和调用流程,确保您的数据管道保持灵活且稳定。

相关资源
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消