====== 模型计算接口调用说明 ======
===== 实时接口调用 =====
系统通过服务网关提供实时接口,供外部进行模型计算的调用,输入json格式的输入数据,
输出为模型结果返回
==== 接口说明 ====
* 接口url:http://hostname:port/consumer/calc/{modelCode}
* 接口参数:
* url参数:
* modelCode:即要调用的模型编码
* requestBody参数:模型输出内容,json格式
* 接口返回值
* 格式:json
* 返回值内容:
* status: 状态值,2000表示计算结果正常
* message: 计算结果的说明
* data: 模型返回值
==== 接口调中示例 ====
以curl方式为例:
curl -X POST -H 'Content-Type: application/json' \
-d '{
"sepal.width": 1.2,
"sepal.length": 2.5,
"petal.width": 3.0,
"petal.length": 1.2
}' \
http://localhost:11524/consumer/calc/test-01
==== 返回结果输出示例 ====
{
"status":2000,
"message":"计算成功",
"data":{
"probability(Setosa)":0.0,
"probability(Virginica)":0.125,
"probability(Versicolor)":0.875,
"variety":"Versicolor"
}
}
===== 批量数据接口调用 =====
当前批量数据调用仅支持针对oracle、mysql数据库的批量调用,hive的批量调用
建议采用udf方式进行
==== 获取批量调用任务包 ====
需要使用eppdev-mlib-batch任务包,具体所需文件为两个:
- eppdev-mlib-batch.jar: 主要执行文件
- application.properties:相应的配置文件
> 上述两个文件需要在统一目录
==== 前提准备 ====
需要准备模型计算所需数据宽表和结果回填表两个表,其中宽表数据中需要有唯一主键,
输出结果表需要有主键和create_time字段,便于进行库表数据对应,示例格式如下
-- --------------------------------------
-- tableName:test_model_input
-- author: jinlong.hao
-- date: 2019-11-24
-- desc:
-- 1. 模型输入库表
-- 2. 主键为id
-- 3. 用于进行模型测试
-- ---------------------------------------
create table test_model_input(
id char(32) comment '主键'
,sepal_width double comment 'sepal.width'
,sepal_height double comment 'sepal.height'
,petal_width double comment 'petal.width'
,petal_height double comment 'petal.height'
,create_time double comment '创建时间,用于进行增量计算'
) comment '模型测试输入表';
-- --------------------------------------
-- tableName:test_model_output
-- author: jinlong.hao
-- date: 2019-11-24
-- desc:
-- 1. 模型输出结果表
-- 2. 主键为id
-- ---------------------------------------
create table test_model_output(
id varchar(32) comment '唯一主键'
,probability_setosa double comment 'Setosa概率'
,probability_virginica double comment 'Virginica概率'
,probability_versicolor double comment 'Versicolor概率'
,variety varchar(20) comment '模型预测结果'
,create_time datetime comment '模型计算时间'
) comment '模型测试输出表';
~~~
==== 环境配置 ====
修改application.properties文件,主要修改以下内容:
* spring.datasource.* : 数据库相关配置
* eppdev.mlib.consumer.basic-url: 服务网关的基础地址
* eppdev.mlib.batch.model-code: 模型编码
* eppdev.mlib.batch.input-table.name: 输出表的表名
* eppdev.mlib.batch.input-table.key: 输入表主键
* eppdev.mlib.batch.input-table.columns: 输出表需要查询的字段列表
* eppdev.mlib.batch.input-table.where: 定制查询条件,可以包括参数,用于命令传参数
* eppdev.mlib.batch.fetch-size: 每次读取的数据量,避免一次性加载过量数据
* eppdev.mlib.batch.output-table.name: 输出库表表名
* eppdev.mlib.batch.output-table.key: 输出表的主键名称
* eppdev.mlib.batch.output-table.column-maps: 输出字段的映射
> 其中spring.datasource.*配置模式同普通springboot工程, eppdev.mlib相关配置示例如下:
eppdev.mlib.consumer.basic-url = http://localhost:11524/consumer
eppdev.mlib.batch.model-code = test-01
eppdev.mlib.batch.input-table.name = test_model_input
eppdev.mlib.batch.input-table.key = id
eppdev.mlib.batch.input-table.columns = id, sepal_width as `sepal.width`, sepal_height as `sepal.height`, petal_width as `petal.width`, petal_height as `petal.height`
eppdev.mlib.batch.input-table.where = create_time >= ${begin_time} and create_time <= ${end_time}
eppdev.mlib.batch.fetch-size = 1000
eppdev.mlib.batch.output-table.name = test_model_output
eppdev.mlib.batch.output-table.key = id
eppdev.mlib.batch.output-table.column-maps = probability(Setosa) as probability_setosa, probability(Virginica) as probability_virginica, probability(Versicolor) as probability_versicolor, variety as variety
==== 执行调用 ====
./eppdev-mlib-sdk-batch.jar -Dbegin_time="2019-11-20 11:24:32" -Dend_time="2019-11-21 12:23:24"
===== HIVE UDF方式进行调用 =====
使用hive udf进行模型调用,有以下两种方案:
* 使用eppdev-mlib-sdk-hive-udf原生方案,在进行udf调用的时候需要首先输入
网关地址url、模型编码信息
* 使用自定义udf,在进行调用的时候可以配置无需输入网关地址、模型编码信
==== 使用原生方案 ====
=== 下载相应的软件包 ===
目前eppdev-mlib提供的原生udf支持hive1.2, 2.3, 3.1三个版本,需要分别下载不同
的jar包来完成模型的调用:
* hive1.2: eppdev-mlib-sdk-hive-udf12.jar
* hive2.3: eppdev-mlib-sdk-hive-udf23.jar
* hive3.1: eppdev-mlib-sdk-hive-udf31.jar
=== 上传jar到hdfs中 ===
以hive2.3为例:
hdfs dfs put eppdev-mlib-sdk-hive-udf23.jar /user/udf/hive/
=== 在hive中创建自定义函数 ===
create function eppdev_to_json as 'cn.eppdev.mlib.sdk.hive.udf.EppdevMlibToJsonUDF'
using jar 'hdfs://user/udf/hive/eppdev-mlib-sdk-hive-udf23.jar';
create function eppdev_mlib_calc as 'cn.eppdev.mlib.sdk.hive.udf.EppdevMlibCalcUDF'
using jar 'hdfs://user/udf/hive/eppdev-mlib-sdk-hive-udf23.jar';
=== 在hive中进行模型调用 ===
进行hive调用可以有两种方式:
- 输入3个参数(网关地址、模型编码、请求数据json),可以获取到全量的模型输入
- 输入4个参数(网关地址、模型编码、请求json和所需的输出项),可以获取指定的输出项
方法1: 三个参数获取结果json
select
eppdev_mlib_calc(
'http://localhost:11541/consumer',
'test-01',
eppdev_to_json(
'sepal.width', sepal_with,
'sepal.height', sepal_height,
'petal.width', petal_width,
'petal.height', petal_height
)
) as full_result
from iris_data;
输出结果为全量的json:
{
"probability(Setosa)": 1.0,
"probability(Virginica)": 0.0,
"probability(Versicolor)": 0.0,
"variety": "Setosa"
}
方法2:输入4个参数,直接获取具体结果
select
eppdev_mlib_calc(
'http://localhost:11541/consumer',
'test-01',
eppdev_to_json(
'sepal.width', sepal_with,
'sepal.height', sepal_height,
'petal.width', petal_width,
'petal.height', petal_height
),
'variety'
) as variety
from iris_data;
输出结果为veriety结果,如:Setosa