コード例 #1
0
ファイル: WindowOperator.java プロジェクト: lizhiyong/flink
  @Override
  @SuppressWarnings("unchecked")
  public final void processElement(StreamRecord<IN> element) throws Exception {
    if (setProcessingTime) {
      element.replace(element.getValue(), System.currentTimeMillis());
    }

    Collection<W> elementWindows =
        windowAssigner.assignWindows(element.getValue(), element.getTimestamp());

    K key = keySelector.getKey(element.getValue());

    Map<W, Context> keyWindows = windows.get(key);
    if (keyWindows == null) {
      keyWindows = new HashMap<>();
      windows.put(key, keyWindows);
    }

    for (W window : elementWindows) {
      Context context = keyWindows.get(window);
      if (context == null) {
        WindowBuffer<IN> windowBuffer = windowBufferFactory.create();
        context = new Context(key, window, windowBuffer);
        keyWindows.put(window, context);
      }

      context.windowBuffer.storeElement(element);
      Trigger.TriggerResult triggerResult = context.onElement(element);
      processTriggerResult(triggerResult, key, window);
    }
  }
コード例 #2
0
 @Override
 public void processElement(StreamRecord<T> element) throws Exception {
   long newTimestamp = userFunction.extractTimestamp(element.getValue(), element.getTimestamp());
   output.collect(element.replace(element.getValue(), newTimestamp));
   long watermark = userFunction.extractWatermark(element.getValue(), newTimestamp);
   if (watermark > currentWatermark) {
     currentWatermark = watermark;
     output.emitWatermark(new Watermark(currentWatermark));
   }
 }
コード例 #3
0
ファイル: CollectorWrapper.java プロジェクト: OADEBIYX/flink
 @Override
 public void collect(StreamRecord<OUT> record) {
   for (Collector<StreamRecord<OUT>> output :
       outputSelectorWrapper.getSelectedOutputs(record.getValue())) {
     output.collect(record);
   }
 }
コード例 #4
0
 @Override
 @SuppressWarnings({"unchecked", "rawtypes"})
 public void setKeyContextElement2(StreamRecord record) throws Exception {
   if (stateKeySelector2 != null) {
     Object key = ((KeySelector) stateKeySelector2).getKey(record.getValue());
     getStateBackend().setCurrentKey(key);
   }
 }
コード例 #5
0
ファイル: WindowOperator.java プロジェクト: lizhiyong/flink
 public Trigger.TriggerResult onElement(StreamRecord<IN> element) throws Exception {
   Trigger.TriggerResult onElementResult =
       trigger.onElement(element.getValue(), element.getTimestamp(), window, this);
   if (watermarkTimer > 0 && watermarkTimer <= currentWatermark) {
     // fire now and don't wait for the next watermark update
     Trigger.TriggerResult onEventTimeResult = onEventTime(watermarkTimer);
     return Trigger.TriggerResult.merge(onElementResult, onEventTimeResult);
   } else {
     return onElementResult;
   }
 }
コード例 #6
0
  @Override
  @SuppressWarnings("unchecked")
  public void processElement(StreamRecord<IN> element) throws Exception {
    Collection<W> elementWindows =
        windowAssigner.assignWindows(
            element.getValue(), element.getTimestamp(), windowAssignerContext);

    final K key = (K) getStateBackend().getCurrentKey();

    if (windowAssigner instanceof MergingWindowAssigner) {

      MergingWindowSet<W> mergingWindows = getMergingWindowSet();

      for (W window : elementWindows) {
        // If there is a merge, it can only result in a window that contains our new
        // element because we always eagerly merge
        final Tuple1<TriggerResult> mergeTriggerResult = new Tuple1<>(TriggerResult.CONTINUE);

        // adding the new window might result in a merge, in that case the actualWindow
        // is the merged window and we work with that. If we don't merge then
        // actualWindow == window
        W actualWindow =
            mergingWindows.addWindow(
                window,
                new MergingWindowSet.MergeFunction<W>() {
                  @Override
                  public void merge(
                      W mergeResult,
                      Collection<W> mergedWindows,
                      W stateWindowResult,
                      Collection<W> mergedStateWindows)
                      throws Exception {
                    context.key = key;
                    context.window = mergeResult;

                    // store for later use
                    mergeTriggerResult.f0 = context.onMerge(mergedWindows);

                    for (W m : mergedWindows) {
                      context.window = m;
                      context.clear();
                      deleteCleanupTimer(m);
                    }

                    // merge the merged state windows into the newly resulting state window
                    getStateBackend()
                        .mergePartitionedStates(
                            stateWindowResult,
                            mergedStateWindows,
                            windowSerializer,
                            (StateDescriptor<? extends MergingState<?, ?>, ?>)
                                windowStateDescriptor);
                  }
                });

        // check if the window is already inactive
        if (isLate(actualWindow)) {
          LOG.info(
              "Dropped element " + element + " for window " + actualWindow + " due to lateness.");
          continue;
        }

        W stateWindow = mergingWindows.getStateWindow(actualWindow);
        ListState<StreamRecord<IN>> windowState =
            getPartitionedState(stateWindow, windowSerializer, windowStateDescriptor);
        windowState.add(element);

        context.key = key;
        context.window = actualWindow;

        // we might have already fired because of a merge but still call onElement
        // on the (possibly merged) window
        TriggerResult triggerResult = context.onElement(element);
        TriggerResult combinedTriggerResult =
            TriggerResult.merge(triggerResult, mergeTriggerResult.f0);
        fireOrContinue(combinedTriggerResult, actualWindow, windowState);

        if (combinedTriggerResult.isPurge()) {
          cleanup(actualWindow, windowState, mergingWindows);
        } else {
          registerCleanupTimer(actualWindow);
        }
      }

    } else {
      for (W window : elementWindows) {

        // check if the window is already inactive
        if (isLate(window)) {
          LOG.info("Dropped element " + element + " for window " + window + " due to lateness.");
          continue;
        }

        ListState<StreamRecord<IN>> windowState =
            getPartitionedState(window, windowSerializer, windowStateDescriptor);
        windowState.add(element);

        context.key = key;
        context.window = window;

        TriggerResult triggerResult = context.onElement(element);
        fireOrContinue(triggerResult, window, windowState);

        if (triggerResult.isPurge()) {
          cleanup(window, windowState, null);
        } else {
          registerCleanupTimer(window);
        }
      }
    }
  }
コード例 #7
0
ファイル: CoStreamMap.java プロジェクト: kl0u/flink
 @Override
 public void processElement2(StreamRecord<IN2> element) throws Exception {
   output.collect(element.replace(userFunction.map2(element.getValue())));
 }
コード例 #8
0
 public TriggerResult onElement(StreamRecord<IN> element) throws Exception {
   return trigger.onElement(element.getValue(), element.getTimestamp(), window, this);
 }