安装完成开放数据Package后您就可以使用开发数据来获取元数据信息,使用时需保障最新的开放数据已经产出完成,否则可能会遇到数据没有产出而读取数据为空的情况。本文为您介绍如何通过一个上游节点来检查开放数据是否已产出,避免后续使用开发数据时读取空数据。

背景信息

根据DataWorks的上下游节点运行依赖原则:上游节点运行正常且运行完成后,下游节点才会被触发运行。因此您可以在使用开放数据的任务节点的上游新建一个节点,用于检查开放数据是否正常产出数据,当开放数据正常产出数据时,上游检查节点运行完成。业务流程如下图所示。开放数据业务流程其中:
  • CHECK_RAW_VIEW_PRODUCED.sh为上游检查节点:节点任务为检查当前开放数据是否正常产出,当开放数据正常产出数据时,节点任务运行成功,触发下游节点运行。
  • READ_ODS_RAW_DATA.sql为使用开放数据节点:为使用开放数据查询元数据信息的任务节点。
使用开放数据的步骤可参见使用开放数据,本文为您介绍查询检查开放数据是否产生节点的使用。
  • 检查开放数据是否正常生成的上游节点可使用Shell节点。
  • 检查开放数据生成状态时,需要使用一个有读取开放数据Package和在当前项目创建任务实例权限的阿里云账号。

    为保障数据和任务实例的访问安全性,建议此账号使用RAM用户,并采取最小权限原则,仅为此账号赋予DataWorks的访客角色和开放数据Package的READ权限即可。

因此检查开放数据生成状态时,您需要参考以下流程操作:
  1. 开通RAM用户并授权
  2. 配置检查开放数据生成状态节点
  3. 配置节点调度依赖

开通RAM用户并授权

为保障数据和任务实例的访问安全性,建议检查开放数据是否产生的账号使用RAM用户,并采取最小权限原则,仅为此账号赋予DataWorks的访客角色和开放数据Package的READ权限即可。

  1. 创建一个RAM用户。
    为了最大限度保证数据安全,不建议授予此处新建的RAM用户控制台登录权限,只为其创建AccessKey即可。创建RAM用户的步骤可参见准备RAM用户。本文中该RAM用户的账号名称是dw_odps_test
  2. 添加访客角色。
    添加RAM用户到DataWorks工作空间中,授予其最低限度的角色权限访客,操作详情可参见添加工作空间成员和角色访客
  3. 添加Package的READ权限。
    为了让此RAM用户能够读取到DataWorks开放数据提供的数据,需要赋予其Package的READ权限。此外,读取数据会在ODPS项目中创建任务实例,也需要为此RAM用户赋予CreateInstance权限,操作详情可参见为角色或用户授权
    -- 授予在项目中创建实例的权限
    GRANT CreateInstance ON PROJECT {此处是安装了DataWorks开放数据的ODPS项目名称} TO USER RAM${此处是主账号的云账号}:dw_odps_test;
    
    -- 授予读取开放数据的权限 (此处以杭州地域为例,其他地域需要对项目名称做替换)
    GRANT READ ON PACKAGE u_meta_hangzhou.systables TO USER RAM${此处是主账号的云账号}:dw_odps_test;
    
    -- 查看授权结果
    show grants for RAM${此处是主账号的云账号}:dw_odps_test;
    授权后输出示例如下。
    -- 输出示例
    [roles]
    role_project_guest
    
    Authorization Type: ACL
    [user/RAM${此处是主账号的云账号}:dw_odps_test]
    A    projects/{此处是安装了DataWorks开放数据的ODPS项目名称}: CreateInstance
    A    projects/{此处是安装了DataWorks开放数据的ODPS项目名称}/packages/u_meta_hangzhou.systables: Read

配置检查开放数据生成状态节点

您可以创建一个Shell节点,用于检查开放数据是否正常生成,并将此节点配置为使用开放数据节点的上游节点。

  1. 创建Shell节点,操作详情可参见创建Shell节点
  2. 编写检查开放数据生成状态的任务代码。
    以下以查看杭州地域的raw_v_meta_database_v1_1视图产生数据状态为例。其中:
    • u_meta_hangzhou:是杭州地域的u_meta项目名称,使用时需替换为所需地域的u_meta项目名称,各地域的u_meta项目名称详情可参见附录2:项目开放列表
    • raw_v_meta_database_v1_1:是开放数据提供的视图之一,使用时您需替换为需要查看的开放数据视图名称。开放数据视图详情可参见附录1:视图列表及结构明细
    ## check if specified view had been produced already
    # $1 view name to check
    # $2 bizdate to check
    # $3 endpoint for this odps project
    # $4 name of this odps project
    # $5 AccessKey id being used
    # $6 AccessKey secret being used
    function checkIfSpecifiedViewProduced()
    {
        CHECK_SQL="SELECT CASE WHEN COUNT(*) > 0 THEN 'PRODUCED_ALREADY' ELSE 'NOT_PRODUCED_YET' END AS PRODUCE_FLAG FROM u_meta_hangzhou.$1('$2')"
        /opt/taobao/tbdpapp/odpswrapper/odpsconsole/bin/odpscmd --endpoint=$3 --project=$4 -u $5 -p $6 -e "$CHECK_SQL" | grep --color "PRODUCED_ALREADY"
        return $?
    }
    
    ## check if view raw_v_meta_database_v1_1 had been produced already
    checkIfSpecifiedViewProduced "raw_v_meta_database_v1_1" $1 $2 $3 $4 $5
    RET_VAL=$?
    while [ $RET_VAL -ne  0 ]
    do
        echo "DataWorks open data was NOT produced yet, sleep for 300 seconds"
        sleep 300
        checkIfSpecifiedViewProduced "raw_v_meta_database_v1_1" $1 $2 $3 $4 $5
        RET_VAL=$?
    done
    echo "DataWorks opend data was produced already."
    说明 上述代码中的sleep 300表示开放数据未正常生成时,需等待多长时间(单位秒)后重新检查。 您可以根据项目情况调整sleep时间取值(单位秒)。

配置节点调度依赖

本Shell节点的调度配置有两个配置要点。
  • 调度依赖配置:

    本Shell节点需作为使用开放数据的上游节点,因此本Shell节点的本节点的输出需作为后续用开放数据节点的依赖的上游节点,形成正确的上下游依赖关系。配置操作可参见配置调度依赖

  • 参数配置:
    代码中使用了以下5个自定义参数,您需要在调度配置的基础配置的参数中添加以下5个自定义参数,多个参数以空格分隔。操作详情可参见调度参数参数配置
    • 参数1:使用自定义参数中系统自定义参数$bizdate参数,代表业务日期参数,功能等价于 ${yyyymmdd}。
    • 参数2:使用自定义参数中的字符常量参数,配置为各地域MaxCompute对应的Endpoint信息。

      例如,杭州地域的Endpoint信息需配置为http://service.cn-hangzhou.maxcompute.aliyun.com/api。各地域的Endpoint信息可参见配置Endpoint

    • 参数3:使用自定义参数中的字符常量参数,配置为安装了DataWorks开放数据的MaxCompute项目名称。
    • 参数4:使用自定义参数中的字符常量参数,配置为上述创建的RAM用户的AccessKeyId。AccessKeyId的获取可参见获取AccessKey
    • 参数5:使用自定义参数中的字符常量参数,配置为上述创建的RAM用户的AccessKeySecret。AccessKeySecret的获取可参见获取AccessKey

后续步骤

完成本文检查开放数据节点的配置后,您可参考使用开放数据创建使用开放数据的任务节点并完成配置,提交发布后,本文中的Shell节点即会检查开放数据是否有正常产生数据,完成后才会触发使用开放数据节点运行,保障使用开放数据时不会因为没有取用最新的开放数据导致数据错误或获得的空数据等问题。