use of org.apache.flink.streaming.api.operators.Output in project flink by apache.
the class OperatorChain method createOutputCollector.
private <T> WatermarkGaugeExposingOutput<StreamRecord<T>> createOutputCollector(StreamTask<?, ?> containingTask, StreamConfig operatorConfig, Map<Integer, StreamConfig> chainedConfigs, ClassLoader userCodeClassloader, Map<StreamEdge, RecordWriterOutput<?>> streamOutputs, List<StreamOperatorWrapper<?, ?>> allOperatorWrappers, MailboxExecutorFactory mailboxExecutorFactory) {
List<Tuple2<WatermarkGaugeExposingOutput<StreamRecord<T>>, StreamEdge>> allOutputs = new ArrayList<>(4);
// create collectors for the network outputs
for (StreamEdge outputEdge : operatorConfig.getNonChainedOutputs(userCodeClassloader)) {
@SuppressWarnings("unchecked") RecordWriterOutput<T> output = (RecordWriterOutput<T>) streamOutputs.get(outputEdge);
allOutputs.add(new Tuple2<>(output, outputEdge));
}
// Create collectors for the chained outputs
for (StreamEdge outputEdge : operatorConfig.getChainedOutputs(userCodeClassloader)) {
int outputId = outputEdge.getTargetId();
StreamConfig chainedOpConfig = chainedConfigs.get(outputId);
WatermarkGaugeExposingOutput<StreamRecord<T>> output = createOperatorChain(containingTask, chainedOpConfig, chainedConfigs, userCodeClassloader, streamOutputs, allOperatorWrappers, outputEdge.getOutputTag(), mailboxExecutorFactory);
allOutputs.add(new Tuple2<>(output, outputEdge));
}
if (allOutputs.size() == 1) {
return allOutputs.get(0).f0;
} else {
// send to N outputs. Note that this includes the special case
// of sending to zero outputs
@SuppressWarnings({ "unchecked" }) Output<StreamRecord<T>>[] asArray = new Output[allOutputs.size()];
for (int i = 0; i < allOutputs.size(); i++) {
asArray[i] = allOutputs.get(i).f0;
}
// otherwise multi-chaining would not work correctly.
if (containingTask.getExecutionConfig().isObjectReuseEnabled()) {
return closer.register(new CopyingBroadcastingOutputCollector<>(asArray));
} else {
return closer.register(new BroadcastingOutputCollector<>(asArray));
}
}
}
use of org.apache.flink.streaming.api.operators.Output in project flink by apache.
the class MultipleInputStreamOperatorBase method createAllOperators.
/**
* Create all sub-operators by corresponding operator factory in a multiple input operator from
* <b>tail to head</b>.
*/
@SuppressWarnings("unchecked")
private void createAllOperators(StreamOperatorParameters<RowData> parameters) {
final boolean isObjectReuseEnabled = parameters.getContainingTask().getExecutionConfig().isObjectReuseEnabled();
final ExecutionConfig executionConfig = parameters.getContainingTask().getExecutionConfig();
final Iterator<TableOperatorWrapper<?>> it = topologicalOrderingOperators.descendingIterator();
while (it.hasNext()) {
final TableOperatorWrapper<?> wrapper = it.next();
final Output<StreamRecord<RowData>> output;
if (wrapper == this.tailWrapper) {
output = this.output;
} else {
final int numberOfOutputs = wrapper.getOutputEdges().size();
final Output<StreamRecord<RowData>>[] outputs = new Output[numberOfOutputs];
for (int i = 0; i < numberOfOutputs; ++i) {
TableOperatorWrapper.Edge edge = wrapper.getOutputEdges().get(i);
int inputId = edge.getInputId();
StreamOperator<RowData> outputOperator = edge.getTarget().getStreamOperator();
if (isObjectReuseEnabled) {
outputs[i] = createOutput(outputOperator, inputId);
} else {
// the source's output type info is equal to the target's type info for the
// corresponding index
TypeSerializer<RowData> serializer = (TypeSerializer<RowData>) edge.getSource().getOutputType().createSerializer(executionConfig);
outputs[i] = createCopyingOutput(serializer, outputOperator, inputId);
}
}
if (outputs.length == 1) {
output = outputs[0];
} else {
// Because user's operator may change the record passed to it.
if (isObjectReuseEnabled) {
output = new CopyingBroadcastingOutput(outputs);
} else {
output = new BroadcastingOutput(outputs);
}
}
}
final StreamOperatorParameters<RowData> newParameters = createSubOperatorParameters(parameters, output, wrapper);
wrapper.createOperator(newParameters);
}
}
Aggregations