Flink1.8学习路线
发布日期:2021-07-17 15:49:21 浏览次数:8 分类:技术文章

本文共 7006 字,大约阅读时间需要 23 分钟。

  • Flink练习环境准备

  1.     源码编译
  2.     本地运行
  3.     mysql+es+redis+kafka+zk本地搭建
  4.     hbase+hive+yarn有条件可以虚拟机搭建3台机器的小集群
  • Flink Basic API 练习

  1.     keyBy,groupBy,LambdaFunctions(reduce,filter),TransformationFunctions(map,RichMapFunction)
  2.     如何用keyBy返回key的list
  3.     读本地文件+hdfs文件
  4.     快速创建DataSet and DataStream
  5.     计数器Accumulators & Counters(new IntCounter(),addAccumulator(),getAccumulatorResult())
  • DataStream API

  •     Source 

        kafka

        mysql
        自定义source

  •     Sink

        kafka(kafka数据分流会用)

        redis(实时去重复)
        es(数据分析,报表展示)
        hive(实时数据仓库)
        hbase,mysql等等

  •     Time

        Event Time/Processing Time(这俩公司比较常用),Ingestion Time

  •     Watermarks

        原理(assignTimestampsAndWatermarks,Periodic Watermarks,Punctuated Watermarks)

        什么时候指定时间戳?是不是在获取到source之后立即指定时间戳?
        如何自定义时间戳,解决kafka多个partition时间交叉使用影响水印的问题
        如何处理fixed amount of lateness

  •     State

        KeyState,OperatorState(面试Tip:Kafka Connector 使用,支持在并行化情况改变的时候对并行算子状态(state)进行重分布)

        TTL (Time-To-Live),什么时候触发TTL更新
        KeyedBroadcastProcessFunction&BroadcastProcessFunction
        如何用State做实时去重复(天级全量实时去重复,TopN等等)
        managed state和raw state区别,(面试Tip:并行化改变的时候该用哪一个?)
            ValueState<T>
            ListState<T>
            ReducingState<T>
            FoldingState<T, ACC>(未来会去掉)
            MapState<UK, UV>
        存取状态(state)的方法
            Even-split redistribution(均分重分布)
            Union redistribution(联合重分布)
            CheckpointedFunction
                snapshotState无论何时要用到检查点,都要调用
                initializeState用户自定义函数初始化的时候被调用
            GetCheckpointLock(),source’s context中获得一个锁(lock)保证输出原子化
        Asynchronous I/O for External Data Access
            AsyncFunction的实现以分派请求
            一个callback,用于取得operation的结果并交给AsyncCollector
            AsyncCollector在第一次调用AsyncCollector.collect时完成,所有后续的collect调用会被忽略
            像应用transformation那样在DataStream上应用异步I/O
            AsyncFunction不能多线程调用

  •     window

        Window Assigners

            Tumbling Windows滚动窗口
            Sliding Windows滑动窗口
            Session Windows回话窗口
            Global Windows全局窗口(默认NeverTrigger,该触发器不会触发,想触发需要自定义)
        Window Functions
            ReduceFunction
            AggregateFunction
            FoldFunction
            ProcessWindowFunction
            ProcessWindowFunction with Incremental Aggregation
            Incremental Window Aggregation with AggregateFunction
            Using per-window state in ProcessWindowFunction
            WindowFunction (Legacy)

  •         trigger

            Fire and Purge触发和清除

            EventTimeTrigger基于watermarks推进的event-time进度来触发
            ProcessingTimeTrigger基于processing time触发
            CountTrigger当窗口中的元素数量超过给定的限制就触发
            自定义触发器 Trigger(后边会根据flink版本演进发生变化)
                onElement()方法在每个元素被添加到窗口的时候被调用。
                onEventTime()方法在注册的event-time的timer触发的时候被调用。
                onProcessingTime()方法在注册的processing-time的timer触发的时候被调用。
                onMerge()方法与有状态的触发器相关,并且在相应的窗口合并时合并两个触发器的状态,比如在使用会话窗口的时候。
                最后clear()方法执行删除相应窗口所需的任何操作。

  •         evictor驱逐器

            CountEvictor保留窗口中用户指定数量的元素数量,并从窗口的头部丢弃剩余的元素

            DeltaEvictor通过DeltaFunction和一个threshold计算窗口缓冲区中最后一个元素与剩余的最后一个元素之间的差值,并删除差值大于或者等于threshold的元素
            TimeEvictor通过毫秒为单位的参数interval,对给定的窗口找到其中元素时间戳的最大值max_ts,并删除时间戳小于max_ts - interval的元素
            注意点Tip:
                默认情况下,所有内置的evictors都在窗口函数之前应用其逻辑
                指定evictor会阻止一切预聚合,因为窗口的所有元素都必须在应用计算逻辑前先传给evictor进行处理
                Flink不保证窗口内元素的顺序。这意味着虽然evictor从窗口的头部开始驱逐元素,但是并不代表这些头部元素一定是早到或者晚到窗口的

  •         allowedLateness

            默认情况下,当watermark超过窗口的末尾时,晚到的元素会被丢弃

            allowed lateness表示在彻底删除元素之前最多可以容忍多长时间晚到的元素,其默认值为0
            元素如果在allowed lateness通过窗口末尾之后但在window结束时间加上allowed lateness之前到达,仍会被添加到窗口
            在用某些触发器时,晚到但未被丢弃的元素可能会再次触发窗口。EventTimeTrigger就是这种触发器
            当使用GlobalWindows的窗口分配器时,不会有元素被认为是晚到的,因为全局窗口的结束时间是Long.MAX_VALUE
            allowedLateness只针对Event Time有效
            allowedLateness可用于TumblingEventTimeWindow、SlidingEventTimeWindow以及EventTimeSessionWindows,要注意这可能使得窗口再次被触发,相当于对前一次窗口的窗口的修正(累加计算或者累加撤回计算)
            最后要注意的问题,就是sink的问题,由于同一个key的同一个window可能被sink多次,因此sink的数据库要能够接收此类数据

  •         sideOutputLateData

            Flink的side output功能可以获取到因为晚到被丢弃的元素流

            首先你需要在windowed流上通过sideOutputLateData(OutputTag)指明你想要获取晚到的元素
            然后你就能在windowed operation的结果中获取到side-output流

  • DataSet API

  •     DataSet Transformations

        map

        flatmap
        mappartition
        filter
        distinct
        join
        outerjoin
        cross
        cogroup
        union
        rebalance
        first-n

  •     Iterations(大规模迭代算法要用,机器学习或图分析)

        Iterate

            Iteration Input迭代输入:来自数据源或以前的操作符的第一次迭代的初始输入。
            Step Function:在每次迭代中执行Step函数。它是由map、reduce、join等操作符组成的任意数据流,这取决于您手头的特定任务。
            Next Partial Solution:在每个迭代中,step函数的输出将反馈给下一个迭代。
            Iteration Result:最后一次迭代的输出被写入一个数据接收器,或者用作以下操作符的输入、
            termination分两种
                最大迭代次数:如果没有任何其他条件,迭代将执行多次。
                自定义聚合器聚合:迭代允许指定自定义聚合器和聚合标准,如sum聚合已发出记录的数量(聚合器),如果该数量为零则终止(聚合标准)
        Delta Iterate
            Iteration Input:初始工作集和解决方案集从数据源或以前的操作符中读取,作为第一次迭代的输入
            Step Function:在每次迭代中执行Step函数。它是由map、reduce、join等操作符组成的任意数据流,这取决于您手头的特定任务
            Next Workset/Update Solution Set:下一个工作集驱动迭代计算,并将反馈到下一个迭代。此外,解决方案集将被更新并隐式转发(不需要重新构建)。这两个数据集都可以由step函数的不同操作符更新
            Iteration Result:在最后一次迭代之后,将解决方案集写入数据接收器,或者用作以下操作符的输入
            termination:增量迭代的默认终止条件由空工作集收敛准则和最大迭代次数指定。当生成的下一个工作集为空或达到最大迭代次数时,迭代将终止。还可以指定自定义聚合器和聚合准则

  •     Connectors

        Reading from file systems

            hdfs://
            s3://
        Access MongoDB
        Hadoop Compatibility Beta
            Flink中使用Hadoop Writable 数据类型(Data type)
            使用Hadoop InputFormat作为数据源(DataSource)
            使用Hadoop OutputFormat 作为 数据落地(DataSink)
            使用Hadoop Mapper 作为 FlatMapFunction
            使用Hadoop Reducer 作为 GroupReduceFunction

  •  Table API & SQL

  •     Concepts & Common API

        创建执行环境

            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
            StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
        Register a Table
            tableEnv.registerTable
            tableEnv.registerTableSource
        Table API query
            tableEnv.scan("table1").select(...)
        Table from a SQL query
            tableEnv.sqlQuery("SELECT ... FROM table2 ... ")

  •     需要注意的函数

        Convert a Table into a DataStream

            Append Mode:只有在动态Table仅通过INSERT更改修改时才能使用此模式,即它仅附加,并且以前发出的结果永远不会更新,如果更新或删除操作使用追加模式会失败报错
            Retract Mode:始终可以使用此模式。返回值是boolean类型。它用true或false来标记数据的插入和撤回,返回true代表数据插入,false代表数据的撤回
        Dependencies
            Connectors
            Formats
        Table Schema
            Rowtime Attributes
            Type Strings
        Table Connectors
            File System Connector
            Kafka Connector
            Elasticsearch Connector
        Table Formats
            CSV Format
            JSON Format
            Apache Avro Format
            Old CSV Format
        Further TableSources and TableSinks
            OrcTableSource
            CsvTableSink
            JDBCAppendTableSink
            CassandraAppendTableSink
        Table API
            自己跟着官方文档练习
        SQL
            自己跟着官方文档练习
        遇到被flink系统占用的字段如何处理
            flink sql 不让你们用hour字段名字,因为被系统占用了,你们可以`hour` 就可以了
        UDF函数重点练习
            自定义表函数(UDTF)
                TableFunction:与自定义的标量函数类似,自定义的表值函数(UDTF)将0个、1个或多个标量值作为输入参数。与标量函数不同,表值函数可以返回任意数量的行作为输出,而不仅是1个值。返回的行可以由1个或多个列组成
            自定义聚合函数(UDAF)
                AggregateFunction:将多条记录聚合成1条记录
            自定义标量函数(UDF
                ScalarFunction:用户定义的标量函数(UDF)将0个、1个或多个标量值映射到一个新的标量值。

  • 数据类型& 序列化

    注册子类型:让Flink注册子类能够提升性能,在StreamExecutionEnvironment或ExecutionEnvironment中应当为每个子类型调用.registerType(clazz)方法

    注册自定义序列化器:Flink会将自己不能处理的类型转交给Kryo,但并不是所有的类型都能被Kryo完美处理比如Google Guava 的集合类型,需要注册辅助的序列化器
    添加Type Hints: 有时,Flink尝试了各种办法仍不能推断出泛型,这时用户就必须通过借助type hint来推断泛型,一般这种情况只是在Java API中需要添加的。[Type Hints Section(#type-hints-in-the-java-api) 中讲解更为详细
    手动创建一个 TypeInformation类: 在某些API中,手动创建一个TypeInformation类可能是必须的,因为Java泛型的类型擦除特性会使得Flink无法推断数据类型。更多详细信息可以参考Creating a TypeInformation or TypeSerializer
    FLink的TypeInformation类
        基本类型:所有Java基本数据类型和对应装箱类型,加上void, String, Date, BigDecimal和 BigInteger.
        基本数组和对象数组
        复合类型:
        Flink Java Tuples (Flink Java API的一部分): 最多25个成员,不支持null成员
        Scala case 类 (包括 Scala tuples): 最多25个成员, 不支持null成员
        Row: 包含任意多个字段的元组并且支持null成员
        POJOs: 遵循类bean模式的类
        辅助类型 (Option, Either, Lists, Maps, …)
        泛型: Flink自身不会序列化泛型,而是借助Kryo进行序列化.

  • 管理执行

Configuration配置flink参数

            setParallelism设置并行化参数
            getExecutionPlan获取执行计划
            Restart Strategies重启策略
           固定间隔 (Fixed delay)
           失败率 (Failure rate)
           无重启 (No restart)

  • 项目多思考(PPT晋升star方法论,有助于你晋升加薪噢)

           S(SITUATION)业务状况和背景

                  让面评委知道你在做什么
           T(TASK)你有什么挑战和任务
                  让面评委知道你的任务很有挑战,让他做都做不出来
           A(ACTION)你做了哪些行动
                  你方案和思考(已经要多讲你的思考)很前卫,有创新
           R(RESULT)结果如何
                 结果很完美,圆满完成任务,方案也很赞

转载地址:https://blog.csdn.net/huzechen/article/details/99293480 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Flink广播状态实战——设备异常报警
下一篇:阿里flink电话面试题

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月15日 18时10分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章