Hazelcast keySet流媒体?

时间:2017-02-14 13:40:04

标签: java memory java-stream hazelcast hazelcast-jet

我是Hazelcast的新手,我试图用它来存储数据,这个数据太大而不适合放在一台机器上。

我需要实现的一个过程是遍历地图中的每个值并对它们执行某些操作 - 不累积或聚合,我不需要一次查看所有数据,所以没有记忆问题。

我的琐碎实现是使用IMap.keySet(),然后遍历所有键以依次获取每个存储的值(并允许在处理后将值设置为GC),但我担心的是系统中的数据如此之多,即使只获得密钥列表也会大到足以给系统带来不必要的压力。

我希望有一个流API,我可以流式传输密钥(甚至是完整的条目),本地节点不必在本地缓存整个集合 - 但是找不到任何与之相关的内容我在文档中。

我很感激您提出的任何建议。感谢。

2 个答案:

答案 0 :(得分:1)

Hazelcast Jet提供j.u.s的分布式版本,并为IMap增加了“流媒体”功能。 它允许在Hazelcast集群上执行Java Streams API。

import com.hazelcast.jet.JetInstance;
import com.hazelcast.jet.stream.DistributedCollectors;
import com.hazelcast.jet.stream.IStreamMap;
import com.hazelcast.jet.stream.IStreamList;

import static com.hazelcast.jet.stream.DistributedCollectors.toIList;

    final IStreamMap<String, Integer> streamMap = instance1.getMap("source");
    // stream of entries, you can grab keys from it
    IStreamList<String> counts = streamMap.stream()
                    .map(entry -> entry.getKey().toLowerCase())
                    .filter(key -> key.length() >= 5)
                    .sorted()
                    // this will store the result on cluster as well
                    // so there is no data movement between client and cluster
                    .collect(toIList());

请详细了解jet here以及更多示例here

干杯, 维克

答案 1 :(得分:0)

虽然Hazelcast Jet流的实现看起来令人印象深刻,但我还没有多少时间投资于升级到Hazelcast Jet(在我们非常标准的Vert.x设置中)。相反,我使用IMap.executeOnEntries似乎与@Vik Gamov的Hazelcast Jet相同,除了更令人讨厌的语法。

我的例子:

myMap.executeOnEntries(new EntryProcessor<String,MyEntity>(){
    private static final long serialVersionUID = 1L;
    @Override
    public Object process(Entry<String, MyEntity> entry) {
        entry.getValue().fondle();
        return null;
    }
    @Override
    public EntryBackupProcessor<String, MyEntity> getBackupProcessor() {
        return null;
    }});

正如您所看到的,语法非常烦人:

  1. 我们需要创建一个可以序列化到群集的实际对象 - 这里没有花哨的lambda(不要使用我的序列号,如果你复制和粘贴它 - 它被设计破坏了。)
  2. 它不能成为lambda的一个原因是界面不起作用 - 你需要另一种方法来处理备份副本(或至少声明你不想像我一样处理它们),我明确了它的重要性,并不是一直都很重要,我猜它在极少数情况下是唯一重要的。
  3. 显然,你不能(或者至少不是微不足道)从流程中返回数据 - 这在我的案例中并不重要,但仍然如此。