尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】

  1. 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】
  2. 尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】
  3. 尚硅谷大数据Flink1.17实战教程-笔记03【】
  4. 尚硅谷大数据Flink1.17实战教程-笔记04【】
  5. 尚硅谷大数据Flink1.17实战教程-笔记05【】
  6. 尚硅谷大数据Flink1.17实战教程-笔记06【】
  7. 尚硅谷大数据Flink1.17实战教程-笔记07【】
  8. 尚硅谷大数据Flink1.17实战教程-笔记08【】
  9. 尚硅谷大数据Flink1.17实战教程-笔记09【】
  10. 尚硅谷大数据Flink1.17实战教程-笔记10【】
  11. 尚硅谷大数据Flink1.17实战教程-笔记11【】

目录

基础篇

第01章-Flink概述

P001【001_课程介绍】09:18

第1章 Flink概述

P002【002_Flink概述_Flink是什么】14:13

P003【003_Flink概述_Flink发展历史&特点】08:14

P004【004_Flink概述_与SparkStreaming的区别&应用场景&分层API】12:50

第2章 Flink快速上手

P005【005_Flink快速上手_创建Maven工程&导入依赖】03:49

P006【006_Flink快速上手_批处理实现WordCount】18:00

P007【007_Flink快速上手_流处理实现WordCount_编码】13:13

P008【008_Flink快速上手_流处理实现WordCount_演示&对比】06:03

P009【009_Flink快速上手_流处理实现WordCount_无界流_编码】13:57

P010【010_Flink快速上手_流处理实现WordCount_无界流_演示&对比】05:14


本套教程基于Flink新版1.17进行讲解,共分四大篇章:基础篇、核心篇、高阶篇、SQL篇。教程通过动画讲解、实战案例演示,带你掌握Flink构建可靠、高效的数据处理应用。

基础篇

P001【001_课程介绍】09:18

谁在用Flink?答:腾讯、华为、滴滴、阿里巴巴、快手、亚马逊等大厂都在用。

Flink特点

  1. 批流统一
    1. 同一套代码,可以跑流也可以跑批
    2. 同一个SQL,可以跑流也可以跑批
  2. 性能卓越
    1. 高吞吐
    2. 低时延
  3. 规模计算
    1. 支持水平扩展架构
    2. 支持超大状态与增量检查点机制
    3. 大公司使用情况:
      1. 每天处理数万亿的事件
      2. 应用维护几TB大小的状态
      3. 应用在数千个CPU核心上运行
  4. 生态兼容
    1. 支持与Yarn集成
    2. 支持与Kubernetes集成
    3. 支持单机模式运行
  5. 高容错
    1. 故障自动重试
    2. 一致性检查点
    3. 保证故障场景下精确一次的状态一致性

课程特点

  1. 由浅入深
  2. 动图讲解重难点
  3. 全新版本
  4. 内容详实

第01章-Flink概述

P002【002_Flink概述_Flink是什么】14:13

Flink的官网主页地址:https://flink.apache.org/

Flink核心目标,是“数据流上的有状态计算”(Stateful Computations over Data Streams)。

具体说明:Apache Flink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。

P003【003_Flink概述_Flink发展历史&特点】08:14

我们处理数据的目标是:低延迟、高吞吐、结果的准确性和良好的容错性。

Flink主要特点如下:

  1. 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
  2. 结果的准确性。Flink提供了事件时间(event-time)和处理时间(processing-time)语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
  3. 精确一次(exactly-once)的状态一致性保证。
  4. 可以连接到最常用的外部系统,如Kafka、Hive、JDBC、HDFS、Redis等。
  5. 高可用。本身高可用的设置,加上与K8s,YARN和Mesos的紧密集成,再加上从故障中快速恢复和动态扩展任务的能力,Flink能做到以极少的停机时间7×24全天候运行。

P004【004_Flink概述_与SparkStreaming的区别&应用场景&分层API】12:50

表 Flink 和 Streaming 对比

Flink

Streaming

计算模型

流计算

微批处理

时间语义

事件时间、处理时间

处理时间

窗口

多、灵活

少、不灵活(窗口必须是批次的整数倍)

状态

没有

流式SQL

没有

第02章-Flink快速上手

P005【005_Flink快速上手_创建Maven工程&导入依赖】03:49

    <properties>
        <flink.version>1.17.0</flink.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-streaming-java</artifactId>
            <version>${flink.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-clients</artifactId>
            <version>${flink.version}</version>
        </dependency>
    </dependencies>

P006【006_Flink快速上手_批处理实现WordCount】18:00

ctrl + p:查看传参方式。

hello flink
hello world
hello java

package com.atguigu.wc;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.ExecutionEnvironment;
import org.apache.flink.api.java.operators.AggregateOperator;
import org.apache.flink.api.java.operators.DataSource;
import org.apache.flink.api.java.operators.FlatMapOperator;
import org.apache.flink.api.java.operators.UnsortedGrouping;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.util.Collector;

/**
 * TODO DataSet API 实现 wordCount
 */
public class WordCountBatchDemo {
    public static void main(String[] args) throws Exception {
        // TODO 1.创建执行环境
        ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();

        // TODO 2.读取文件:从文件中读取
        DataSource<String> lineDS = env.readTextFile("input/word.txt");

        // TODO 3.切分、转换(word, 1)
        FlatMapOperator<String, Tuple2<String, Integer>> wordAndOne = lineDS.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
            @Override
            public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                // TODO 3.1 按照空格切分单词
                String[] words = value.split(" ");
                // TODO 3.2 将单词转换为(word, 1)格式
                for (String word : words) {
                    Tuple2<String, Integer> wordTuple2 = Tuple2.of(word, 1);
                    // TODO 3.3 使用Collector向下游发送数据
                    out.collect(wordTuple2);
                }
            }
        });

        // TODO 4.按照word分组
        UnsortedGrouping<Tuple2<String, Integer>> wordAndOneGroupBy = wordAndOne.groupBy(0);

        // TODO 5.各分组内聚合
        AggregateOperator<Tuple2<String, Integer>> sum = wordAndOneGroupBy.sum(1); //1是位置,表示第二个元素

        // TODO 6.输出
        sum.print();
    }
}

P007【007_Flink快速上手_流处理实现WordCount_编码】13:13

2.2.2 流处理

package com.atguigu.wc;

import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.functions.KeySelector;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.KeyedStream;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;

/**
 * TODO DataStream实现Wordcount:读文件(有界流)
 *
 */
public class WordCountStreamDemo {
    public static void main(String[] args) throws Exception {
        // TODO 1.创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // TODO 2.读取数据:从文件读
        DataStreamSource<String> lineDS = env.readTextFile("input/word.txt");

        // TODO 3.处理数据: 切分、转换、分组、聚合
        // TODO 3.1 切分、转换
        SingleOutputStreamOperator<Tuple2<String, Integer>> wordAndOneDS = lineDS //<输入类型, 输出类型>
                .flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>() {
                    @Override
                    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {
                        // 按照 空格 切分
                        String[] words = value.split(" ");
                        for (String word : words) {
                            // 转换成 二元组 (word,1)
                            Tuple2<String, Integer> wordsAndOne = Tuple2.of(word, 1);
                            // 通过 采集器 向下游发送数据
                            out.collect(wordsAndOne);
                        }
                    }
                });
        // TODO 3.2 分组
        KeyedStream<Tuple2<String, Integer>, String> wordAndOneKS = wordAndOneDS.keyBy(
                new KeySelector<Tuple2<String, Integer>, String>() {
                    @Override
                    public String getKey(Tuple2<String, Integer> value) throws Exception {
                        return value.f0;
                    }
                }
        );
        // TODO 3.3 聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sumDS = wordAndOneKS.sum(1);

        // TODO 4.输出数据
        sumDS.print();

        // TODO 5.执行:类似 sparkstreaming最后 ssc.start()
        env.execute();
    }
}

/**
 * 接口 A,里面有一个方法a()
 * 1、正常实现接口步骤:
 * <p>
 * 1.1 定义一个class B  实现 接口A、方法a()
 * 1.2 创建B的对象:   B b = new B()
 * <p>
 * <p>
 * 2、接口的匿名实现类:
 * new A(){
 * a(){
 * <p>
 * }
 * }
 */

P008【008_Flink快速上手_流处理实现WordCount_演示&对比】06:03

主要观察与批处理程序 BatchWordCount 的不同:

  1. 创建执行环境的不同,流处理程序使用的是 StreamExecutionEnvironment。
  2. 转换处理之后,得到的数据对象类型不同。
  3. 分组操作调用的是 keyBy 方法,可以传入一个匿名函数作为键选择器(KeySelector), 指定当前分组的 key 是什么。
  4. 代码末尾需要调用 env 的 execute 方法,开始执行任务。

P009【009_Flink快速上手_流处理实现WordCount_无界流_编码】13:57

2)读取 socket 文本流

在实际的生产环境中,真正的数据流其实是无界的,有开始却没有结束,这就要求我们需要持续地处理捕获的数据。为了模拟这种场景,可以监听 socket 端口,然后向该端口不断地发送数据。

[atguigu@node001 ~]$ sudo yum install -y netcat

[atguigu@node001 ~]$ nc -lk 7777

package com.atguigu.wc;

import org.apache.flink.api.common.typeinfo.TypeHint;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.api.common.typeinfo.Types;
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.util.Collector;

/**
 * TODO DataStream实现Wordcount:读socket(无界流)
 *
 */
public class WordCountStreamUnboundedDemo {
    public static void main(String[] args) throws Exception {
        // TODO 1. 创建执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        // IDEA运行时,也可以看到webui,一般用于本地测试
        // 需要引入一个依赖 flink-runtime-web
        // 在idea运行,不指定并行度,默认就是 电脑的 线程数
        // StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration());

        env.setParallelism(3);

        // TODO 2. 读取数据: socket
        DataStreamSource<String> socketDS = env.socketTextStream("node001", 7777);

        // TODO 3. 处理数据: 切换、转换、分组、聚合
        SingleOutputStreamOperator<Tuple2<String, Integer>> sum = socketDS
                .flatMap(
                        (String value, Collector<Tuple2<String, Integer>> out) -> {
                            String[] words = value.split(" ");
                            for (String word : words) {
                                out.collect(Tuple2.of(word, 1));
                            }
                        }
                )
                .setParallelism(2)
                .returns(Types.TUPLE(Types.STRING, Types.INT))
                // .returns(new TypeHint<Tuple2<String, Integer>>() {})
                .keyBy(value -> value.f0)
                .sum(1);

        // TODO 4. 输出
        sum.print();

        // TODO 5. 执行
        env.execute();
    }
}

/**
 * 并行度的优先级:
 * 代码:算子 > 代码:env > 提交时指定 > 配置文件
 */

P010【010_Flink快速上手_流处理实现WordCount_无界流_演示&对比】05:14

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
尚硅谷大数据Flink(Scala版)文档是一份详细介绍Flink框架的文档。Flink是一种用于流处理和批处理的分布式数据处理引擎,可以实时且高效地处理大规模数据。该文档以Scala语言为基础,介绍了Flink在实时处理、窗口计算、水印机制、状态管理、故障恢复等方面的重要概念和使用方法。 文档首先介绍了Flink的基本概念和架构,包括数据流和任务图的概念,以及Flink的分布式部署模式。然后,文档详细介绍了Flink的核心功能和特性,如事件时间处理、窗口计算、状态管理等。 在事件时间处理方面,文档介绍了Flink如何处理流式数据中的事件时间,并解释了水印机制的原理和使用方法。水印机制能够确保事件在流式处理中的有序性和准确性,提高了数据处理的可靠性。 窗口计算是Flink的一个重要功能,文档详细介绍了滚动窗口、滑动窗口和会话窗口等不同类型的窗口,并给出了相应的示例代码,帮助读者理解窗口计算的概念和使用方式。 此外,文档还介绍了Flink的状态管理和故障恢复机制。Flink通过内部状态存储机制来维护流处理中的状态信息,并提供了容错机制来处理节点故障和故障恢复。 最后,文档提供了大量的实例代码和案例分析,帮助读者更好地理解和应用Flink框架。读者可以通过这些示例代码来学习和实践Flink的各种功能和特性。 总之,尚硅谷大数据Flink(Scala版)文档是一份全面而详细的Flink框架学习资料,对于想要深入了解和使用Flink的开发者来说是一份非常有价值的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值