• 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值手动的去多个维表中拉取数据,然后关联

  • 相关阅读:
    3月6日
    2月28日
    2月23日
    2月20日
    2月19日
    2月18日
    2月17日
    2月16日
    2月15日
    面试算法题——硬币找零
  • 原文地址:https://www.cnblogs.com/javazyh/p/13040063.html
Copyright © 2020-2023  润新知