适配器开发过程
- 首先在如下目录开发自定义适配器,具体如何开发见后续教程
- 编写好adapter后对
fate-serving-extension
模块进行打包,在target下拿到fate-serving-extension-2.1.0.jar
打开
fate-serving
的server
模块部署目录下extension
目录,通过xftp工具替换jar包cd /data/projects/fate-serving/server/extension
重新编写配置文件,更改使用的适配器
cd /data/project/fate-serving/server/conf
vim serving-server.properties
重启server
cd /data/project/fate-serving/server
./service.sh restart
单个预测适配器如何开发
实现单个预测适配器,需要继承AbstractSingleFeatureDataAdaptor
public class CustomAdapter extends AbstractSingleFeatureDataAdaptor {
@Override
public void init() {
// init() 方法中可以直接使用environment对象
// environment.getProperty("port");
}
@Override
public ReturnResult getData(Context context, Map<String, Object> featureIds) {
// ...
}
}
- init用于获取配置文件中的参数,可用于获取自定义接口地址
- getData用于返回host端获取的特征值,特征值要根据featureIds(如:{“id”:123,”tel”:13000000000})中guest端传来数据进行获取,最终要返回一个ReturnResult类型的实例,这个实例要通过setData与setRetcode设置相关信息。
案例:
guest端传来的featureIds包括:id
host端数据源如图所示,第一行为标签,其余为数据,数据源位于server模块根目录下名为host_data.csv
对应的adaper代码为
public class MyFileAdapter extends AbstractSingleFeatureDataAdaptor {
private static final Logger logger = LoggerFactory.getLogger(MyFileAdapter.class);
@Override
public void init() {
}
@Override
public ReturnResult getData(Context context, Map<String, Object> featureIds) {
ReturnResult returnResult = new ReturnResult();
Map<String, Object> data = new HashMap<>();
try {
logger.info("testHost data path = {}", Paths.get(System.getProperty(Dict.PROPERTY_USER_DIR), "host_data.csv"));
logger.info(featureIds.toString());
List<String> lines = Files.readAllLines(Paths.get(System.getProperty(Dict.PROPERTY_USER_DIR), "host_data.csv"));
String[] label = StringUtils.split(lines.get(0), ",");
int id = (Integer)featureIds.get("id");
logger.info(String.valueOf(id));
int flag = 0;
for (int i = 1; i < lines.size(); i++) {
String[] item = StringUtils.split(lines.get(i), ",");
if (Integer.parseInt(item[0]) == id) {
for (int j = 1; j < item.length; j++) {
data.put(label[j], Double.parseDouble(item[j]));
}
flag = 1;
break;
}
}
if(flag == 0){
logger.info("未找到数据!");
throw new Exception();
}
else{
logger.info(data.toString());
returnResult.setData(data);
returnResult.setRetcode(StatusCode.SUCCESS);
}
} catch (Exception ex) {
logger.error(ex.getMessage());
returnResult.setRetcode(StatusCode.HOST_FEATURE_ERROR);
}
return returnResult;
}
}
其中,处理之后的data形式为:{“x1”:0.123,”x2”:-1.65}