我有 3 个分布式映射,其中对象具有一个共享属性 - identifier
。此标识符
用作一个映射的键,而另外 2 个映射则使用集群范围的全局 ID 作为键。还有一个 Map-Reduce 作业,它结合此 identifier
对象相关的内容,并将结果存储到另一个映射中。其想法是最大限度地减少集群间网络流量,因此作业仅与正在执行的一个成员进行通信。
问题是:我是否需要执行任何额外操作来确保不同分布式映射的分区物理存储在一个成员上?
最佳答案
PartitionAware将为您做这件事。
如果要保证三个对象驻留在同一分区中,它们的关键类应该实现 PartitionAware 并从 getPartitionKey()
方法返回相同的结果。
例如,让同一家庭的所有成员都在一起:
public class Person implements PartitionAware, Serializable {
private String firstName;
private String lastName;
public Object getPartitionKey() {
return this.lastName;
}
您可以使用hazelcastInstance.getPartitionService().getPartition(key).getPartitionId()验证分区
分区 0 包含 map X、 map Y、 map Z 中每个 map 的第一部分。分区 1 包含下一部分等。
关于mapreduce - Hazelcast:确保相关对象物理存储在同一成员上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46222195/