IgniteException:查询执行失败 ScanQuery
IgniteException: Query execution failed ScanQuery
我在使用 Ignite 时遇到了这个异常
class org.apache.ignite.IgniteException: Query execution failed: GridCacheQueryBean [qry=GridCacheQueryAdapter [type=SCAN, clsName=null, clause=null, filter=org.apache.ignite.yardstick.cache.IgniteScanQueryBenchmark@5cbed480, part=null, incMeta=false, metrics=GridCacheQueryMetricsAdapter [minTime=41, maxTime=41, avgTime=41.0, execs=1, fails=1, executed=true], pageSize=1024, timeout=0, keepAll=true, incBackups=false, dedup=false, prj=null, keepPortable=false, subjId=0ae47ff7-9cc1-4b57-88cf-8453f5f21625, taskHash=0], rdc=null, trans=null]
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:166)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.onHasNext(IgniteCacheProxy.java:406)
at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
at org.apache.ignite.internal.processors.cache.QueryCursorImpl.getAll(QueryCursorImpl.java:71)
还有我的代码
IgniteBiPredicate<Integer, Person> filter = new IgniteBiPredicate<Integer, Person>() {
@Override
public boolean apply(Integer key, Person p) {
return p.getSalary() >= minSalary && p.getSalary() <= maxSalary;
}
};
QueryCursor<Person> cursor = cache.query(new ScanQuery(filter));
return cursor.getAll();
我的代码有什么问题
版本
ver. 1.2.0-incubating#20150616-sha1:9fb960ff
2015 Copyright(C) Apache Software Foundation
您的代码看起来是正确的。但是你提供了整个踪迹吗?它应该具有提供有关失败原因的更多信息的原因。您还可以检查远程节点日志。
您很可能遇到了某种序列化错误。请尝试以下操作:
- 将您的谓词转换为顶级 class。匿名 class 引用了父对象,因此您可能正在序列化不应序列化的内容。
- 确保谓词 class 在所有节点上都可用。
我理解此线程中的 解决了我的问题,但在阅读该答案后我几乎没有疑问。我想通过回答我是如何处理它们来分享我在这个话题中的经验
1) How do I convert my predicate to a top level class when I am depending on variables and parameters present in enclosing method?
您可以将这些参数作为 class 变量引入并进行构造函数初始化
我就是这样做的
package com.ignite.filters
public class MatchingClientIdsCondition implements IgniteBiPredicate<String, Object> {
private String clientId;
public MatchingClientIdsCondition() {
super();
}
public MatchingClientIdsCondition(String clientId) {
this.clientId = clientId;
}
@Override
public boolean apply(String key, Object value) {
return key.matches(clientId + "(.*)");
}
}
2) How should I deploy my predicate class in all nodes?
移动到存在谓词 class 的包的基本目录(在我的例子中,我必须移动到 com 目录)并准备 jar 文件
使用命令 jar cvf <jar name> .
准备一个 jar 文件,或者您可以在 eclipse 中使用导出选项。
将此 JAR 复制到所有点燃节点中的 libs 文件夹
我在使用 Ignite 时遇到了这个异常
class org.apache.ignite.IgniteException: Query execution failed: GridCacheQueryBean [qry=GridCacheQueryAdapter [type=SCAN, clsName=null, clause=null, filter=org.apache.ignite.yardstick.cache.IgniteScanQueryBenchmark@5cbed480, part=null, incMeta=false, metrics=GridCacheQueryMetricsAdapter [minTime=41, maxTime=41, avgTime=41.0, execs=1, fails=1, executed=true], pageSize=1024, timeout=0, keepAll=true, incBackups=false, dedup=false, prj=null, keepPortable=false, subjId=0ae47ff7-9cc1-4b57-88cf-8453f5f21625, taskHash=0], rdc=null, trans=null]
at org.apache.ignite.internal.processors.cache.query.GridCacheQueryFutureAdapter.next(GridCacheQueryFutureAdapter.java:166)
at org.apache.ignite.internal.processors.cache.IgniteCacheProxy.onHasNext(IgniteCacheProxy.java:406)
at org.apache.ignite.internal.util.GridCloseableIteratorAdapter.hasNextX(GridCloseableIteratorAdapter.java:53)
at org.apache.ignite.internal.util.lang.GridIteratorAdapter.hasNext(GridIteratorAdapter.java:45)
at org.apache.ignite.internal.processors.cache.QueryCursorImpl.getAll(QueryCursorImpl.java:71)
还有我的代码
IgniteBiPredicate<Integer, Person> filter = new IgniteBiPredicate<Integer, Person>() {
@Override
public boolean apply(Integer key, Person p) {
return p.getSalary() >= minSalary && p.getSalary() <= maxSalary;
}
};
QueryCursor<Person> cursor = cache.query(new ScanQuery(filter));
return cursor.getAll();
我的代码有什么问题
版本
ver. 1.2.0-incubating#20150616-sha1:9fb960ff 2015 Copyright(C) Apache Software Foundation
您的代码看起来是正确的。但是你提供了整个踪迹吗?它应该具有提供有关失败原因的更多信息的原因。您还可以检查远程节点日志。
您很可能遇到了某种序列化错误。请尝试以下操作:
- 将您的谓词转换为顶级 class。匿名 class 引用了父对象,因此您可能正在序列化不应序列化的内容。
- 确保谓词 class 在所有节点上都可用。
我理解此线程中的
1) How do I convert my predicate to a top level class when I am depending on variables and parameters present in enclosing method?
您可以将这些参数作为 class 变量引入并进行构造函数初始化
我就是这样做的
package com.ignite.filters
public class MatchingClientIdsCondition implements IgniteBiPredicate<String, Object> {
private String clientId;
public MatchingClientIdsCondition() {
super();
}
public MatchingClientIdsCondition(String clientId) {
this.clientId = clientId;
}
@Override
public boolean apply(String key, Object value) {
return key.matches(clientId + "(.*)");
}
}
2) How should I deploy my predicate class in all nodes?
移动到存在谓词 class 的包的基本目录(在我的例子中,我必须移动到 com 目录)并准备 jar 文件
使用命令 jar cvf <jar name> .
准备一个 jar 文件,或者您可以在 eclipse 中使用导出选项。
将此 JAR 复制到所有点燃节点中的 libs 文件夹