flink与kafka基础知识

一、实时计算:

1.大数据离线实时框架 流程:(采集,存储,处理,应用)

  • 做项目的流程:第一步:数据采集,第二步:数据存储,第三步:数据处理,最后就是数据应用(对最后结果进行使用)

2.数据和业务?

  1. 以前的系统都是对事务进行处理的,事务可以理解为一些事情。增删改查

  2. 从数据挖掘价值推动决策

  3. 数据时效性:数据的价值随着时间延迟迅速降低。

  4. 越快越好,越快越有竞争优势,大数据实时化——实时计算

  5. spark Streaming底层也是批处理,job由时间决定的。

3.离线计算和实时计算的区别

  1. 离线计算是用户启动的,数据已经准备好了,已完成采集,等待数据,加载数据,处理结果。

  2. 实时计算要等待数据过来,才会立马处理。是事件驱动

4.主流实时计算框架对比

** ** 模型 API 保证次数 容错机制 延时 吞吐量 批流统一 业务模式 易用性
Storm Native 组合式 At-least-once Record ACKs ★★★ 不支持 需要其他框架
Spark Streaming Mirco-batching 声明式 Exectly-once RDD Checkpoint ★(批处理)慢 ★★★ 支持 需要其他框架 ★★
Apache Flink Native 组合式 Exectly-once Checkpoint ★★★ ★★★ 支持 需要其他框架 ★★
  1. Apache Flink 组合式:source,transfrom(转换),sink

  2. 保证次数:

    2.1、At-least-once:至少一次

    2.2、Exectly-once:完全一次

  3. Checkpoint(容错),失败了可以找到最新的状态恢复。

  4. 状态:状态跟时间有关系,某一时刻的结果。状态是做容错考虑的。

5.Spark Streaming微批处理和Flink流式处理

  1. 微批处理可能会导致雪崩

  2. 流式处理一条一条处理数据,会导致某一时间段延迟会很大,但不会导致雪崩。

二、flink概念

1.什么是flink?

  1. Flink是一个分布式实时计算框架。用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

  2. 有状态:有状态计算是将当前批次结果加上上一批次计算的结果。

  3. 无界流 有定义流的开始,但没有定义流的结束(没有边界)。它们会无休止地产生数据。流处理。

  4. 有界流 有定义流的开始,也有定义流的结束。有界流(假如1000条数据),即可批处理(一次处理一批),也可以流处理(一条一条处理)。

  5. 任意规模进行计算:指的是flink主从节点。jobmanager:driver端;task manager:executor端。

2.flink特性

3.Flink底层原理

spark与flink底层原理对比

  1. spark底层基于mapreduce,要先执行map端再执行reduce端,延迟高。

  2. flink底层结构重新设计,持续流。

4.flink在流处理和批处理上的source

5.flink并行度

  1. 一个任务对应一个并行度,每个并行度对应一个槽位

  2. 并行度根据吞吐量决定的,Task Slot数量 是由任务中最大的并行度决定,Task的数量由并行度以及有无Shuffle一起决定

  3. flink并行度设置的集中方式

    1、通过env设置,不推荐,如果需要台调整并行度得修改代码重新打包提交任务
    2、每个算子可以单独设置并行度,视实际情况决定,一般不常用
    3、还可以在提交任务的时候指定并行度,最常用 比较推荐的方式
    web UI:填写parallelism输入框即可设置,优先级:算子本身的设置 > env做的全局设置 > 提交任务时指定的 > 配置文件flink-conf.yaml
    
  4. Flink中的任务被分为多个并行任务来执行,其中每个并行的实例处理一部分数据。这些并行实例的数量被称为并行度。我们在实际生产环境中可以从四个不同层面设置并行度,并行度直接决定了Flink程序需要申请多少资源

6.事件时间

事件时间:数据自带的时间(是由数据自带的时间去触发窗口计算) 处理时间:数据时间以系统时间为准。

为了使用事件时间语义,Flink 应用程序需要知道事件时间戳对应的字段,意味着数据流中的每个元素都需要拥有可分配的事件时间戳。其通常通过使用 TimestampAssigner API 从元素中的某个字段去访问/提取时间戳。

时间戳的分配与 watermark 的生成是齐头并进的,其可以告诉 Flink 应用程序事件时间的进度。其可以通过指定 WatermarkGenerator 来配置 watermark 的生成方式。

7.窗口

窗口三大类:时间,计算,会话

stream
       .keyBy(...)               <-  仅 keyed 窗口需要
       .window(...)              <-  必填项:"assigner"
      [.trigger(...)]            <-  可选项:"trigger" (省略则使用默认 trigger)
      [.evictor(...)]            <-  可选项:"evictor" (省略则不使用 evictor)
      [.allowedLateness(...)]    <-  可选项:"lateness" (省略则为 0)
      [.sideOutputLateData(...)] <-  可选项:"output tag" (省略则不对迟到数据使用 side output)
       .reduce/aggregate/apply()      <-  必填项:"function"
      [.getSideOutput(...)]      <-  可选项:"output tag"

 

7.1滚动窗口

滚动窗口的 assigner 分发元素到指定大小的窗口。滚动窗口的大小是固定的,且各自范围之间不重叠。 比如说,如果你指定了滚动窗口的大小为 5 分钟,那么每 5 分钟就会有一个窗口被计算,且一个新的窗口被创建

7.2滑动窗口

与滚动窗口类似,滑动窗口的 assigner 分发元素到指定大小的窗口,窗口大小通过 window size 参数设置。 滑动窗口需要一个额外的滑动距离(window slide)参数来控制生成新窗口的频率。 因此,如果 slide 小于窗口大小,滑动窗口可以允许窗口重叠。这种情况下,一个元素可能会被分发到多个窗口。

比如说,你设置了大小为 10 分钟,滑动距离 5 分钟的窗口,你会在每 5 分钟得到一个新的窗口, 里面包含之前 10 分钟到达的数据

8、Flink 中的Watermark是什么概念,起到什么作用

  • Watermark 是 Apache Flink 为了处理 EventTime 窗口计算提出的一种机制, 本质上是一种时间戳。 一般来讲Watermark经常和Window一起被用来处理乱序事件。

  • 水位线默认等于最新数据的时间戳,水位线只能增长不能降低。

  • 由于数据在传输的过程中可能会乱序,为了解决乱序问题,可以将水位线前移,延迟窗口的计算,避免数据丢失

三、flink代码

1.flink core

public class Demo01StreamWordCount {
    /**
     * flink整体代码大致分为四块
     * 第一部分:构建flink环境
     * 第二部分:构建第一个DStream
     * 第三部分:DStream之间的转换
     * 第四部分:打印得到结果进行保存
     */
    public static void main(String[] args) throws Exception {
        //1.构建flink环境
        //ExecutionEnvironment.getExecutionEnvironment();执行环境。获取执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(2);
        env.setBufferTimeout(200);

        //2.通过Socket(套接字)模拟无界流环境,方便flink处理
        //虚拟机启动:nc-lk 10086   //cpu核数有关
        //从source构建第一个DataStream
        DataStream<String> lineDS = env.socketTextStream("master", 10086);
        System.out.println("lineDS并行度:"+lineDS.getParallelism());
        //统计每个单词的数量
        //第一步:将每行数据的每个单词进行扁平化处理
        //<String, Integer>输入数据类型和输出数据类型


        DataStream<String> wordsDS = lineDS.flatMap(new FlatMapFunction<String, String>() {
            /**
             *
             * @param line DS中的一条数据
             * @param out 通过collect方法将数据发送到下游
             * @throws Exception
             */
            @Override
            public voi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值