blob: 00a47aa446ac5bec27343d35fe9547b533a95e1b [file] [log] [blame] [view]
### Linkis Java SDK Doc
#### 1.Introduction
Linkis provides a Java client implementation for users to have quick-access to Linkis background services using UJESClient.
#### 2 Quick start
We provided two test classes under dir ujes/client/src/test:
com.webank.wedatasphere.linkis.ujes.client.UJESClientImplTestJ # Test class based on Java
com.webank.wedatasphere.linkis.ujes.client.UJESClientImplTest # Test class based on Scala
If you have cloned the source code of Linkis, you can directly run these two test classes.
**Below sections introduce about how to write the code to complete a single execution on Linkis**
#### 3 Fast implementation
##### 3.1 maven dependency
```xml
<dependency>
<groupId>com.webank.wedatasphere.Linkis</groupId>
<artifactId>Linkis-ujes-client</artifactId>
<version>0.10.0</version>
</dependency>
```
#### 3.2 Sample implementation
- **JAVA**
```java
package com.webank.bdp.dataworkcloud.ujes.client;
import com.webank.wedatasphere.Linkis.common.utils.Utils;
import com.webank.wedatasphere.Linkis.httpclient.dws.authentication.StaticAuthenticationStrategy;
import com.webank.wedatasphere.Linkis.httpclient.dws.config.DWSClientConfig;
import com.webank.wedatasphere.Linkis.httpclient.dws.config.DWSClientConfigBuilder;
import com.webank.wedatasphere.Linkis.ujes.client.UJESClient;
import com.webank.wedatasphere.Linkis.ujes.client.UJESClientImpl;
import com.webank.wedatasphere.Linkis.ujes.client.request.JobExecuteAction;
import com.webank.wedatasphere.Linkis.ujes.client.request.ResultSetAction;
import com.webank.wedatasphere.Linkis.ujes.client.response.JobExecuteResult;
import com.webank.wedatasphere.Linkis.ujes.client.response.JobInfoResult;
import com.webank.wedatasphere.Linkis.ujes.client.response.JobProgressResult;
import com.webank.wedatasphere.Linkis.ujes.client.response.JobStatusResult;
import org.apache.commons.io.IOUtils;
import java.util.concurrent.TimeUnit;
public class UJESClientImplTestJ{
public static void main(String[] args){
// 1. To do the configuration, an instance of DWSClientConfig should be obtained from DWSClientBuilder.
DWSClientConfig clientConfig = ((DWSClientConfigBuilder) (DWSClientConfigBuilder.newBuilder()
.addUJESServerUrl("http://${ip}:${port}") //Specify the ServerUrl,The address of Willink gateway, i.e. http://{ip}:{port}
.connectionTimeout(30000) //connectionTimeOut: The connection timeout of the client
.discoveryEnabled(true).discoveryFrequency(1, TimeUnit.MINUTES) //Enable service discovery. Once enabled, newly started Gateway will be auto-dicovered.
.loadbalancerEnabled(true) // Enable load balancing. Cannot be enabled alone without service discovery enabled.
.maxConnectionSize(5) //Max connection size, aka the max concurrent threshold
.retryEnabled(false).readTimeout(30000) //whether to retry after failure
.setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy, The authentication strategy of Linkis
.setAuthTokenKey("${username}").setAuthTokenValue("${password}"))) //The authentication key,usually the username;The authentication value,usually the password
.setDWSVersion("v1").build(); //The version of Linkis background protocol, currently v1
// 2. Create a UJESClient from DWSClientConfig
UJESClient client = new UJESClientImpl(clientConfig);
// 3. Begin to execute the code
JobExecuteResult jobExecuteResult = client.execute(JobExecuteAction.builder()
.setCreator("LinkisClient-Test") //creator. The name of the system which holds the UJES client, used for system level isolation.
.addExecuteCode("show tables") //ExecutionCode. The code which is requested to be executed
.setEngineType(JobExecuteAction.EngineType$.MODULE$.HIVE()) // The engine type expected by the client, i.e. Spark, Hive, etc...
.setUser("johnnwang") //User, The user who makes this request;Used for user level multi-tenant isolation
.build());
System.out.println("execId: " + jobExecuteResult.getExecID() + ", taskId: " + jobExecuteResult.taskID());
// 4. Synch the status of script execution
JobStatusResult status = client.status(jobExecuteResult);
while(!status.isCompleted()) {
// 5. Synch the status of script execution
JobProgressResult progress = client.progress(jobExecuteResult);
Utils.sleepQuietly(500);
status = client.status(jobExecuteResult);
}
// 6. Synch the job information of script execution
JobInfoResult jobInfo = client.getJobInfo(jobExecuteResult);
// 7. Fetch the list of result sets(Multiple result sets will be generated if a user submitted multiple SQL at once)
String resultSet = jobInfo.getResultSetList(client)[0];
// 8. Fetch detailed result set content with a particular result set info
Object fileContents = client.resultSet(ResultSetAction.builder().setPath(resultSet).setUser(jobExecuteResult.getUser()).build()).getFileContent();
System.out.println("fileContents: " + fileContents);
IOUtils.closeQuietly(client);
}
}
```
- **SCALA**
```scala
import java.util.concurrent.TimeUnit
import com.webank.wedatasphere.Linkis.common.utils.Utils
import com.webank.wedatasphere.Linkis.httpclient.dws.authentication.StaticAuthenticationStrategy
import com.webank.wedatasphere.Linkis.httpclient.dws.config.DWSClientConfigBuilder
import com.webank.wedatasphere.Linkis.ujes.client.request.JobExecuteAction.EngineType
import com.webank.wedatasphere.Linkis.ujes.client.request.{JobExecuteAction, ResultSetAction}
import org.apache.commons.io.IOUtils
object UJESClientImplTest extends App {
// 1. To do the configuration, an instance of DWSClientConfig should be obtained from DWSClientBuilder.
val clientConfig = DWSClientConfigBuilder.newBuilder()
.addUJESServerUrl("http://${ip}:${port}") //Specify the ServerUrl,The address of Willink gateway, i.e. http://{ip}:{port}
.connectionTimeout(30000) //connectionTimeOut: The connection timeout of the client
.discoveryEnabled(true).discoveryFrequency(1, TimeUnit.MINUTES) //Enable service discovery. Once enabled, newly started Gateway will be auto-dicovered.
.loadbalancerEnabled(true) // Enable load balancing. Cannot be enabled alone without service discovery enabled.
.maxConnectionSize(5) //Max connection size, aka the max concurrent threshold
.retryEnabled(false).readTimeout(30000) //whether to retry after failure
.setAuthenticationStrategy(new StaticAuthenticationStrategy()) //AuthenticationStrategy, The authentication strategy of Linkis
.setAuthTokenKey("${username}").setAuthTokenValue("${password}") //The authentication key,usually the username;The authentication value,usually the password
.setDWSVersion("v1").build() //The version of Linkis background protocol, currently v1
// 2. Create a UJESClient from DWSClientConfig
val client = UJESClient(clientConfig)
// 3. Begin to execute the code
val jobExecuteResult = client.execute(JobExecuteAction.builder()
.setCreator("LinkisClient-Test") //creator. The name of the system which holds the UJES client, used for system level isolation.
.addExecuteCode("show tables") //ExecutionCode. The code which is requested to be executed
.setEngineType(EngineType.SPARK) // The engine type expected by the client, i.e. Spark, Hive, etc...
.setUser("${username}").build()) //User, The user who makes this request;Used for user level multi-tenant isolation
println("execId: " + jobExecuteResult.getExecID + ", taskId: " + jobExecuteResult.taskID)
// 4. Synch the status of script execution
var status = client.status(jobExecuteResult)
while(!status.isCompleted) {
// 5. Synch the status of script execution
val progress = client.progress(jobExecuteResult)
val progressInfo = if(progress.getProgressInfo != null) progress.getProgressInfo.toList else List.empty
println("progress: " + progress.getProgress + ", progressInfo: " + progressInfo)
Utils.sleepQuietly(500)
status = client.status(jobExecuteResult)
}
// 6. Synch the job information of script execution
val jobInfo = client.getJobInfo(jobExecuteResult)
// 7. Fetch the list of result sets(Multiple result sets will be generated if a user submitted multiple SQL at once)
val resultSet = jobInfo.getResultSetList(client).head
// 8. Fetch detailed result set content with a particular result set info
val fileContents = client.resultSet(ResultSetAction.builder().setPath(resultSet).setUser(jobExecuteResult.getUser).build()).getFileContent
println("fileContents: " + fileContents)
IOUtils.closeQuietly(client)
}
```