我真的很喜欢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的理解。
谢谢
发布于 2018-07-30 04:27:55
尝试此更改,您应该会看到不同之处
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流。
https://stackoverflow.com/questions/51582452
复制相似问题