Ignite &引用;“未知对”;对BinaryObject使用StreamTransformer时出现异常

Ignite &引用;“未知对”;对BinaryObject使用StreamTransformer时出现异常,ignite,Ignite,我有一个缓存,它将BinaryObject实际存储在集群中(2个节点)。Ignite版本为2.1.0。 如果我不使用任何StreamReceiver(包括StreamTransformer),使用以下代码添加大量BinaryObject数据时不会出现问题: IgniteDataStreamer<Long,BinaryObject> ds = ignite.dataStreamer(CACHE_NAME); SecureRandom random = new SecureRandom(

我有一个缓存,它将BinaryObject实际存储在集群中(2个节点)。Ignite版本为2.1.0。 如果我不使用任何StreamReceiver(包括StreamTransformer),使用以下代码添加大量BinaryObject数据时不会出现问题:

IgniteDataStreamer<Long,BinaryObject> ds = ignite.dataStreamer(CACHE_NAME);
SecureRandom random = new SecureRandom();
long i = 0;
long count = 1000000;
while(i++<count){
    builder.setField("id", i);
    builder.setField("name", "Test"+i);
    builder.setField("age", random.nextInt(30));
    builder.setField("score", random.nextDouble()*100d);
    builder.setField("birthday", new Date());
    ds.addData(i, builder.build());
    if(i%10000==0){
        System.out.println(i+" added...");
    }
}

我应该怎么做才能修复它?

您会得到
ClassNotFoundException
,因为
DataStreamer
在内部尝试反序列化存储的
BinaryObject
。要使它直接使用
BinaryObject
s,您应该在使用它之前调用
ds.keepBinary(true)


代码中的另一个问题是如何使用
entry.getValue()
的结果。实际上,传递给
process
方法的
entry
表示以前存储在缓存中的记录,所以您很可能在那里得到空值。如果您想获得新分配的值,应该使用
参数[0]
值。

非常感谢!正如您所说,在使用ds.keepBinary(true)之前,我尝试调用它。“ClassNotFoundException”问题不再存在。entry.getValue()确实返回空值,参数[0]就是我想要的。但是我不明白参数可能是几个对象,那么每个对象意味着什么呢?@CrazyRen这种行为在javadoc中有描述:所以,实际上只有一个对象可能出现在那里。我明白了。再次非常感谢。
ds.receiver(new StreamTransformer<Long,BinaryObject>(){
    @Override
    public Object process(MutableEntry<Long, BinaryObject> entry, Object... arguments)
            throws EntryProcessorException {
        // TODO Auto-generated method stub
        Long key = entry.getKey();
        BinaryObject value = entry.getValue();
        BinaryObjectBuilder builder = value.toBuilder();
        //want to change the value of "name" field
        builder.setField("name", "Modify"+builder.getField("name"));
        entry.setValue(builder.build());
        return null;
    }
});
while(...){
    //... original code to build BinaryObject data and call ds.add method
}
[09:52:36] Topology snapshot [ver=61, servers=2, clients=0, CPUs=8, heap=2.7GB]
10000 added...
20000 added...
30000 added...
40000 added...
[09:52:39,174][SEVERE][data-streamer-#54%null%][DataStreamerImpl] DataStreamer operation failed.
class org.apache.ignite.IgniteCheckedException: Failed to finish operation (too many remaps): 32
    at org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$5.apply(DataStreamerImpl.java:869)
    at org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$5.apply(DataStreamerImpl.java:834)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:382)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.unblock(GridFutureAdapter.java:346)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.unblockAll(GridFutureAdapter.java:334)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:494)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:473)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:461)
    at org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$Buffer$2.apply(DataStreamerImpl.java:1572)
    at org.apache.ignite.internal.processors.datastreamer.DataStreamerImpl$Buffer$2.apply(DataStreamerImpl.java:1562)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.notifyListener(GridFutureAdapter.java:382)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.unblock(GridFutureAdapter.java:346)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.unblockAll(GridFutureAdapter.java:334)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:494)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:473)
    at org.apache.ignite.internal.util.future.GridFutureAdapter.onDone(GridFutureAdapter.java:461)
    at org.apache.ignite.internal.processors.closure.GridClosureProcessor$2.body(GridClosureProcessor.java:967)
    at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:110)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: class org.apache.ignite.IgniteCheckedException: Unknown pair [platformId=0, typeId=-1496463502]
    at org.apache.ignite.internal.util.IgniteUtils.cast(IgniteUtils.java:7229)
    ... 5 more
Caused by: java.lang.ClassNotFoundException: Unknown pair [platformId=0, typeId=-1496463502]
    at org.apache.ignite.internal.MarshallerContextImpl.getClassName(MarshallerContextImpl.java:392)
    at org.apache.ignite.internal.MarshallerContextImpl.getClass(MarshallerContextImpl.java:342)
    at org.apache.ignite.internal.binary.BinaryContext.descriptorForTypeId(BinaryContext.java:686)
    at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize0(BinaryReaderExImpl.java:1755)
    at org.apache.ignite.internal.binary.BinaryReaderExImpl.deserialize(BinaryReaderExImpl.java:1714)
    at org.apache.ignite.internal.binary.BinaryObjectImpl.deserializeValue(BinaryObjectImpl.java:797)
    at org.apache.ignite.internal.binary.BinaryObjectImpl.value(BinaryObjectImpl.java:143)
    at org.apache.ignite.internal.processors.cache.CacheObjectUtils.unwrapBinary(CacheObjectUtils.java:161)
    at org.apache.ignite.internal.processors.cache.CacheObjectUtils.unwrapBinaryIfNeeded(CacheObjectUtils.java:41)
    at org.apache.ignite.internal.processors.cache.CacheObjectContext.unwrapBinaryIfNeeded(CacheObjectContext.java:125)
    at org.apache.ignite.internal.processors.datastreamer.DataStreamerEntry$1.getValue(DataStreamerEntry.java:96)
    at org.apache.ignite.stream.StreamTransformer.receive(StreamTransformer.java:45)
    at org.apache.ignite.internal.processors.datastreamer.DataStreamerUpdateJob.call(DataStreamerUpdateJob.java:137)
    at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6608)
    at org.apache.ignite.internal.processors.closure.GridClosureProcessor$2.body(GridClosureProcessor.java:959)
    ... 4 more