Search in sources :

Example 1 with ConveyorCollectorWithPartition

use of com.hazelcast.jet.impl.execution.ConveyorCollectorWithPartition in project hazelcast-jet by hazelcast.

the class ExecutionPlan method createOutboundCollectors.

private OutboundCollector[] createOutboundCollectors(EdgeDef edge, int processorIndex, Map<Address, ConcurrentConveyor<Object>> senderConveyorMap) {
    final int upstreamParallelism = edge.sourceVertex().localParallelism();
    final int downstreamParallelism = edge.destVertex().localParallelism();
    final int numRemoteMembers = ptionArrgmt.remotePartitionAssignment.get().size();
    final int queueSize = edge.getConfig().getQueueSize();
    final int[][] ptionsPerProcessor = ptionArrgmt.assignPartitionsToProcessors(downstreamParallelism, edge.isDistributed());
    if (edge.routingPolicy() == RoutingPolicy.ISOLATED) {
        if (downstreamParallelism < upstreamParallelism) {
            throw new IllegalArgumentException(String.format("The edge %s specifies the %s routing policy, but the downstream vertex" + " parallelism (%d) is less than the upstream vertex parallelism (%d)", edge, RoutingPolicy.ISOLATED.name(), downstreamParallelism, upstreamParallelism));
        }
        if (edge.isDistributed()) {
            throw new IllegalArgumentException("Isolated edges must be local: " + edge);
        }
        // there is only one producer per consumer for a one to many edge, so queueCount is always 1
        ConcurrentConveyor<Object>[] localConveyors = localConveyorMap.computeIfAbsent(edge.edgeId(), e -> createConveyorArray(downstreamParallelism, 1, queueSize));
        return IntStream.range(0, downstreamParallelism).filter(i -> i % upstreamParallelism == processorIndex).mapToObj(i -> new ConveyorCollector(localConveyors[i], 0, ptionsPerProcessor[i])).toArray(OutboundCollector[]::new);
    }
    /*
         * Each edge is represented by an array of conveyors between the producers and consumers
         * There are as many conveyors as there are consumers.
         * Each conveyor has one queue per producer.
         *
         * For a distributed edge, there is one additional producer per member represented
         * by the ReceiverTasklet.
         */
    final ConcurrentConveyor<Object>[] localConveyors = localConveyorMap.computeIfAbsent(edge.edgeId(), e -> {
        int queueCount = upstreamParallelism + (edge.isDistributed() ? numRemoteMembers : 0);
        return createConveyorArray(downstreamParallelism, queueCount, queueSize);
    });
    final OutboundCollector[] localCollectors = new OutboundCollector[downstreamParallelism];
    Arrays.setAll(localCollectors, n -> new ConveyorCollector(localConveyors[n], processorIndex, ptionsPerProcessor[n]));
    // in a local edge, we only have the local collectors.
    if (!edge.isDistributed()) {
        return localCollectors;
    }
    // in a distributed edge, allCollectors[0] is the composite of local collectors, and
    // allCollectors[n] where n > 0 is a collector pointing to a remote member _n_.
    final int totalPtionCount = nodeEngine.getPartitionService().getPartitionCount();
    final OutboundCollector[] allCollectors;
    createIfAbsentReceiverTasklet(edge, ptionsPerProcessor, totalPtionCount);
    // assign remote partitions to outbound data collectors
    final Map<Address, int[]> memberToPartitions = ptionArrgmt.remotePartitionAssignment.get();
    allCollectors = new OutboundCollector[memberToPartitions.size() + 1];
    allCollectors[0] = compositeCollector(localCollectors, edge, totalPtionCount);
    int index = 1;
    for (Map.Entry<Address, int[]> entry : memberToPartitions.entrySet()) {
        allCollectors[index++] = new ConveyorCollectorWithPartition(senderConveyorMap.get(entry.getKey()), processorIndex, entry.getValue());
    }
    return allCollectors;
}
Also used : Arrays(java.util.Arrays) SnapshotContext(com.hazelcast.jet.impl.execution.SnapshotContext) ConcurrentConveyor.concurrentConveyor(com.hazelcast.internal.util.concurrent.ConcurrentConveyor.concurrentConveyor) Processor(com.hazelcast.jet.core.Processor) Address(com.hazelcast.nio.Address) OutboundCollector.compositeCollector(com.hazelcast.jet.impl.execution.OutboundCollector.compositeCollector) Util.writeList(com.hazelcast.jet.impl.util.Util.writeList) Util.idToString(com.hazelcast.jet.impl.util.Util.idToString) ProcessorTasklet(com.hazelcast.jet.impl.execution.ProcessorTasklet) Collectors.toMap(java.util.stream.Collectors.toMap) ConcurrentConveyor(com.hazelcast.internal.util.concurrent.ConcurrentConveyor) Map(java.util.Map) Util.memoize(com.hazelcast.jet.impl.util.Util.memoize) ObjectDataInput(com.hazelcast.nio.ObjectDataInput) InboundEdgeStream(com.hazelcast.jet.impl.execution.InboundEdgeStream) Collection(java.util.Collection) Util.getJetInstance(com.hazelcast.jet.impl.util.Util.getJetInstance) JobConfig(com.hazelcast.jet.config.JobConfig) Set(java.util.Set) ConcurrentInboundEdgeStream(com.hazelcast.jet.impl.execution.ConcurrentInboundEdgeStream) Collectors(java.util.stream.Collectors) Objects(java.util.Objects) Util.readList(com.hazelcast.jet.impl.util.Util.readList) List(java.util.List) DEFAULT_QUEUE_SIZE(com.hazelcast.jet.config.EdgeConfig.DEFAULT_QUEUE_SIZE) StoreSnapshotTasklet(com.hazelcast.jet.impl.execution.StoreSnapshotTasklet) ObjectDataOutput(com.hazelcast.nio.ObjectDataOutput) IntStream(java.util.stream.IntStream) IdentifiedDataSerializable(com.hazelcast.nio.serialization.IdentifiedDataSerializable) JetInstance(com.hazelcast.jet.JetInstance) OutboundEdgeStream(com.hazelcast.jet.impl.execution.OutboundEdgeStream) RoutingPolicy(com.hazelcast.jet.core.Edge.RoutingPolicy) SenderTasklet(com.hazelcast.jet.impl.execution.SenderTasklet) HashMap(java.util.HashMap) Supplier(java.util.function.Supplier) ProcSupplierCtx(com.hazelcast.jet.impl.execution.init.Contexts.ProcSupplierCtx) ArrayList(java.util.ArrayList) JetException(com.hazelcast.jet.JetException) ConveyorCollector(com.hazelcast.jet.impl.execution.ConveyorCollector) ReceiverTasklet(com.hazelcast.jet.impl.execution.ReceiverTasklet) ILogger(com.hazelcast.logging.ILogger) ProcessorSupplier(com.hazelcast.jet.core.ProcessorSupplier) QueuedPipe(com.hazelcast.internal.util.concurrent.QueuedPipe) JetConfig(com.hazelcast.jet.config.JetConfig) NodeEngineImpl(com.hazelcast.spi.impl.NodeEngineImpl) OneToOneConcurrentArrayQueue(com.hazelcast.internal.util.concurrent.OneToOneConcurrentArrayQueue) Tasklet(com.hazelcast.jet.impl.execution.Tasklet) ProcCtx(com.hazelcast.jet.impl.execution.init.Contexts.ProcCtx) IPartitionService(com.hazelcast.spi.partition.IPartitionService) IOException(java.io.IOException) NodeEngine(com.hazelcast.spi.NodeEngine) ConveyorCollectorWithPartition(com.hazelcast.jet.impl.execution.ConveyorCollectorWithPartition) Collectors.toList(java.util.stream.Collectors.toList) OutboundCollector(com.hazelcast.jet.impl.execution.OutboundCollector) JetService(com.hazelcast.jet.impl.JetService) ProcessingGuarantee(com.hazelcast.jet.config.ProcessingGuarantee) ConcurrentConveyor(com.hazelcast.internal.util.concurrent.ConcurrentConveyor) Address(com.hazelcast.nio.Address) OutboundCollector(com.hazelcast.jet.impl.execution.OutboundCollector) ConveyorCollector(com.hazelcast.jet.impl.execution.ConveyorCollector) ConveyorCollectorWithPartition(com.hazelcast.jet.impl.execution.ConveyorCollectorWithPartition) Collectors.toMap(java.util.stream.Collectors.toMap) Map(java.util.Map) HashMap(java.util.HashMap)

Example 2 with ConveyorCollectorWithPartition

use of com.hazelcast.jet.impl.execution.ConveyorCollectorWithPartition in project hazelcast by hazelcast.

the class ExecutionPlan method createRemoteOutboundCollectors.

private OutboundCollector[] createRemoteOutboundCollectors(EdgeDef edge, String jobPrefix, int processorIndex, int totalPartitionCount, int[][] partitionsPerProcessor, InternalSerializationService jobSerializationService) {
    // the distributed-to-one edge must be partitioned and the target member must be present
    if (!edge.getDistributedTo().equals(DISTRIBUTE_TO_ALL)) {
        if (edge.routingPolicy() != RoutingPolicy.PARTITIONED) {
            throw new JetException("An edge distributing to a specific member must be partitioned: " + edge);
        }
        if (!ptionArrgmt.getRemotePartitionAssignment().containsKey(edge.getDistributedTo()) && !edge.getDistributedTo().equals(nodeEngine.getThisAddress())) {
            throw new JetException("The target member of an edge is not present in the cluster or is a lite member: " + edge);
        }
    }
    Map<Address, ConcurrentConveyor<Object>> senderConveyorMap = memberToSenderConveyorMap(edgeSenderConveyorMap, edge, jobPrefix, jobSerializationService);
    createIfAbsentReceiverTasklet(edge, jobPrefix, partitionsPerProcessor, totalPartitionCount, jobSerializationService);
    // assign remote partitions to outbound data collectors
    Address distributeTo = edge.getDistributedTo();
    Map<Address, int[]> memberToPartitions = distributeTo.equals(DISTRIBUTE_TO_ALL) ? ptionArrgmt.getRemotePartitionAssignment() : ptionArrgmt.remotePartitionAssignmentToOne(distributeTo);
    OutboundCollector[] remoteCollectors = new OutboundCollector[memberToPartitions.size()];
    int index = 0;
    for (Map.Entry<Address, int[]> entry : memberToPartitions.entrySet()) {
        Address memberAddress = entry.getKey();
        int[] memberPartitions = entry.getValue();
        ConcurrentConveyor<Object> conveyor = senderConveyorMap.get(memberAddress);
        remoteCollectors[index++] = new ConveyorCollectorWithPartition(conveyor, processorIndex, memberPartitions);
    }
    return remoteCollectors;
}
Also used : ConcurrentConveyor(com.hazelcast.internal.util.concurrent.ConcurrentConveyor) Address(com.hazelcast.cluster.Address) OutboundCollector(com.hazelcast.jet.impl.execution.OutboundCollector) JetException(com.hazelcast.jet.JetException) ConveyorCollectorWithPartition(com.hazelcast.jet.impl.execution.ConveyorCollectorWithPartition) Collectors.toMap(java.util.stream.Collectors.toMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap)

Aggregations

ConcurrentConveyor (com.hazelcast.internal.util.concurrent.ConcurrentConveyor)2 JetException (com.hazelcast.jet.JetException)2 ConveyorCollectorWithPartition (com.hazelcast.jet.impl.execution.ConveyorCollectorWithPartition)2 OutboundCollector (com.hazelcast.jet.impl.execution.OutboundCollector)2 HashMap (java.util.HashMap)2 Map (java.util.Map)2 Collectors.toMap (java.util.stream.Collectors.toMap)2 Address (com.hazelcast.cluster.Address)1 ConcurrentConveyor.concurrentConveyor (com.hazelcast.internal.util.concurrent.ConcurrentConveyor.concurrentConveyor)1 OneToOneConcurrentArrayQueue (com.hazelcast.internal.util.concurrent.OneToOneConcurrentArrayQueue)1 QueuedPipe (com.hazelcast.internal.util.concurrent.QueuedPipe)1 JetInstance (com.hazelcast.jet.JetInstance)1 DEFAULT_QUEUE_SIZE (com.hazelcast.jet.config.EdgeConfig.DEFAULT_QUEUE_SIZE)1 JetConfig (com.hazelcast.jet.config.JetConfig)1 JobConfig (com.hazelcast.jet.config.JobConfig)1 ProcessingGuarantee (com.hazelcast.jet.config.ProcessingGuarantee)1 RoutingPolicy (com.hazelcast.jet.core.Edge.RoutingPolicy)1 Processor (com.hazelcast.jet.core.Processor)1 ProcessorSupplier (com.hazelcast.jet.core.ProcessorSupplier)1 JetService (com.hazelcast.jet.impl.JetService)1