Designed by Webank independently, Linkis is an extensible framework and a sophisticated solution for big data task submission. Conveniently, it could be used directly together with Scriptest, which is another open-source project powered by Webank. And those frontend APIs are also available for users. A client implementation is also provided as an SDK to interact directly with background services. As an highly extensible framework, users can leverage the SDK to develop their own applications.
Two protocols are supported for frontend APIs: HTTP and WebSocket. Compared with HTTP, Websocket is more friendly to servers and behaved more efficiently in message pushing. But WebSocket is unstable and users are easily to be disconnected by accident. So Scriptest combined both ways to adapt with Linkis. It communicates with Linkis by websocket in normal circumstances, and failover to HTTP protocol in case the Websocket connection was down.
Linkis has its own specs for front-backend adaption.
1).URL specs
/api/rest_j/v1/{applicationName}/.+ /api/rest_s/v1/{applicationName}/.+
2).Request specs
{ "method":"/api/rest_j/v1/entrance/execute", "data":{}, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
3).Response specs
{"method":"/api/rest_j/v1/entrance/execute","status":0, "message":Success!","data":{}}
1).Establish connection
Used to establish a WebSocket connection with Linkis.
/api/rest_j/entrance/connect
2).Request execution
Used to submit user jobs to Linkis for execution.
/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.sql" }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" } }
Parameter Name | Parameter Definition | Type | Comments |
---|---|---|---|
executeApplicationName | The Engine service expected by the user, such as Spark or hive | String | Not null |
requestApplicationName | The name of the system launching this request | String | Nullable |
params | User-defined parameters to run services | Map | Required, but values are nullable |
executionCode | The execution code submitted by the user | String | Not null |
runType | Assuming that the user executes a spark job, he may choose python, R or SQL as runType | String | Not null |
scriptPath | The script path of the execution code | String | For Scriptest, it shouldn't be null with executionCode at the same time |
Table 1 Descriptions for the parameters
{ "method": "/api/rest_j/v1/entrance/execute", "status": 0, "message": "Execution request succeeded", "data": { "execID": "030418IDEhivebdpdwc010004:10087IDE_johnnwang_21", "taskID": "123" } }
3).The push mechanism for task status, logs and progress
After submission, the status, logs and progress information will be pushed by the server. They could be retrieved by websocket protocol. The API is consistent with HTTP protocol as mentioned below. The only difference is that the schema of websocket is ws://, but http:// for HTTP protocol.
Sample response of WebSocket API
{ "method": "/api/rest_j/v1/entrance/${execID}/log", "status": 0, "message": "Returned log information", "data": { "execID": "${execID}", "log": ["errorLog","warnLog","infoLog", "allLog"], "taskID":28594, "fromLine": 56 }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
{ "method": "/api/rest_j/v1/entrance/${execID}/status", "status": 0, "message": "Return status information", "data": { "execID": "${execID}", "taskID":28594, "status": "Running", }, "websocketTag":"37fcbd8b762d465a0c870684a0261c6e" }
{ "method": "/api/rest_j/v1/entrance/${execID}/log", "status": 0, "message": "Return progress information", "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" }
For HTTP API, polling should be used to retrieve the status, logs and progress information after submission.
1).Request execution
/api/rest_j/entrance/execute
POST
{ "params": {}, "executeApplicationName":"spark", "executionCode":"show tables", "runType":"sql", "source":{ "scriptPath": "/home/linkis/linkis.sql" } }
2).Retrieve status
/api/rest_j/entrance/${execID}/status
GET
{ "method": "/api/rest_j/v1/entrance/{execID}/status", "status": 0, "message": "Succeeded to retrieve status", "data": { "execID": "${execID}", "status": "Running" } }
3).Retrieve logs
/api/rest_j/entrance/${execID}/log?fromLine=${fromLine}&size=${size}
GET
{ "method": "/api/rest_j/v1/entrance/${execID}/log", "status": 0, "message": "Return logs information", "data": { "execID": "${execID}", "log": ["errorLogs","warnLogs","infoLogs", "allLogs], "fromLine": 56 } }
4).Retrieve progress
/api/rest_j/entrance/${execID}/progress
GET
{ "method": "/api/rest_j/v1/entrance/{execID}/progress", "status": 0, "message": "Return progress information", "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 task
/api/rest_j/entrance/${execID}/kill
POST
{ "method": "/api/rest_j/v1/entrance/{execID}/kill", "status": 0, "message": "OK", "data": { "execID":"${execID}" } }
Except using the engines developed by Linkis directly, backend developers can also develop their own applications based on their requirements. Divided into Entrance, EngineManager and Engine modules, one can easily split an application to adapt to Linkis. The purpose and architecture of these three modules please refer to Linkis Architect Design Docs.
Linkis uses Spring framework as the underlying technique. So instances of some classes can be injected using Spring annotations. Linkis provides some default common implementations. If customized classes are needed by users, they can be directly injected and replace the current implementations.
1)maven dependency
<dependency> <groupId>com.webank.wedatasphere.linkis</groupId> <artifactId>linkis-ujes-entrance</artifactId> <version>0.9.4</version> </dependency>
2)Interfaces to be implemented
There is no compulsory interface in Entrance. Below interfaces can be implemented on demand.
1)maven dependency
<dependency> <groupId>com.webank.wedatasphere.linkis</groupId> <artifactId>linkis-ujes-enginemanager</artifactId> <version>0.9.4</version> </dependency>
2)Interfaces to be implemented
Below interfaces are required to be implemented in EngineManager:
1)maven dependency
<dependency> <groupId>com.webank.wedatasphere.linkis</groupId> <artifactId>linkis-ujes-engine</artifactId> <version>0.9.4</version> </dependency>
2)Interfaces to be implemented
Below interfaces are required to be implemented in Engine:
Below interfaces/beans are optional in Engine: