-
如何处理终端输出中文乱码问题? 针对终端输出中文乱码的问题,解决方式有如下两种: 在运行配置启动参数中加入VMOptions参数: -Dfile.encoding=gbk; 这种方法可以解决部分的乱码问题,考虑到实际项目中可能用到Scanner的交互式输入的场景比较少,可以先尝试此方法。 将输出重定向到调试控制台里面:将运行配置中Console设置项中的integrated改成internal。 父主题: CodeArts IDE for Java常见问题
-
临时AK/SK认证方式样例代码 方法定义 DwsRestClient(String endpoint, String accessKey, String secretKey, String securityToken) 参数说明 参数名 是否必填 描述 endpoint 是 FabricSQL提供的服务地址。 accessKey 是 临时接入键标识 secretKey 是 临时安全接入键 securityToken 是 临时访问密钥Token 代码样例 // 从环境变量读取参数(推荐方式)
String endpoint = "example.com";
String accessKey = System.getenv("FABRICLSQL_AC
CES S_KEY");
String secretKey = System.getenv("FABRICLSQL_SECRET_KEY")
String securityToken = System.getenv("FABRICLSQL_SECURITY_TOKEN");
// 验证参数是否为空(可选)
if (endpoint == null || accessKey == null || secretKey == null || securityToken == null) {
throw new IllegalArgumentException("Missing required environment variables");
}
DwsRestClient client = new DwsRestClient(endpoint, accessKey, secretKey, securityToken);
-
永久AK/SK认证方式样例代码 方法定义 DwsRestClient(String endpoint, String accessKey, String secretKey) 参数说明 参数名 是否必填 描述 endpoint 是 FabricSQL提供的服务地址。 accessKey 是 接入键标识 secretKey 是 安全接入键 代码样例 // 从环境变量读取参数(推荐方式)
String endpoint = "example.com";
String accessKey = System.getenv("FABRICLSQL_ACCESS_KEY");
String secretKey = System.getenv("FABRICLSQL_SECRET_KEY");
// 验证参数是否为空(可选)
if (endpoint == null || accessKey == null || secretKey == null) {
throw new IllegalArgumentException("Missing required environment variables");
}
DwsRestClient client = new DwsRestClient(endpoint, accessKey, secretKey); 认证用的AK和SK硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 本示例以AK和SK保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量FABRICLSQL_ACCESS_KEY和FABRICLSQL_SECRET_KEY。
-
AK/SK认证方式样例代码 代码样例 1
2
3
4
5
6 String ak = System.getenv("xxx_SDK_AK");//访问密钥ID。
String sk = System.getenv("xxx_SDK_SK");//与访问密钥ID结合使用的密钥。
String regionName = "regionname";
String projectId = "project_id";
DLI Info dliInfo = new DLIInfo(regionName, ak, sk, projectId);
DLIClient client = new DLIClient(AuthenticationMode.AKSK, dliInfo);
参数说明及获取方式 参数说明 ak:账号 Access Key sk:账号 Secret Access Key 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放, 使用时解密, 确保安全。 本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量xxx_SDK_AK和xxx_SDK_SK。 regionName :所属区
域名 称 projectId :项目ID 通过以下方式可获取AK/SK,项目ID及对应的region信息。 登录管理控制台。 鼠标指向界面右上角的登录用户名,在下拉列表中单击“我的凭证”。 在左侧导航栏中选择“访问密钥”,单击“新增访问密钥”。根据提示输入对应信息,单击“确定”。 在弹出的提示页面单击“立即下载”。下载成功后,打开凭证文件,获取AK/SK信息。 左侧导航栏单击“API凭证”,在“项目列表”中获取“项目ID”即为project_id值,对应的“项目”即为region的值。
-
Token认证方式样例代码 代码样例 1
2
3
4
5
6
7 String domainName = "domainname";
String userName = "username";
String password = "password";
String regionName = "regionname";
String projectId = "project_id";
DLIInfo dliInfo = new DLIInfo(regionName, domainName, userName, password, projectId);
DLIClient client = new DLIClient(AuthenticationMode.TOKEN, dliInfo);
参数说明 参数获取方式请参考获取账号、
IAM 用户、项目、用户组、区域、委托的名称和ID。 domainname:账号名。 username:用户名 password:用户名密码 regionname:所属区域名称 project_id:项目ID 认证用的password硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全。 可以通过set方式修改endpoint,即dliInfo.setServerEndpoint(endpoint)。
-
查询作业状态 相关链接 查询作业状态 示例代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 private static void checkRunning(DliClient dliClient, String jobId) throws DLIException {
while (true) {
ShowSqlJobStatusResponse resp;
try {
resp = dliClient.showSqlJobStatus(new ShowSqlJobStatusRequest().withJobId(jobId));
} catch (Exception e) {
throw new DLIException("Failed to get job status by id: " + jobId, e);
}
String status = resp.getStatus().getValue();
logger.info(String.format("SparkSQL Job id %s status: %s", jobId, status));
if ("FINISHED".equals(status)) {
return;
}
if ("FAILED".equals(status) || "CANCELLED".equals(status)) {
throw new DLIException("Run job failed or cancelled, details: " + resp.getMessage());
}
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
throw new DLIException("Check job running interrupted.");
}
}
}
-
查询作业结果 相关链接: SELECT查询语句 作业参数设置 关键SDK API: com.huawei.dli.sdk.read.ResultSet,纯OBS读数据相关API调用,DLI提供了一个默认 OBS csv reader实现,可依据业务需求自定义实现。具体操作参考OBS API参考。 com.huawei.dli.sdk.SQLJob#submitQuery(),需要开启结果写作业桶特性,否则默认只预览前1000条数据。 您可以通过查询作业状态API响应体中的 result_path 来判断是否已开启作业结果写作业桶特性。 待作业运行结束后,如果result_path 以 obs:// 开头,则已开启作业结果写作业桶特性,否则未开启。 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 private static String queryData(DLIInfo dliInfo, String selectSql)
throws DLIException {
SQLJob sqlJob = new SQLJob(dliInfo, selectSql);
// 如有需要,您可在此处设置作业参数,比如:sqlJob.setConf()
// 1. 提交查询作业到DLI,使用DLI封装实现提交并等待结果。
// 注1:此处需要根据SQL执行时长预取设置超时时间,默认5min。
// 注2:此处需要开启作业结果写作业桶特性,否则默认只预览前1000条数据。
sqlJob.setJobTimeout(30 * 60);
ResultSet resultSet1 = null;
try {
resultSet1 = sqlJob.submitQuery();
handleResult(resultSet1);
} finally {
if (resultSet1 != null) {
resultSet1.close();
}
}
return sqlJob.getJobId();
}
-
查询指定作业的结果 使用说明 com.huawei.dli.sdk.SQLJob#getResultSet(),OBS读数据相关API调用,DLI提供了一个OBS csv reader实现,可依据业务需求自定义实现。 使用本方法的前提是需要开启结果写作业桶特性。可通过查询作业状态API响应体中的 result_path 来判断是否已开启作业结果写作业桶特性。待作业运行结束后,如果result_path 以 obs:// 开头,则已开启作业结果写作业桶特性,否则未开启。 相关链接 SQL语法参考基本语句 OBS文档 查询作业状态API 示例代码 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 private static void queryDataByJobId(DLIInfo dliInfo, String jobId)
throws DLIException {
// 检查该jobId对应的作业是否已运行结束,如未运行结束,则等待运行结束
SQLJob sqlJob = new SQLJob(dliInfo, null);
sqlJob.setJobId(jobId);
checkRunning(V3ClientUtils.getDliClient(dliInfo), jobId);
// 根据jobId,获取结果数据的schema、结果数据在用户作业桶中的存储路径
ShowSqlJobStatusResponse resp = V3ClientUtils.getDliClient(dliInfo)
.showSqlJobStatus(new ShowSqlJobStatusRequest().withJobId(jobId));
sqlJob.setJobStatus(resp.getStatus().getValue());
sqlJob.setResultSchema(SchemaUtils.getSchemaFromJson(resp.getDetail()));
sqlJob.setResultPath(resp.getResultPath());
sqlJob.setResultCount(resp.getResultCount() != null ? resp.getResultCount() : 0);
ResultSet resultSet = null;
try {
// 获取该jobId对应的查询结果, 并返回结果迭代器。
resultSet = sqlJob.getResultSet();
handleResult(resultSet);
} finally {
if (resultSet != null) {
resultSet.close();
}
}
}
-
操作前准备 获取AK/SK,项目ID及对应的Region信息。 管理控制台。 单击界面右上角的登录用户名,在下拉列表中单击“我的凭证”。 在左侧导航栏中选择“访问密钥”,单击“新增访问密钥”。根据提示输入对应信息,单击“确定”。 在弹出的提示页面单击“立即下载”。下载成功后,打开凭证文件,获取AK/SK信息。 左侧导航栏单击“API凭证”,在“项目列表”中获取“项目ID”即为project_id值,对应的“项目”即为region的值。
-
查询所有资源包 DLI提供查询资源列表接口,您可以使用该接口并选择相应的资源来执行作业。示例代码如下: 1
2
3
4
5
6
7
8
9
10
11 private static void listAllResources(DLIClient client) throws DLIException {
System.out.println("list all resources...");
// 通过调用DLIClient对象的listAllResources方法查询队列资源列表
Resources resources = client.listAllResources();
for (PackageResource packageResource : resources.getPackageResources()) {
System.out.println("Package resource name:" + packageResource.getResourceName());
}
for (ModuleResource moduleResource : resources.getModuleResources()) {
System.out.println("Module resource name:" + moduleResource.getModuleName());
}
}
-
删除资源包 您可以使用该接口删除已上传的资源包,示例代码如下: private static void deleteResource(DLIClient client) throws DLIException {
String resourceName = "xxxxx";
//group:资源包不在分组内,可不传入该参数
String group= "xxxxxx";
// 调用DLIClient对象的deleteResource方法删除资源
client.deleteResource(resourceName,group);
System.out.println("---------- deleteResource success ---------");
}
-
查询指定资源包 您可以使用该接口查询指定的资源包信息,示例代码如下: private static void getResource(DLIClient client) throws DLIException {
String resourceName = "xxxxx";
//group:资源包不在分组内,可不传入该参数
String group= "xxxxxx";
// 调用DLIClient对象的getResource方法查询指定资源包
PackageResource packageResource=client.getResource(resourceName,group);
System.out.println(packageResource);
}
-
将临时启动配置保存为永久配置 您可以将临时启动配置保存为永久配置,以防止其被删除。 在CodeArts IDE主工具栏上的配置列表中,选择Edit Configuration。 在打开的Debug Configuration中,在左侧的配置列表中,选择要保存为永久配置的配置。然后,在配置参数中,将Temporary切换为False。 或者,您可以在launch.json中找到相应的启动配置记录,并为其提供"temporary": false顶级属性,例如: {
"type": "javadbg",
"name": "Java Class",
"request": "launch",
"mainClass": {
"name": "com.example.Main",
"console": "integrated"
},
"temporary": false
}
-
向现有的launch.json添加新的配置 执行以下任一操作: 在launch.json编辑器中,单击编辑器右下角的 Add Configuration按钮,或将光标放置在configurations数组内,并使用代码完成(“Ctrl+I” / “Ctrl+Space” / “Ctrl+Shift+Space”(IDEA键盘映射))。 在CodeArts IDE主工具栏上的配置列表中选择Add Configuration。 在弹出的建议列表中,选择要使用的启动配置模板。 在launch.json中,使用代码完成(“Ctrl+I” / “Ctrl+Space” / “Ctrl+Shift+Space”(IDEA键盘映射))查看可用属性及其值的列表。
-
变量替换 CodeArts IDE将常用路径和其他值作为变量提供,并支持在launch.json中的字符串中进行变量替换,因此您不必在启动配置中使用绝对路径。 支持以下预定义变量: ${cwd} - CodeArts IDE启动时任务运行器的当前工作目录。 ${defaultBuildTask} - 默认构建任务的名称。 ${extensionInstallFolder} - 指定扩展安装的路径。 ${fileBasenameNoExtension} - 当前打开文件的无扩展名的基本名称。 ${fileBasename} - 当前打开文件的基本名称。 ${fileDirname} - 当前打开文件的目录名。 ${fileExtname} - 当前打开文件的扩展名。 ${file} - 当前打开的文件。 ${lineNumber} - 活动文件中当前选定的行号。 ${pathSeparator} - 操作系统用于分隔文件路径组件的字符。 ${relativeFileDirname} - 相对于workspaceFolder的当前打开文件的目录名。 ${relativeFile} - 相对于workspaceFolder的当前打开文件。 ${selectedText} - 活动文件中当前选定的文本。 ${workspaceFolderBasename} - 在CodeArts IDE中打开的文件夹的名称,不包含任何斜杠(/)。 ${workspaceFolder} - 在CodeArts IDE中打开的文件夹的路径。