背景:
正在做一个odps查询相关的工具,使用sofaboot引入odps的sdk,一切都很顺利,之前技术验证的代码都是跑通的;
然后,引入配置文件获取配置信息,再启动。。。
就出现了下列的错误:
Exception in thread "main" com.aliyun.odps.ReloadException: No such object.
at com.aliyun.odps.LazyLoad.lazyLoad(LazyLoad.java:65)
at com.aliyun.odps.Table.isVirtualView(Table.java:476)
at com.aliyun.odps.Table.isPartitioned(Table.java:1314)
at com.wjh.test002.main(test002.java:31)
Caused by: [404] com.aliyun.odps.NoSuchObjectException: No such object.
at com.aliyun.odps.rest.RestClient.handleErrorResponse(RestClient.java:391)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:330)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:284)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:238)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:179)
at com.aliyun.odps.Table.reload(Table.java:257)
at com.aliyun.odps.LazyLoad.lazyLoad(LazyLoad.java:63)
... 3 more
Process finished with exit code 1
排查过程:
debug 内容:
Connected to the target VM, address: '127.0.0.1:52094', transport: 'socket'
Exception in thread "main" com.aliyun.odps.ReloadException: No such object.
at com.aliyun.odps.LazyLoad.lazyLoad(LazyLoad.java:65)
at com.aliyun.odps.Table.isVirtualView(Table.java:476)
at com.aliyun.odps.Table.isPartitioned(Table.java:1314)
at com.wjh.test002.main(test002.java:31)
Caused by: [404] com.aliyun.odps.NoSuchObjectException: No such object.
at com.aliyun.odps.rest.RestClient.handleErrorResponse(RestClient.java:391)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:330)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:284)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:238)
at com.aliyun.odps.rest.RestClient.request(RestClient.java:179)
at com.aliyun.odps.Table.reload(Table.java:257)
at com.aliyun.odps.LazyLoad.lazyLoad(LazyLoad.java:63)
... 3 more
Disconnected from the target VM, address: '127.0.0.1:52094', transport: 'socket'
无有效信息
重新写个最简单的测试代码:
Account account = new AliyunAccount(accessId2, accessKey2);
Odps odps = new Odps(account);
odps.setEndpoint(endPoint2);
odps.setDefaultProject(project2);
Boolean rt = false;
try {
odps.tables().get("tmp_wjh_test001").isPartitioned();
} catch (OdpsException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
还是一样的错误
关键词搜索:odps.ReloadException: No such object 、ReloadException、odps.LazyLoad、odps.NoSuchObjectException: No such object、odps.NoSuchObjectException、RestClient.handleErrorResponse
还是找不到有效的参考信息,odps的这种错误记录内网基本没有找到
之前的关注点 一直在 reload Exception 那里,找不到方向,盲目测试耽误了很多时间;
第二天早上再次分析报错信息,RestClient.handleErrorResponse 再次让我开始怀疑网络问题,因为之前是可以跑通的,所以引发网络问题的只有一个地方,odps 的 endpoint 地址,会不会是地址配置错误了。。。
虽然不想接受,但还是换成集团内的一个常用地址再测试,通了,一句歌词飘过:千言万语 只能无语。。。
解决方法:
阿里云的odps endpoint地址有多个,特别是集团统一使用的 地址有一些是被限制的,所以并不会爆出明确的地址错误信息;
换成 公网endpoint或者vpc网络endpoint就可以了
反思:
相信已验证的代码的合理性,不要长时间怀疑自己写的有问题;
不要被一些不相关的报错信息干扰,用最小case验证,对比测试找出问题点;
这次把错误信息贴出来,希望再有同学遇到的时候可以搜索看到这里