FAQ-api传输相关问题

问题描述/异常栈
1/找不到数据主体
2/报空指针异常
发现版本
通用版本问题
解决方案

确认客户api服务:

1.原生ftp是否是 可以分页的
2.请求/回参是否有分页字段 是否生效
3.后传入的 分页字段 是否写的有问题(pageSize pageNum写反)
4.参数是否传入完整 (分页 请求头 总量字段)
5.如果没有总量字段 无法分页
问题原因

模板:
curl 'http://datastream-manager-dev.service.163.org/agents?page=1&perPage=10&product=intern'


{  
    "code": 200,  
    "message": "获得客户端列表成功",  
    "data": {  
        "pagination": {  
            "current": 1,  
            "previous": 1,  
            "next": 2,  
            "perPage": 2,  
            "pages": 22,  
            "total": 43 // $.data.pagination.total是这个接口的数据总条数  
        },  
        "agents": [  
            {  
                "id": 602,  
                "hostname": "public-ds-yarn-7.gy.ntes",  
                "product": "intern",  
                "deployMode": 0,  
                "sn": 138034018,  
                "status": 1,  
                "statusMessage": "",  
                "version": "v1.1.75",  
                "flowLimit": 50000,  
                "jvmLimit": 256,  
                "tcpLimit": 1,  
                "deployer": "zhanghao@corp.netease.com",  
                "createTime": 1742471315000,  
                "count": 0,  
                "tagList": [  
                    "标签C-2",  
                    "标签C-1",  
                    "标签B-2",  
                    "标签B-1",  
                    "标签A-2"  
                ]  
            },  
            {  
                "id": 601,  
                "hostname": "public-ds-yarn-9.gy.ntes",  
                "product": "intern",  
                "deployMode": 0,  
                "sn": 137604746,  
                "status": 1,  
                "statusMessage": "",  
                "version": "v1.1.75",  
                "flowLimit": 5000,  
                "jvmLimit": 256,  
                "tcpLimit": 1,  
                "deployer": "zhanghao@corp.netease.com",  
                "createTime": 1742471311000,  
                "count": 0,  
                "tagList": [  
                    "测试XYZ"  
                ]  
            }  
        ]  
    }  
}
数据传输Spark引擎只支持来源选择API数据源
DEMO API
假设有下面这个Demo API(GET接口且分页),现在需要将Demo API的返回结果(客户端列表数据)通过数据传输任务同步到Hive表 中,其中只需要$.data.agents数组中的内容,并且将数组中的每个对象作为一行数据,解析字段写入Hive表。
入参product:项目名(固定的)
入参page:当前页
入参perPage:每页条数
登记API数据源
登记URL时只需要填写到域名或ip端口,具体的api path在后面传输任务中可配
如果在数据源登记时使用了自定义参数,那么在传输任务里使用$(xxx)方式引用。
配置传输任务
配置数据源信息,包括了定义请求格式,是否分页,数据主体,前置处理(前置处理用于复杂的API入参需求,比如入参要做动态加密 计算等,通过上传UDF jar包实现对入参进行预处理)等
如果上面的内容配置对了,点击数据预览可以看到主体数据,点击获取最新表结构,是可以自动解析出API数据格式
来源表字段这里除了可以选择从数据主体中解析出来的一级字段还支持以下几种。
不导入:某个去向字段不需要来源的映射
自定义表达式:可以使用spark函数处理数据主体中的一级字段
自定义字段:可以写常量,也可以继续写jsonpath去提取数据主体中的嵌套字段
response:表示将API返回的结果(不解析字段)当做一个字符串写入去向某个字段
排查建议
有问题时,建议先通过curl或者postman等工具先模拟调用一次API接口,看下API是否连通以及返回的数据格式,通过分析数据格式再尝试配对传输任务(传输任务跑在Yarn上,注意所有Yarn节点都要能连通对应API数据源)
传输任务支持API分页目前只支持两种标准分页方式,即pageSize&pageNumber和offset&limit,且接口必须要有总量字段否则无法计算分页值
数据源登记时的自定义参数和分页参数都是$(xxx),注意是大括号不要写错! 参数组变量还是使用${}花括号形式。
目前来源API默认只支持content-type=application/json,如果要其他content-type,需要使用UDF自己组织数据,并将content-type置为对应的类型
如果json嵌套过于复杂,又要提取嵌套内容的某些部分,这种需求建议直接将完整json写到下游表中,再通过数据开发的方式进行提取转换等操作

作者:华柄印