Flink基础-DataStreamAPI编程

1.分布式流处理的基本模型

逻辑模型:

一个source 一个operation 一个sink

物理模型:

多个source对应多个operation一个sink

不同节点直接的数据传输需要接触到网络

2.流的基本操作

单条流的操作:

map

两条流的操作:

connect:connectedstream,把两条不同数据类型的流合并到一条流中

comap:把这条流又返回给单条流

拆分流的操作:

split:splitstream

datastream的基本转换:

keyedstream的理解:

会把不同类别的数据发送到不同的节点上执行

key数>>并发度

datastream:

物理分组:

globa:把所有的数据流都放入到第一个task中

broadcast:广播,会把某个节点上的数据流广播到所有的节点上去

forward:上下游并发度一样时一对一发送,如果上下游的并发度不同会在构建执行图的时候报错,

如果上下游并发度一致会自动启用forward

shuffle:随机分配,从当前实例中随机挑选几个放入到下一个实例中

rebalance:类似shuffle,是为了负载均衡随机分配

recale:本地轮流分配,只会看到自己本机的实例,轮流进行分流

partitioncusotm:自定义数据单播,可以自己定义从本机中选择一条数据流发送到下游,但是下游只能是一个实例

类型系统:

flink序列化是强类型的,这是为了提升序列化和反序化的速率

基本类型:javaj的基本类型,还有void,string,date,bigdecimal,biginteger

复合类型:tuple,和scala case class,row,pojo

tuple有数据条数上限,不支持null

row支持null,没有数据条数上限

辅助、集合类型:option,either,list,map等

其他类型:

自定义typeinfomation或kryo处理,一般不推荐使用,最好不要使用泛型,因为有类型擦出

fold:可以允许前后的值不一致

reduce:需要提供一个一致的初始值

keyby如果遇到数据倾斜的解决方案:localgruopby

在keyby之后,在某个节点上会分配到了比较大的key,会在单节点上启动多个线程,类型于一个先聚合在分组

可以提前对key值进行打散,然后在进行统计

richfunction

每个函数都有自己的一个声明周期,open,close

在最后的时候在做一些清理的工作

流和多个动态维表的join:

首先需要自己控制数据流和动态维表的join,可以在key join的时候,尽量减少join的中间的结果

在join的算子中,根据key值手动的去多个维表中拉取数据,然后关联

原文地址:https://www.cnblogs.com/javazyh/p/13040063.html