问题描述
假设我在一个大型群集上有一个大型IStreamMap,而我仅只想对几个键进行操作。我可以对过滤器表达式进行如下所示的修改,但是我的理解是,它将在所有节点上运行。即使最终没有任何结果,99%的节点也将被迫流式传输地图。有没有办法让Hazelcast Jet集群仅在与那些键相对应的节点上运行该操作?下面应该工作的代码,但是我认为它没有效率。 (就我而言,我可能会在大型分布式地图上多次运行此操作,因此,如果我能提前告知99%的节点与所选对象无关,我不希望每个节点都尝试执行此操作。键。)
final IStreamMap<String,Integer> streamMap = instance1.getMap("source");
// stream of entries,you can grab keys from it
streamMap.stream()
.filter(key -> key == 1 || key = 9999999)
.forEach(key -> <do something interesting>));
解决方法
我认为,三年前,
IStreamMap
已从Hazelcast Jet中删除。您应该通过其Pipeline API使用Jet。
您可以尝试将map
来源与谓词一起使用:
Pipeline p = Pipeline.create();
BatchStage<Entry<K,V>> stage = p.readFrom(Sources.map("name",(Map.Entry<K,V> mapEntry) -> myCondition(mapEntry),e -> e));
尽管如此,它仍然会扫描整个地图。如果您只是拥有一组您感兴趣的密钥,那么可能更适合您的用例的是IMap.executeOnKeys()
。