Mapreduce Hazelcast:确保相关对象物理存储在同一成员上

Mapreduce Hazelcast:确保相关对象物理存储在同一成员上,mapreduce,distributed-computing,hazelcast,Mapreduce,Distributed Computing,Hazelcast,我有3个分布式映射,其中对象有一个共享属性标识符。此标识符用作一个映射的键,而其他两个映射使用集群范围的全局ID作为键。还有一个Map-Reduce作业,它将与此标识符对象相关的内容组合在一起,并将结果存储到另一个Map中。其思想是最大限度地减少集群间的网络流量,使作业只与执行它的一个成员通信 问题是:我是否需要执行任何额外的操作来确保不同分布式映射的分区物理存储在一个成员上 将为您完成此操作 如果您想保证三个对象驻留在同一个分区中,那么它们的键类应该实现PartitionAware并从getP

我有3个分布式映射,其中对象有一个共享属性标识符。此标识符用作一个映射的键,而其他两个映射使用集群范围的全局ID作为键。还有一个Map-Reduce作业,它将与此标识符对象相关的内容组合在一起,并将结果存储到另一个Map中。其思想是最大限度地减少集群间的网络流量,使作业只与执行它的一个成员通信

问题是:我是否需要执行任何额外的操作来确保不同分布式映射的分区物理存储在一个成员上

将为您完成此操作

如果您想保证三个对象驻留在同一个分区中,那么它们的键类应该实现PartitionAware并从getPartitionKey方法返回相同的结果

例如,要使同一家庭的所有成员保持在一起:

public class Person implements PartitionAware, Serializable {
    private String firstName;
    private String lastName;

    public Object getPartitionKey() {
        return this.lastName;
    }
您可以使用hazelcastInstance.getPartitionService.getPartitionkey.getPartitionId验证分区


分区0包含映射X、映射Y、映射Z的第一部分。分区1包含下一部分,等等。

getPartitionKey结果稍后将用于哈希算法,是否正确?默认的分区数是271,我希望实现PartitionAware不会改变这个数字?正确,路由密钥哈希是由分区计数来确定分区的模数。无论是否使用PartitionAware,属性hazelcast.partition.count都可以更改。Fuad在这里很好地解释了这一点,即包含存储成员之间共享的条目的分区。这些分区的大小必须大致相同,以避免不平衡。确保getPartitionKey不会为每个输入返回相同的结果,否则所有内容都将在同一个分区中结束,系统将陷入混乱。