本文为您介绍Java SDK的常见问题。

MaxCompute Java SDK执行任务卡顿如何处理?

  • 问题现象
    • 用户A使用MaxCompute Java SDK执行作业,任务卡顿了,没有Logview信息。
    • 用户B使用MaxCompute Java SDK访问表,执行RestClient Retry操作后任务卡顿。
  • 问题原因
    • 用户A的问题为没有Instance的Logview,导致无法追踪Instance的运行过程。Instance创建后会调用instance.waitForSuccess()方法,一旦作业耗时巨大,程序就会卡在这一步。此时如果有Logview,就可以查看追踪作业等待的具体原因。
    • 用户B的问题为SDK的Restclient本身有重试机制,从表面来看就是卡住了,没有任何输出。如果在每次重试的时候都输出错误,就可以快速定位问题。
  • 解决方案
    • 使用MaxCompute Java SDK生成Instance Logview。
      MaxCompute Java SDK提供了Logview接口,详情请参见SDK Java Doc,代码如下。
      String logview = odps.logview().generateLogView(instance, 7*24);                  
      说明
      • 两个参数:Instance对象,Logview Token超时时间(单位:小时)。
      • 提醒用户在使用SDK的时候,请为每个Instance记录Logview,一旦遇到问题可快速追踪。
      • 在MaxCompute客户端中使用wait < instance_id >命令可以获得Logview。
    • 每次执行RestClient Retry操作时输出错误日志。
      MaxCompute Java SDK提供了抽象类RetryLogger,详情请参见SDK Java Doc,代码如下。
      public static abstract class RetryLogger {
       /**
        * 当RestClent发生重试前的回调函数。
       *
        * @param e
        *     错误异常。
        * @param retryCount
        *     重试计数。
        * @param retrySleepTime
        *     下次需要的重试时间。
       */
       public abstract void onRetryLog(Throwable e, long retryCount, long retrySleepTime);
      }                               

      您只需实现一个自己的RetryLogger子类,然后在初始化ODPS对象的时候使用 odps.getRestClient().setRetryLogger(new UserRetryLogger());就可以将日志输出。

      典型的实现如下。
      // init odps
      odps.getRestClient().setRetryLogger(new UserRetryLogger());
      // your retry logger
      public class UserRetryLogger extends RetryLogger {
       @Override
       public void onRetryLog(Throwable e, long retryCount, long     sleepTime) {
        if (e != null && e instanceof OdpsException) {
           String requestId = ((OdpsException) e).getRequestId();
                   if (requestId != null) {
                         System.err.println(String.format(
                 "Warning: ODPS request failed, requestID:%s,     retryCount:%d, will retry in %d seconds.",
                 requestId, retryCount, sleepTime));
             return;
           }
        }
        System.err.println(String.format(
             "Warning: ODPS request failed:%s, retryCount:%d, will     retry in %d seconds.", e.getMessage(),retryCount,
             sleepTime));
       }
      }

MaxCompute如何下载SDK的DOC?

目前MaxCompute的SDK代码已经托管在MAVEN上了,您可以到MAVEN服务器上下载。例如MapReduce的SDK,您可以在MAVEN中搜索 odps-sdk-mapred,单击file_download选择对应的文件类型下载。

同样,您也可以搜索odps-sdk-udf下载相关内容。

MaxCompute运行代码时,报错为java.lang.ClassNotFoundException,怎么处理?

出现上述报错,是因为您在引入包的时候,没有引入其相关的依赖包或者某个包重复引入。请排查一下本地环境配置。

如果您是在MaxCompute上执行MappeReduce任务时出现此错误,请检查是否将依赖的包通过-resources参数引用进来。

报错OpenJDK 64-Bit Server VM warning怎么处理?

  • 问题现象:报错信息如下。
    OpenJDK 64-Bit Server VM warning: Insufficient space for shared memory
  • 问题原因:出现上述报错,是因为临时文件的目录空间不够了。
  • 解决方法:可以通过df命令,查看空间使用情况。清理临时文件的目录空间。