-
Flink是一个分布式计算引擎,用于对无界和有界数据流进行状态计算,既能批计算也能流计算
-
有界数据
-
具有起始时间和截止时间
-
特点
- 有定义流的开始,也有定义流的结束。
- 有界流可以在摄取所有数据后再进行计算。
- 有界流所有数据可以被排序,所以并不需要有序摄取。
- 有界流处理通常被称为批处理
-
-
无界数据
-
有开始时间但没有截止时间,它们在生成时提供数据,但不会被终止
-
特点
- 有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。
- 无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。
- 处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。
-
- Flink是一行一行处理,而SparkStream是基于数据片集合(RDD)进行小批量处理,所以Spark在流式处理方面,不可避免增加一些延时。
- Flink的流式计算跟Storm性能差不多,支持毫秒级计算,而Spark则只能支持秒级计算。
- Spark和Flink全部都运行在Hadoop Yarn上, 性能为Flink > Spark > Hadoop (MR) , 迭代次数越多越明显
- 性能上, Flink优于Spark和Hadoop最主要的原因是Flink支持增量迭代, 具有对迭代自动优化的功能
-
实时监控
- 用户行为预警, app crash预警, 服务器攻击预警
- 对用户行为或者相关事件进行实时监测和分析, 基于风控规则进行预警
-
实时报表
- 双11, 双12等活动直播大屏
- 对外数据产品: 生意参谋等
- 数据化运营
-
流数据分析
- 实时计算相关指标反馈及时调整决策
- 内容投放, 无线智能推送, 实时个性化推荐等
-
实时仓库
- 数据实时清洗, 归并, 结构化
- 数仓的补充和优化
- ProcessFunction是Flink最底层的接口。
- ProcessFunction可以处理一或者两条输入数据流中的单个事件或者归入一个特定窗口内的多个事件
- 提供了对时间和状态的细粒度控制。
- 灵活性高,但开发比较复杂,需要具备一定的编码能力
- DataStream API为许多通用的流处理 *** 作提供了原语
- DataSet API 是批处理API,处理有限的数据集。
- DataStream API是流处理API,处理无限的数据集。
- SQL 构建在Table 之上,都需要构建Table 环境。
- 不同的类型的Table 构建不同的Table 环境中。
- Table 可以与DataStream或者DataSet进行相互转换。
- Streaming SQL不同于存储的SQL,最终会转化为流式执行计划
- 复杂事件处理CEP,Gelly做图计算的,是一个可扩展的图形处理和分析库
- 每个Flink程序由source operator + transformation operator + sink operator组成
- Flink程序的基本构建是在流和转换 *** 作上的, 执行时,Flink程序映射到流数据上,由流和转换运算符组成
- 每个数据流都以一个或多个源开头,并以一个或多个接收器结束
- 数据流类似于有向无环图
- readTextFile(path) - 读取text文件的数据
- readFile(fileInputFormat, path) - 通过自定义的读取方式,来读取文件的数据
- socketTextStream 从socket端口中读取数据
- fromCollection(Collection) - 从collection集合里读取数据
- fromElements(T …) - 从数组里读取数据
- generateSequence(from, to) - 创建一个数据流,数据源里的数据从from到to的数字
- 集合中的数据类型要一致
- addSource - 自定义一个数据源,比如FlinkKafkaConsumer,从kafka里读数据
- 产生一条新的数据流
- 将每一个输入的事件传送到一个用户自定义的mapper,这个mapper只返回一个输出事件
- 一对一服务,即输入一个元素输出一个元素
- 产生一条新的流,其类型和输入流中的事件类型是一样的
- 在每个输入事件上对一个布尔条件进行求值来过滤掉一些元素
- true 的求值结果将会把输入事件保留下来并发送到输出
- 针对每一个输入事件 flatMap 可以生成0个、1个或者多个输出元素
- 通过指定key来将DataStream转换成KeyedStream
- 不同的key,流中的事件将被分配不同的分区中
-
为每一个观察到的key保存一个聚合的值
-
不需要用户自定义函数,但需要接受一个参数,这个参数指定了在哪一个字段上面做聚合
-
无法组合起来使用,每次计算只能使用一个单独的滚动聚合算子
-
常用方法
- sum():在输入流上对指定的字段做滚动相加 *** 作。
- min():在输入流上对指定的字段求最小值。
- max():在输入流上对指定的字段求最大值。
- minBy():在输入流上针对指定字段求最小值,并返回包含当前观察到的最小值的事件。
- maxBy():在输入流上针对指定字段求最大值,并返回包含当前观察到的最大值的事件。
- 滚动聚合的泛化实现
- 把每一个输入事件和当前已经reduce出来的值做聚合计算
- 不会改变流的事件类型。输出流数据类型和输入流数据类型是一样的
-
将两条或者多条DataStream合并成一条具有与输入流相同类型的输出
-
事件合流的方式为FIFO方式
-
特点
- 1.union 合并的流的元素必须是相同的
- 2.union 可以合并多条流
- 3.union不去重,合流顺序为先进先出
-
和union类似的功能,用来连接两个数据流
-
与union的区别
- connect只能连接两个数据流,union可以连接多个数据流。
- 数据类型:connect,两个数据流的数据类型可以不一致;union,数据类型必须一致
-
两个DataStream经过connect之后被转化为ConnectedStreams
-
connect经常被应用在对一个数据流使用另外一个流进行控制处理的场景上
- DataStream.shuffle() 方法实现。shuffle方法将数据随机的分配到下游算子的并行任务
- rebalance() 方法使用Round-Robin负载均衡算法将输入流平均分配到随后的并行任务
- 将数据发送到接下来的并行运行的任务中的一部分任务中
- 将输入流的所有数据复制并发送到下游算子的所有并行任务
- 将所有的输入流数据都发送到下游算子的第一个并行任务中去
- 自定义分区策略
- 一种组合数据类型,由固定数量的元素组成
- Tuple1,Tuple2,一直到Tuple25
- 公有类
- 无参数的公有构造器
- 所有的字段都是公有的,可以通过getters和setters访问。
- 所有字段的数据类型都必须是Flink支持的数据类型。
- Flink类型系统的核心类
- 为系统在产生序列化器和比较 *** 作符时,提供了必要的类型信息
- 做更严格的类型检查
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)