一、场景描述
DataWorks标准模式下,支持开发环境和生产环境隔离,开发环境和生产环境的数据库表命名有所区别,如果需要在开发环境访问生产环境的数据库表或者跨项目空间A访问项目空间B的表,需要根据以下命名规范严格区分数据库表名,避免误操作生产环境。
环境类型 | 标准模式 | 示例 |
开发环境 | 项目名_dev.表名 | 在projectA项目下创建一个开发库表user_info,则数据库表名为:projectA_dev.user_info。 |
生产环境 | 项目名.表名 | 在projectA项目下创建一个生产库表user_info,则数据库表名为:projectA.user_info。 |
跨项目 开发环境 |
项目名_dev.表名 | 在projectB项目下创建一个开发库表user_info,projectA需要访问该数据库表则数据库表名为:projecB_dev.user_info。 |
跨项目 生产环境 |
项目名.表名 | 在projectB项目下创建一个开发库表user_info,projectA需要访问该数据库表则数据库表名为:projectB.user_info。 |
开发环境SQL任务中需要使用【开发环境空间.表名】projectA_dev.user_info来使用表,发布到生产环境时,需要手动把开发环境空间改成生产环境空间名称projectA.user_info才能发布。
二、实现方案
1、方案一使用赋值节点
1.1 方案思路
通过Python SDK get_project方法获取项目名称。然后使用赋值节点将上游节点任务的结果提供给下游节点使用。
1.2 方案存在的问题
赋值节点目前仅支持ODPS SQL、SHELL和Python2三种赋值语言。使用Python2需要下载odps包。且在代码中连接odps需要指定AK和ProjectName。此方案虽然可以实现获取上游结果赋值给下游使用,但是灵活切换想看空间名称看起来无法满足用户场景。
那我们考虑使用DataWorks一般节点Pyodps手动添加上游输出参数的话。下游使用赋值节点或者参数节点是否可行呢?
时间测试发现此方案也存在问题。
因为节点上下文参数仅用于上游节点的节点上下文输出参数作为下游节点的节点上下文输入参数,无法直接将上游节点的查询结果传递到下游,如果您需要将上游节点的查询结果传递到下游节点,可以使用赋值节点。
2、方案二使用流程参数
当整个业务流程需要对同一个变量统一赋值或替换其参数值时,您可以使用流程参数功能。当流程参数的赋值与单个节点参数的赋值不一致时,流程参数的赋值会覆盖节点的参数赋值。
2.1 配置节点参数
本文以跨项目空间为例。在项目空间bigdtata_ljw_test访问项目空间bigdatazjpoc下的表数据。
- 调度配置参数中设置参数
projectname=bigdatazjpoc_dev
- 代码中引用参数配置
--代码中引用:当前的项目名称为bigdtata_ljw_testselect*from ${projectname}.user_info_delta;
配置如下图所示:
2、配置流程参数
参数名称:projectname
参数值或者表达式:bigdatazjpoc
⚠️ 注意:流程参数的名称需要和节点名称一致。
三、方案验证
由于节点中有设置参数。在开发环境单节点测试需要使用冒烟测试或者高级运行。高级运行时此时参数使用的是bigdatazjpoc_dev及跨项目空间的开发环境。满足开发环境访问开发环境的需求。
开发环境整个业务流程测试是参数手动输入bigdatazjpoc_dev,测试运行访问的同样是开发环境的表数据。
提交到生产环境补数据运行,可以看到此时执行参数为流程参数配置的生产环境的project。(忽略截图中运行失败,是由于权限问题。)
这是由于当流程参数的赋值与单个节点参数的赋值不一致时,流程参数的赋值会覆盖节点的参数赋值。流程参数我们配置即为跨项目空间对用的生产环境的项目空间。满足此场景。
四、总结
针对跨项目空间访问表数据和开发生产环境隔离访问表数据场景。不需要频繁修改项目空间名称可通过DataWorks流程参数功能实现。