IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> WaterMark使用和详解 -> 正文阅读

[大数据]WaterMark使用和详解

上篇:基于flink的会话窗口的api实现

WaterMark翻译为水位线,什么时候用到水位线呢?

比如说水控在顺水的时候达到紧梯就会触发,若不放水就可以发现危险的现状

在spark程序划分成窗口的时候,主要是衡量什么时候触发,这也是需要用到的水位线,其实它是来判断水位窗口触发的机制,在这个窗口水位线会不停的增加

其实水位线有两种方式获取,一种是根据数据时间来提取,另一种是定期生成水位线

当我们输入的数据有大也有小的,它就会用这个分区最大的Eventime作为它的水位线

那么这个水位线是怎么计算出来的?

实水位线还有一个作用,让窗口延迟发,举一个例子,我们在生产环境中,拉数据是从中间件拉取出来的,如kafka。

在kakfa下有多个分区,由生产者写入进入,在生产者有2个或多个写,当一对一写完,它还会切换写,在kafka里如果只有一个分区它是有序的,但是多个分区就无法保证它是有序的

一开始写一条数据,在另一个消费者会有延迟, 比如:第一个生产者由于网络的问题就会发生延迟效果,如图所示:

?接下来,采用flink从kakfa里面的数据拉过来 ,但是如何拉取呢?其实flink的并行再大,它的solt只有2个state ,通过直连拉数据有可能是延迟,但是如何容忍数据的延续时间,这一点就是需要解决数据乱序问题。其实,在窗口迟到的数据是不会被触发的

带着这个问题,可以去设计吗?可以的

1、Watermarks的设计主要从?它们定义何时停止等待早期事件

Flink中的事件时间处理取决于特殊的带时间戳的元素,称为watermarks,由数据源或watermarks生成器插入到流中。 具有时间戳t的watermarks可以被理解为断言(assertion?)所有具有时间戳<t的事件已经(具有合理的概率)已经到达

2、我们可以设想不同的策略来决定如何生成watermarks

我们知道每个事件都会在延迟一段时间后到达并且这些延迟会有所不同,因此有些事件会比其他事件延迟更多。 一种简单的方法是假设这些延迟受到一些最大延迟的限制。 Flink将此策略称为有界无序watermarks。 很容易想象出更复杂的watermarks方法,但对于许多应用来说,固定延迟效果还不错。

如果要构建像流分类器这样的应用程序,Flink的ProcessFunction是正确的构建块。 它提供对事件时间(event-time )计时器的访问(即,基于watermarks到达而触发的回调),并具有用于管理缓冲事件所需状态的挂钩,直到轮到它们被发送到下游

代码实现:

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor;
import org.apache.flink.streaming.api.windowing.time.Time;


/**
 * 先keyBy,再进行EventTime划分滚动窗口--[无界流]
 *  设置延迟时间为2秒
 *
 */
public class EventTimeTumblingWindowAllDemo4 {
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

        //1000,spark,3
        //1200,spark,5
        //2000,hadoop,2
        //socketTextStream返回的并行度为1
        DataStreamSource<String> lines = env.socketTextStream("Master", 8888);

        //TODO 当前分区中的数据的数据携带的最大EventTime - 乱序延迟时间 >= 窗口的结束时间 就会触发该窗口
        SingleOutputStreamOperator<String> dataWithWaterMark = lines.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<String>(Time.seconds(0)) {  //设置为0,这里表示数据的延迟时间
            @Override
            public long extractTimestamp(String element) {
                //提取数据中的时间
                return Long.parseLong(element.split(",")[0]);
            }
        });

        SingleOutputStreamOperator<Tuple2<String,Integer>> workAndCount = dataWithWaterMark.map(new MapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public Tuple2<String, Integer> map(String s) throws Exception {
                String[] fields = s.split(",");
                return Tuple2.of(fields[1],Integer.parseInt(fields[2]));
            }
        });

        env.execute();


    }
}

查看job:http://localhost:8081/#/job/01840ac7b18e65bbec107848545fe68e/overview

使用场景(解决问题)?

处理乱序数据:flink中是实时处理数据,但是在处理数据的时候会出现因为网络传输的问题,所以数据先产生的反而到后面才到达,在被处理时候就会出现数据混乱,而且因为开窗,窗口关闭但是本窗口的数据来迟,导致数据丢失;

多并行度下的watermark

一个子任务中watermark会发往所有下一算子中的子任务,也就是一发多,
同样一个子任务会接收上一个算子中所有子任务的watermark,这时起作用的就是最小的哪一个watermark。
watermark可以理解为一个特殊的数据,这个数据不参与计算,仅仅是对窗口的触发关闭起作用;

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 21:59:58  更:2021-07-16 22:00:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 9:11:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码