美文网首页
flink学习笔记 — watermark 水印

flink学习笔记 — watermark 水印

作者: 飞不高的老鸟 | 来源:发表于2019-11-08 20:25 被阅读0次

    flink 简介

    • flink 是最近几年发展最为迅速的实时计算框架,它解决了 storm 低吞吐量的问题,同时也解决了 spark 的高延时问题。flink 是一款高吞吐量、低延时、高可用的流式计算框架。

    flink 支持的窗口时间

    事件时间:EventTime,事件发生的事件,通常是用户行为发生的最准确的事件。
    注入时间:IngestionTime,事件注入到 flink 框架的事件,是在 source 算子执行的时候生成的事件,通常是在 jobManager 服务器的系统时间。
    处理时间:ProcessTime,事件处理的时间,通常是在 transform 过程中生成的时间戳,在 taskmanager 机器生成。

    • 为了更准确的反应用户行为分析结果,通常采用 EventTime 作为数据处理的的时间戳。然而,网络问题或者其他问题可能会引起数据的延时到来,如果按照 EventTime 去做处理,很可能得不到我们预期的结果,为了解决这种数据延时的问题,flink 中引入了 Watermark 水印去处理这种特殊情况。

    Watermark 介绍

    • 事实上,watermark 可以理解为是触发某个窗口执行的时间戳,它的生成有两种方式:1. Periodic(周期性),2. punctuated(伴随着每个最新的事件时间)。
    • 它和事件流一样,可以在整个流中正常流转到下游对应的算子。
    • 算子每接收到一个 watermark ,即可认为后面不会再有晚于这个时间戳的事件进入到该执行窗口中。
    • watermark 必须是递增的。
    • watermark 的生成离数据源越近越好。

    watermark 源码

    
    /**
     * The {@code AssignerWithPeriodicWatermarks} assigns event time timestamps to elements,
     * and generates low watermarks that signal event time progress within the stream.
     * These timestamps and watermarks are used by functions and operators that operate
     * on event time, for example event time windows.
     *
     * <p>Use this class to generate watermarks in a periodical interval.
     * At most every {@code i} milliseconds (configured via
     * {@link ExecutionConfig#getAutoWatermarkInterval()}), the system will call the
     * {@link #getCurrentWatermark()} method to probe for the next watermark value.
     * The system will generate a new watermark, if the probed value is non-null
     * and has a timestamp larger than that of the previous watermark (to preserve
     * the contract of ascending watermarks).
     *
     * <p>The system may call the {@link #getCurrentWatermark()} method less often than every
     * {@code i} milliseconds, if no new elements arrived since the last call to the
     * method.
     *
     * <p>Timestamps and watermarks are defined as {@code longs} that represent the
     * milliseconds since the Epoch (midnight, January 1, 1970 UTC).
     * A watermark with a certain value {@code t} indicates that no elements with event
     * timestamps {@code x}, where {@code x} is lower or equal to {@code t}, will occur any more.
     *
     * @param <T> The type of the elements to which this assigner assigns timestamps.
     *
     * @see org.apache.flink.streaming.api.watermark.Watermark
     */
    public interface AssignerWithPeriodicWatermarks<T> extends TimestampAssigner<T> {
    
        /**
         * Returns the current watermark. This method is periodically called by the
         * system to retrieve the current watermark. The method may return {@code null} to
         * indicate that no new Watermark is available.
         *
         * <p>The returned watermark will be emitted only if it is non-null and its timestamp
         * is larger than that of the previously emitted watermark (to preserve the contract of
         * ascending watermarks). If the current watermark is still
         * identical to the previous one, no progress in event time has happened since
         * the previous call to this method. If a null value is returned, or the timestamp
         * of the returned watermark is smaller than that of the last emitted one, then no
         * new watermark will be generated.
         *
         * <p>The interval in which this method is called and Watermarks are generated
         * depends on {@link ExecutionConfig#getAutoWatermarkInterval()}.
         *
         * @see org.apache.flink.streaming.api.watermark.Watermark
         * @see ExecutionConfig#getAutoWatermarkInterval()
         *
         * @return {@code Null}, if no watermark should be emitted, or the next watermark to emit.
         */
        @Nullable
        Watermark getCurrentWatermark();
    }
    
    
    /**
     * The {@code AssignerWithPunctuatedWatermarks} assigns event time timestamps to elements,
     * and generates low watermarks that signal event time progress within the stream.
     * These timestamps and watermarks are used by functions and operators that operate
     * on event time, for example event time windows.
     *
     * <p>Use this class if certain special elements act as markers that signify event time
     * progress, and when you want to emit watermarks specifically at certain events.
     * The system will generate a new watermark, if the probed value is non-null
     * and has a timestamp larger than that of the previous watermark (to preserve
     * the contract of ascending watermarks).
     *
     * <p>For use cases that should periodically emit watermarks based on element timestamps,
     * use the {@link AssignerWithPeriodicWatermarks} instead.
     *
     * <p>The following example illustrates how to use this timestamp extractor and watermark
     * generator. It assumes elements carry a timestamp that describes when they were created,
     * and that some elements carry a flag, marking them as the end of a sequence such that no
     * elements with smaller timestamps can come anymore.
     *
     * <pre>{@code
     * public class WatermarkOnFlagAssigner implements AssignerWithPunctuatedWatermarks<MyElement> {
     *
     *     public long extractTimestamp(MyElement element, long previousElementTimestamp) {
     *         return element.getSequenceTimestamp();
     *     }
     *
     *     public Watermark checkAndGetNextWatermark(MyElement lastElement, long extractedTimestamp) {
     *         return lastElement.isEndOfSequence() ? new Watermark(extractedTimestamp) : null;
     *     }
     * }
     * }</pre>
     *
     * <p>Timestamps and watermarks are defined as {@code longs} that represent the
     * milliseconds since the Epoch (midnight, January 1, 1970 UTC).
     * A watermark with a certain value {@code t} indicates that no elements with event
     * timestamps {@code x}, where {@code x} is lower or equal to {@code t}, will occur any more.
     *
     * @param <T> The type of the elements to which this assigner assigns timestamps.
     *
     * @see org.apache.flink.streaming.api.watermark.Watermark
     */
    public interface AssignerWithPunctuatedWatermarks<T> extends TimestampAssigner<T> {
    
        /**
         * Asks this implementation if it wants to emit a watermark. This method is called right after
         * the {@link #extractTimestamp(Object, long)} method.
         *
         * <p>The returned watermark will be emitted only if it is non-null and its timestamp
         * is larger than that of the previously emitted watermark (to preserve the contract of
         * ascending watermarks). If a null value is returned, or the timestamp of the returned
         * watermark is smaller than that of the last emitted one, then no new watermark will
         * be generated.
         *
         * <p>For an example how to use this method, see the documentation of
         * {@link AssignerWithPunctuatedWatermarks this class}.
         *
         * @return {@code Null}, if no watermark should be emitted, or the next watermark to emit.
         */
        @Nullable
        Watermark checkAndGetNextWatermark(T lastElement, long extractedTimestamp);
    }
    

    小结

    • watermark 可以在一定程度上解决数据延迟的问题,然而在延迟事件较长时,这种机制似乎也显得苍白无力。此时,我们可以利用窗口的 allowedLateness 方法设置允许延迟的时间差,查过该事件的数据将会被丢弃。

    相关文章

      网友评论

          本文标题:flink学习笔记 — watermark 水印

          本文链接:https://www.haomeiwen.com/subject/qswwbctx.html