一、实时计算:
1.大数据离线实时框架 流程:(采集,存储,处理,应用)
-
做项目的流程:第一步:数据采集,第二步:数据存储,第三步:数据处理,最后就是数据应用(对最后结果进行使用)
2.数据和业务?
-
以前的系统都是对事务进行处理的,事务可以理解为一些事情。增删改查
-
从数据挖掘价值推动决策
-
数据时效性:数据的价值随着时间延迟迅速降低。
-
越快越好,越快越有竞争优势,大数据实时化——实时计算
-
spark Streaming底层也是批处理,job由时间决定的。
3.离线计算和实时计算的区别
-
离线计算是用户启动的,数据已经准备好了,已完成采集,等待数据,加载数据,处理结果。
-
实时计算要等待数据过来,才会立马处理。是事件驱动
4.主流实时计算框架对比
** ** | 模型 | API | 保证次数 | 容错机制 | 延时 | 吞吐量 | 批流统一 | 业务模式 | 易用性 |
---|---|---|---|---|---|---|---|---|---|
Storm | Native | 组合式 | At-least-once | Record ACKs | ★★★ | ★ | 不支持 | 需要其他框架 | ★ |
Spark Streaming | Mirco-batching | 声明式 | Exectly-once | RDD Checkpoint | ★(批处理)慢 | ★★★ | 支持 | 需要其他框架 | ★★ |
Apache Flink | Native | 组合式 | Exectly-once | Checkpoint | ★★★ | ★★★ | 支持 | 需要其他框架 | ★★ |
-
Apache Flink 组合式:source,transfrom(转换),sink
-
保证次数:
2.1、At-least-once:至少一次
2.2、Exectly-once:完全一次
-
Checkpoint(容错),失败了可以找到最新的状态恢复。
-
状态:状态跟时间有关系,某一时刻的结果。状态是做容错考虑的。
5.Spark Streaming微批处理和Flink流式处理
-
微批处理可能会导致雪崩
-
流式处理一条一条处理数据,会导致某一时间段延迟会很大,但不会导致雪崩。
二、flink概念
1.什么是flink?
-
Flink是一个分布式实时计算框架。用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。
-
有状态:有状态计算是将当前批次结果加上上一批次计算的结果。
-
无界流 有定义流的开始,但没有定义流的结束(没有边界)。它们会无休止地产生数据。流处理。
-
有界流 有定义流的开始,也有定义流的结束。有界流(假如1000条数据),即可批处理(一次处理一批),也可以流处理(一条一条处理)。
-
任意规模进行计算:指的是flink主从节点。jobmanager:driver端;task manager:executor端。
2.flink特性
3.Flink底层原理
spark与flink底层原理对比
-
spark底层基于mapreduce,要先执行map端再执行reduce端,延迟高。
-
flink底层结构重新设计,持续流。
4.flink在流处理和批处理上的source
5.flink并行度
-
一个任务对应一个并行度,每个并行度对应一个槽位
-
并行度根据吞吐量决定的,Task Slot数量 是由任务中最大的并行度决定,Task的数量由并行度以及有无Shuffle一起决定
-
flink并行度设置的集中方式
1、通过env设置,不推荐,如果需要台调整并行度得修改代码重新打包提交任务 2、每个算子可以单独设置并行度,视实际情况决定,一般不常用 3、还可以在提交任务的时候指定并行度,最常用 比较推荐的方式 web UI:填写parallelism输入框即可设置,优先级:算子本身的设置 > env做的全局设置 > 提交任务时指定的 > 配置文件flink-conf.yaml
-
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