用户A
A: “亲,用 MaxCompute Java SDK 跑做业,为何卡住不动了?”
me: “有 Logview 吗?发来看下”
A: “没有,我用的是SDK,没Logview”java
用户B
B :“亲,用 MaxCompute Java SDK 访问 Table,为何卡住半天没反应?”
me:“卡在哪一行了?”
B:"就 RestClient retry 而后卡住了"ide
用户 A 的问题在于没有 instance 的 logview,致使没法追踪 instance 的运行过程。
一般用户在建立 instance 后会调用 instance.waitForSuccess() 来等待做业运行完成,一旦做业耗时巨大,程序就卡在这一步了,此时若是有 logview ,就能查看追踪查看做业等待的具体缘由了。函数
用户 B 的问题在于 sdk 的 Restclient 自己有重试机制,从表面来看就是卡住了,没有任何输出。
若是在每次重试的时候都输出错误,就能够快速定位问题节约时间了。我已经遇到好几个公共云用户由于缺包致使一直卡住几分钟才丢出异常,严重影响了工做效率。spa
那么问题能够归结为下面两点:日志
答案很简单, MaxCompute Java SDK 提供了 logview 接口,详情可查看 SDK Java Doccode
String logview = odps.logview().generateLogView(instance, 7 * 24);
两个参数: instance 对象,logview token 超时时间 (单位:小时)orm
再次提醒用户,在使用 SDK 的时候,请为每一个 instance 记录 Logview,一旦遇到问题可快速追踪。对象
固然若是改代码很麻烦,那还有一个绝招。在 MaxCompute Console 中使用 wait <instance_id>
命令也能够获得Logview。token
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)); } }