DataWorks OpenAPI-数据开发API调用示例

工欲善其数,必先利其器!

DataWorks OpenAPI现已正式发布,通过自带的100多个API 功能,可以快速进行批量操作与系统集成对接等,助您显著提升数据开发效率!

(DataWorks OpenAPI限企业版及以上版本使用)

DataWorks OpenAPI现开放7天免费试用,请使用钉钉扫码联系,提供试用账号的UID与Region即可。

DataWorks OpenAPI-数据开发API调用示例

本篇文章将详细介绍DataWorks OpenAPI从创建业务流程以及节点发布上线,到删除节点和业务流程,一整个闭环的使用方式,帮助您快速上手DataWorks OpenAPI的使用

一、整体流程图

DataWorks OpenAPI-数据开发API调用示例

二、 初始化

public class IdePopApiTest {
    // 账号信息
    @Value("${aliyun.akId}")
    private String akId;
    @Value("${aliyun.akSecret}")
    private String akSecret ;
    
    // 例:cn-shanghai
    @Value("${aliyun.region}")
    private String region;
    // 例:dataworks.cn-shanghai.aliyuncs.com
    @Value("${aliyun.endpoint}")
    private String endpoint;

    private IAcsClient client;


    @Before
    public void init() throws ClientException {
        String product = "dataworks-public";
        IClientProfile profile = DefaultProfile.getProfile(region, akId, akSecret);
        DefaultProfile.addEndpoint(region, product, endpoint);
        client = new DefaultAcsClient(profile);
    }
}   


三、 接口调用

详细阅读DataWorks OpenAPI文档对开发非常有帮助,做API开发时如果对参数的约束不太理解时可参考DataWorks OpenAPI文档,里面对每个出入参、参数示例、错误码描述都有详细的解释。

以下是业务流程,文件夹和节点的创建、修改、删除和发布操作全流程。


1、 创建业务流程

public void createBusiness() throws ClientException {
        CreateBusinessRequest request = new CreateBusinessRequest();
        //右上角小扳手里 工作空间ID
        request.setProjectId(78837L);
        //右上角小扳手里 工作空间名称
        request.setProjectIdentifier("zxy_8221431");
        //新业务流程名 唯一值
        request.setBusinessName("test_create_business");
        //NORMAL(数据开发)、MANUAL_BIZ(手动业务流程)
        request.setUseType("NORMAL");
        CreateBusinessResponse acsResponse = client.getAcsResponse(request);
        log.info(acsResponse.toString());
}

UpdateBusiness和DeleteBusiness可以修改和删除业务流程 删除业务流程是要保证指定的业务流程中所有的节点已经删除 ListBusiness 可以查看指定工作空间下符合匹配条件的所有业务流程 GetBusiness可以查看查询业务流程的详情。


2、 创建文件夹

public void createFloder() throws ClientException {
        CreateFolderRequest request = new CreateFolderRequest();
        request.setProjectId(78837L);
        //  path “业务流程/” + 目标业务流程名 + 目录名 + 最新文件夹名
        request.setFolderPath("业务流程/test_create_business/通用/test_floder_123");
        CreateFolderResponse acsResponse = client.getAcsResponse(request);
        log.info(acsResponse.toString());
    }

UpdateFolder可以修改文件夹的名称 DeleteFolder删除数据开发页面的文件夹(要确保此文件夹下掉节点已经全部删除)


3、 创建后ide目录结构

查看目录结构时首先隐藏引擎实例

下图为以下两个path创建的文件夹

folderPath = "业务流程/test1/MaxCompute/test_floder_123"


在MaxCompute中 文件夹刚创建成功时 目录结构时和数据开发同级的 在目录中新增一个节点后刷新页面会转移到对应的类型下 如下图新增一个odps_sql节点test_floder_123文件夹转移到数据开发下

folderPath = "旧版工作流/test_floder_123";

DataWorks OpenAPI-数据开发API调用示例

下图路径为 "业务流程/test_create_business/通用/test_floder_123"

DataWorks OpenAPI-数据开发API调用示例

在查询的是后返回的路径可能和页面上字面值不一样 对应关系如下(调用接口路径还是按页面看到的填写):

folderAlgm -> 算法

folderADBMysql -> AnalyticDB for MySQL

folderCDH -> CDH

folderDi -> 数据集成

folderEMR -> EMR

folderErd -> 数据模型

folderFlink -> Flink

folderGeneral -> 通用

folderHologres -> Hologres

folderADB -> AnalyticDB for PostgreSQL

folderJdbc -> 数据库

folderMaxCompute -> MaxCompute

folderUserDefined -> 自定义


4、 创建节点

public void createFile() throws ClientException{
        CreateFileRequest request = new CreateFileRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        request.setFileName("test_vi_file_name2");
        request.setFileDescription("Description");
        request.setFileFolderPath("业务流程/test_create_business/通用/test_floder_123");
        //节点类型。 节点类型要符合目录类型 例如:fileType=23的离线同步节点 应该在数据集成目录下
        request.setFileType(99);
        // 文件依赖的上游文件的输出 此处依赖跟节点  projectIdentifier + _root 必填 不然无法提交
        request.setInputList("zxy_8221431_root");
        // 对应ide页面调度配置重跑类型 必填 不然无法提交
        //ALL_ALLOWED(运行成功或失败后皆可重跑)
        //FAILURE_ALLOWED(运行成功后不可重跑,运行失败后可以重跑)
        //ALL_DENIED(运行成功或失败皆不可重跑)
        request.setRerunMode("ALL_ALLOWED");
        CreateFileResponse acsResponse = client.getAcsResponse(request);
        // acsResponse.getData() 为节点id 提交节点时使用
        Long fileId = acsResponse.getData();
        log.info(acsResponse.toString());
    }

节点类型要符合目录类型 例如:fileType=23的离线同步节点 应该在数据集成目录下。您可以通过ListFile查询对应文件,GetFile获取文件的详情,在调用UpdateFile更新已有的文件节点时,填写的参数必须和该节点原本的文件配置不同。例如,源节点的某参数值为A,则需要变更为B后再提交。如果仍填写A,会报invalid异常。


5、 提交节点

 public void submitFile() throws ClientException{
        SubmitFileRequest request = new SubmitFileRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        // 此节点id为创建节点时返回的id. 对应数据库file表的file_id.  不是ide页面上调度配置里的节点Id
        request.setFileId(501576542L);
        request.setComment("备注");
        SubmitFileResponse acsResponse = client.getAcsResponse(request);
        //调用GetDeployment接口,获取本次发布的具体情况
        Long deploymentId = acsResponse.getData();
        log.info(acsResponse.toString());
}

若项目空间是标准模式 则还需要发布节点到生产环境,在删除节点时标准环境中要把删除操作发布到生成环境,

在提交节点或发布节点后可以调用GetDeployment获取发布包的详情。


6、 发布节点

 public void deploy() throws ClientException{
        DeployFileRequest request = new DeployFileRequest();
//        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        request.setFileId(501576542L);
        request.setComment("备注");
        // 和file_id 二选一 nodeId 的值为 ide页面调度配置里基础属性中 节点Id
        request.setNodeId(700004537241L);
        DeployFileResponse acsResponse = client.getAcsResponse(request);
        // 调用GetDeployment接口,获取本次发布的具体情况
        Long deploymentId = acsResponse.getData();
        log.info(acsResponse.getData().toString());
    }

如果项目空间是简单模式,则不区分生产和开发环境 只需要调用提交接口即可

完整发布流程:

1 新建节点 CreateFile

2 提交节点 SubmitFile

3 查询发布包状态 GetDeployment

4 提交成功后 标准模式发布到生产环境 DeployFile

5 查询发布包状态 GetDeployment


7、 获取发布包详情

public void getDeployment() throws ClientException{
        GetDeploymentRequest request = new GetDeploymentRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        //deploymentId为提交/发布的返回值
        request.setDeploymentId(2776067L);
        GetDeploymentResponse acsResponse = client.getAcsResponse(request);
        log.info(acsResponse.getData().toString());
    }

在提交和发布时 Response会返回deploymentId 此接口可获取发布包的详情。当返回状态为1时则表示发布成功

详细返回参数定义参考 deployment参数定义


8、 删除节点

public void deleteFile() throws ClientException{
        DeleteFileRequest request = new DeleteFileRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");

        request.setFileId(501576542L);
        DeleteFileResponse acsResponse = client.getAcsResponse(request);
        log.info(acsResponse.toString());
        // 标准模式需要把删除发布到线上
        DeployFileRequest deployFileRequest = new DeployFileRequest();
        request.setProjectId(78837L);
        deployFileRequest.setProjectIdentifier("zxy_8221431");
        deployFileRequest.setFileId(501576542L);
        deployFileRequest.setComment("备注");
        // 和file_id 二选一 nodeId 的值为 ide页面调度配置里基础属性中 节点Id
        deployFileRequest.setNodeId(700004537241L);
        DeployFileResponse deployFileResponse = client.getAcsResponse(deployFileRequest);
        Long deploymentId = deployFileResponse.getData();
        log.info(deployFileResponse.getData().toString());

    }

在标准模式种删除节点是要记得调用发布接口DeployFileRequest把删除操作发布到线上


9、 删除文件夹

public void deleteFolder() throws ClientException{
        //删除之前要先删除此目录下到所有节点   listFile查询节点
        List<ListFilesResponse.Data.File> files = listFiles();
        for (ListFilesResponse.Data.File file : files) {
            //删除此文件夹下所有节点
            deleteFile(file);
        }
        DeleteFolderRequest request = new DeleteFolderRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        // 调用listFolders获取folderId
        request.setFolderId("*****");
        DeleteFolderResponse acsResponse = client.getAcsResponse(request);
        log.info(acsResponse.toString());
 }

/**
     * 查询节点
     * @return
     * @throws ClientException
     */
public List<ListFilesResponse.Data.File> listFiles() throws ClientException{
        ListFilesRequest request = new ListFilesRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        request.setPageNumber(1);
        request.setPageSize(10);
        request.setFileFolderPath("业务流程/test_create_business/通用/test_floder_123");
        //关键字匹配
        //request.setKeyword("");
        //文件所属的功能模块,包括NORMAL(数据开发)、MANUAL(手动任务)、MANUAL_BIZ(手动工作流)、SKIP(数据开发空跑调度)、ADHOCQUERY(临时查询)和COMPONENT(组件管理)
        request.setUseType("NORMAL");
        //节点类型 多个用逗号分开
        request.setFileTypes("10,23,99");
        ListFilesResponse acsResponse = client.getAcsResponse(request);
        return acsResponse.getData().getFiles();
    }

/**
     * 查询文件夹
     * @return
     * @throws ClientException
     */
 public List<ListFoldersResponse.Data.FoldersItem> listFolders() throws ClientException{
        ListFoldersRequest request = new ListFoldersRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        request.setPageNumber(1);
        request.setPageSize(10);
        //父文件夹的路径
        request.setParentFolderPath("业务流程/test_create_business/通用");
        ListFoldersResponse acsResponse = client.getAcsResponse(request);
        return acsResponse.getData().getFolders();
    }

删除文件夹是要先删除文件夹下所有节点和文件夹 ListFilesRequest 可以查询知道文件夹下的所有节点,逐个删除后才能删除文件夹  调用接口顺序为:

1 ListFolders 查询到要删除的文件夹id和对应的文件夹的路径,

2 ListFiles 查询此文件夹路径下所有的节点信息

3 DeleteFile删除所有节点 若为标准环境 还要调用deploy接口把删除操作发布到线上

4 DeleteFolder删除文件夹


10、 删除业务流程

public void deleteBusiness() throws ClientException{
        //要先删除此业务流程下所有节点
        DeleteBusinessRequest request = new DeleteBusinessRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        //调用ListBusiness接口,根据名称查询对应业务流程的ID
        List<ListBusinessResponse.Data.BusinessItem> businessItems = listBusiness();

        request.setBusinessId(businessItems.get(0).getBusinessId());
        DeleteBusinessResponse acsResponse = client.getAcsResponse(request);
        log.info(acsResponse.toString());

    }

    public List<ListBusinessResponse.Data.BusinessItem> listBusiness()  throws ClientException{
        ListBusinessRequest request = new ListBusinessRequest();
        request.setProjectId(78837L);
        request.setProjectIdentifier("zxy_8221431");
        request.setPageNumber(1);
        request.setPageSize(10);
        request.setKeyword("test_create");
        ListBusinessResponse acsResponse = client.getAcsResponse(request);
        return acsResponse.getData().getBusiness();
    }

删除业务流程时也要删除此业务流程下掉所有节点

1 ListFiles 查询业务流程下所有的节点信息

2 DeleteFile删除所有节点  若为标准环境 还要调用deploy接口把删除操作发布到线上

3 DeleteFolder删除文件夹


DataWorks OpenAPI实战系列:

实战合集

依赖DataWorks OpenAPI补数据实现圈人

DataWorks OpenAPI实现数据资产分布和排行分析

DataWorks OpenAPI-表结构变更时触发任务变更

DataWorks OpenAPI企业开发实战-运维监控大屏

DataWorks OpenAPI 实战-数据开发全流程介绍

DataWorks OpenAPI 示例(元数据模块)


DataWorks OpenAPI现开放7天免费试用,请使用钉钉扫码联系,提供试用账号的UID与Region即可。

提效神器,DataWorks OpenAPI开放7天免费试用!

DataWorks OpenAPI-数据开发API调用示例


上一篇:过大的Oracle监听日志文件处理


下一篇:07 方便菜谱