我有3个分布式地图,哪些对象有一个共享属性 - identifier
。此identifier
用作一个地图的关键字,而另外两个地图使用群集范围的全局ID作为关键字。还有一个Map-Reduce作业,该作业与此identifier
对象相关联,并将结果存储到另一个地图中。这个想法是最小化群集间网络流量,因此作业只与正在执行它的一个成员进行通信。
问题是:我是否需要执行任何额外操作以确保不同分布式地图的分区物理存储在一个成员上?
答案 0 :(得分:4)
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包含每个地图X,地图Y,地图Z的第一部分。分区1包含下一部分等。