Linkis项目是微众银行大数据平台自研的一种大数据作业提交方案及可扩展框架。项目使用方式方便,用户可以结合微众银行另一项开源项目——意书(这里要用http链接)直接进行使用,当然用户也可以根据规定的前端接口进行接入。Linkis也提供了客户端的实现,用户可以通过使用Linkis的sdk直接访问服务端。另外,Linkis作为一个可扩展性很强的框架,用户可以通过SDK的方式开发自己的应用。
Linkis项目前端接口提供了两种方式,HTTP和WebSocket。Websocket方式相比于HTTP方式具有对服务器友好,信息推送更加及时等优势,但是WebSocket在用户使用的时候可能出现断开连接的情况,所以开源项目意书在对接Linkis时候,采用了WebSocket和HTTP结合的方式,正常情况下使用websocket与Linkis进行通信,出现WebSocket断开连接的时候,就会切换为HTTP的方式与后台进行交互。
Linkis在前后端进行交互的时候,自定义了一套自己的接口规范。
1).URL规范
/api/rest_j/v1/{applicationName}/.+ /api/rest_s/v1/{applicationName}/.+
2).请求规范
{ "method":"/api/rest_j/v1/entrance/execute", "data":{}, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
3).响应规范
{"method":"/api/rest_j/v1/entrance/execute","status":0, "message":"成功!","data":{}}
1).建立连接
此接口是为了和Linkis建立一个WebSocket连接。
/api/rest_j/entrance/connect
2).请求执行任务
请求执行任务是将用户的作业提交到Linkis进行执行的接口
/api/rest_j/entrance/execute
POST
{ "method":"/api/rest_j/v1/entrance/execute", "data":{ "params": { "variable":{ "k1":"v1" }, "configuration":{ "special":{ "k2":"v2" }, "runtime":{ "k3":"v3" }, "startup":{ "k4":"v4" } } }, "executeApplicationName":"spark", "executionCode":"show tables", "runType":"sql", "source":{ "scriptPath": "/home/Linkis/Linkis.sql" }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" } }
参数名 | 参数定义 | 类型 | 备注 |
---|---|---|---|
executeApplicationName | 用户所期望使用的引擎服务,如Spark、hive等 | String | 不可为空 |
requestApplicationName | 发起请求的系统名 | String | 可以为空 |
params | 用户指定的运行服务程序的参数 | Map | 必填,里面的值可以为空 |
executionCode | 用户提交的执行代码 | String | 不可为空 |
runType | 当用户执行如spark服务时,可以选择python、R、SQL等runType | String | 不可为空 |
scriptPath | 用户提交代码脚本的存放路径 | String | 如果是IDE的话,与executionCode不能同时为空 |
表1 请求体参数描述
{ "method": "/api/rest_j/v1/entrance/execute", "status": 0, "message": "请求执行成功", "data": { "execID": "030418IDEhivebdpdwc010004:10087IDE_johnnwang_21", "taskID": "123" } }
3).任务状态、日志、进度主动推送
提交执行之后,任务的状态、日志、进度等信息都会由服务器主动推送,用websocket方式去主动进行请求。 请求的接口和下文中的HTTP是保持一致的,唯一不一样的是,websocket的请求shema是ws://,而HTTP的请求schema是http://。
WebSocket中的接口返回的示例如下
{ "method": "/api/rest_j/v1/entrance/${execID}/log", "status": 0, "message": "返回日志信息", "data": { "execID": "${execID}", "log": ["error日志","warn日志","info日志", "all日志"], "taskID":28594, "fromLine": 56 }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
{ "method": "/api/rest_j/v1/entrance/${execID}/status", "status": 0, "message": "返回状态信息", "data": { "execID": "${execID}", "taskID":28594, "status": "Running", }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
{ "method": "/api/rest_j/v1/entrance/${execID}/log", "status": 0, "message": "返回进度信息信息", "data": { "execID": "${execID}", "taskID":28594, "progress": 0.2, "progressInfo": [ { "id": "job-1", "succeedTasks": 2, "failedTasks": 0, "runningTasks": 5, "totalTasks": 10 }, { "id": "job-2", "succeedTasks": 5, "failedTasks": 0, "runningTasks": 5, "totalTasks": 10 } ] }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
HTTP接口需要在提交执行之后,需要采用HTTP轮询的方式请求获取作业的状态、日志、进度等信息
1).请求执行
/api/rest_j/entrance/execute
POST
{ "params": {}, "executeApplicationName":"spark", "executionCode":"show tables", "runType":"sql", "source":{ "scriptPath": "/home/Linkis/Linkis.sql" } }
2).获取状态
建立连接是WebSocket特有的一个接口,是为了和Linkis建立一个WebSocket连接
/api/rest_j/entrance/${execID}/status
GET
{ "method": "/api/rest_j/v1/entrance/{execID}/status", "status": 0, "message": "获取状态成功", "data": { "execID": "${execID}", "status": "Running" } }
3).获取日志
建立连接是WebSocket特有的一个接口,是为了和Linkis建立一个WebSocket连接
/api/rest_j/entrance/${execID}/log?fromLine=${fromLine}&size=${size}
GET
{ "method": "/api/rest_j/v1/entrance/${execID}/log", "status": 0, "message": "返回日志信息", "data": { "execID": "${execID}", "log": ["error日志","warn日志","info日志", "all日志"], "fromLine": 56 } }
4).获取进度
建立连接是WebSocket特有的一个接口,是为了和Linkis建立一个WebSocket连接
/api/rest_j/entrance/${execID}/progress
GET
{ "method": "/api/rest_j/v1/entrance/{execID}/progress", "status": 0, "message": "返回进度信息", "data": { "execID": "${execID}", "progress": 0.2, "progressInfo": [ { "id": "job-1", "succeedTasks": 2, "failedTasks": 0, "runningTasks": 5, "totalTasks": 10 }, { "id": "job-2", "succeedTasks": 5, "failedTasks": 0, "runningTasks": 5, "totalTasks": 10 } ] } }
5).kill任务
建立连接是WebSocket特有的一个接口,是为了和Linkis建立一个WebSocket连接
/api/rest_j/entrance/${execID}/kill
POST
{ "method": "/api/rest_j/v1/entrance/{execID}/kill", "status": 0, "message": "OK", "data": { "execID":"${execID}" } }
客户端SDK接入请查看
后台开发人员在使用Linkis的时候,不但可以直接使用Linkis已经开发的执行引擎,也可以根据自己的需求使用框架开发出自己的应用。Linkis的接入方式简单,可以分成Entrance,EngineManager和Engine几个模块。其中Entrance、EngineManager和Engine三个模块的作用和架构可以查看UJES架构设计文档(真实链接)
Linkis项目使用了Spring框架作为底层技术,所以一些类实例可以直接通过Spring的注解进行注入。Linkis框架提供了一些通用实现,如果用户想要使用自己编写的类,可以使用直接使用并覆盖掉通用实现。
1)maven依赖
<dependency> <groupId>com.webank.wedatasphere.Linkis</groupId> <artifactId>Linkis-ujes-entrance</artifactId> <version>0.9.4</version> </dependency>
2)需要实现的接口
Entrance没有必须要实例化的接口,以下接口可以根据需要进行实现。
1)maven依赖
<dependency> <groupId>com.webank.wedatasphere.Linkis</groupId> <artifactId>Linkis-ujes-enginemanager</artifactId> <version>0.9.4</version> </dependency>
2)需要实现的接口
EngineManager需要对以下接口根据需要进行实现:
1)maven依赖
<dependency> <groupId>com.webank.wedatasphere.Linkis</groupId> <artifactId>Linkis-ujes-engine</artifactId> <version>0.9.4</version> </dependency>
2)需要实现的接口
Engine必须实现的接口如下:
Engine非必须实现的接口或bean如下: