【问题标题】:Hazelcast Jet java.util.streamingHazelcast Jet java.util.streaming
【发布时间】:2018-07-30 04:27:55
【问题描述】:

我真的很喜欢 jazelcast jet 如何与 java util 流一起工作,但是当我运行这些流时,我很困惑这是如何以分布式方式运行的。

    public class IstreamHazelcastDemo {

    public static void main( String[] args ) {

        JetInstance jet = Jet.newJetInstance();
        Jet.newJetInstance();

        IListJet<String> list = jet.getList("list");


        for(int i = 0; i < 50; i++) {
            list.add("test" + i);
        }

         DistributedStream.fromList(list)
                .map(word -> {
                    System.out.println("word: " + word);
                    return word.toUpperCase();
                })
                .collect(DistributedCollectors.toIList("sink"))
                 .forEach(System.out::println);


    }
}

这是一个简单的示例,我首先创建一个 jet 实例,然后运行另一个主程序,然后运行此代码,使其形成一个由 2 个节点组成的集群。因此,当我运行上面的代码时,我希望看到 map 函数中的 print 语句将在两个节点中打印,因为我认为它是分布式的并且会发送到多个节点。但它总是只在一个节点上执行整个流程。我正在思考这是如何分发的,或者是我对 hazelcast Jet 缺乏了解。

谢谢

【问题讨论】:

    标签: java-stream hazelcast-jet


    【解决方案1】:

    试试这个改变,你应该会看到不同

            IMapJet<String, String> map = jet.getMap("map");
    
            for(int i = 0; i < 50; i++) {
                map.put("test" + i, "test" + i);
            }
    
             DistributedStream.fromMap(map)
                .map(entry -> {
                    System.out.println("word: " + entry.getKey());
                    return entry.getKey().toUpperCase();
                })
                .collect(DistributedCollectors.toIList("sink"))
                .forEach(System.out::println);
    

    这里的区别在于分布和分区。

    列表是分布式的,意思是发送到网格进行托管,但它仍然是单个对象。一个网格成员持有它,因此您会从映射器中看到一个 sysout 流。

    地图是分布式的,但也是分区的,这意味着托管在网格成员之间拆分。如果有两个网格成员,他们将分别拥有大约一半的地图内容。因此,您会看到多个 sysout 流。

    【讨论】:

    • 这就是它的工作原理。我现在明白这是如何工作的。我对其他代码也有类似的问题,但现在一切都说得通了。非常感谢哥们:)
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多