T
- type of item the partitioner accepts@FunctionalInterface public interface Partitioner<T> extends Serializable
DAG
edge that decides
on the partition ID of an item traveling over it. The partition ID
determines which cluster member and which instance of Processor
on
that member an item will be forwarded to.
Jet's partitioning piggybacks on Hazelcast partitioning. Standard Hazelcast protocols are used to distribute partition ownership over the members of the cluster. However, if a DAG edge is configured as non-distributed, then on each member there will be some destination processor responsible for any given partition.
Modifier and Type | Interface and Description |
---|---|
static class |
Partitioner.Default
Partitioner which applies the default Hazelcast partitioning strategy.
|
Modifier and Type | Field and Description |
---|---|
static Partitioner<Object> |
HASH_CODE
Partitioner which calls
Object.hashCode() and coerces it with the
modulo operation into the allowed range of partition IDs. |
Modifier and Type | Method and Description |
---|---|
static Partitioner<Object> |
defaultPartitioner()
Returns a partitioner which applies the default Hazelcast partitioning.
|
int |
getPartition(T item,
int partitionCount)
Returns the partition ID of the given item.
|
default void |
init(DefaultPartitionStrategy strat)
Callback that injects the Hazelcast's default partitioning strategy into
this partitioner so it can be consulted by the
getPartition(Object, int) method. |
static final Partitioner<Object> HASH_CODE
Object.hashCode()
and coerces it with the
modulo operation into the allowed range of partition IDs. The primary
reason to prefer this over the default is performance and it's a safe
choice on local edges.
WARNING: this is a dangerous strategy to use on
distributed edges. Care must be taken to ensure that the produced
hashcode remains stable across serialization-deserialization cycles as
well as across all JVM processes. Consider a hashCode()
method
that is correct with respect to its contract, but not with respect to
the stricter contract given above. Take the following scenario:
default void init(@Nonnull DefaultPartitionStrategy strat)
getPartition(Object, int)
method.
The creation of instances of the Partitioner
type is done in
user's code, but the Hazelcast partitioning strategy only becomes
available after the partitioner is deserialized on each target member.
This method solves the lifecycle mismatch.
int getPartition(@Nonnull T item, int partitionCount)
partitionCount
- the total number of partitions in use by the underlying Hazelcast instancestatic Partitioner<Object> defaultPartitioner()
MurmurHash
-based algorithm to retrieve the partition
ID. This is quite a bit of work, but has stable results across all JVM
processes, making it a safe default.Copyright © 2021 Hazelcast, Inc.. All rights reserved.