美文网首页flink入门
flink学习之二-入门版概念

flink学习之二-入门版概念

作者: AlanKim | 来源:发表于2019-03-11 06:08 被阅读107次

    Flink基础

    flink的安装:

    如果为单机环境,直接从flink官网下载最新的flink包解压即可。

    下载地址:https://flink.apache.org/downloads.html

    flink可以存储中间结果、savepoints等信息,而存储的介质可以选择hadoop,所以这里下载<Apache Flink 1.7.1 with Hadoop® 2.8>

    下载后,解压,然后执行bin下的start-cluster.sh即可启动

    启动成功后,可以在浏览器中输入:http://localhost:8081就可以看到flink的管理控制台,如下:

    flink_dashboard.png

    另外,如果只是单纯希望调试运行flink的job(使用main方法启动),其实可以不用安装flink环境,flink支持在IDE中直接以项目依赖包的形式运行,只是仅限于调试。

    flink中所有job都是通过taskmanager来执行的,是否能立即执行,需要看有没有可用的slot。

    一个job的生命周期是: CREATED -->【 SCHEDULED 】-->DEPLOYING --> RUNNING --> FINISHED

    SCHEDULED 状态为可选

    创建flink-java项目:

    mvn archetype:generate \
        -DarchetypeGroupId=org.apache.flink \
        -DarchetypeArtifactId=flink-quickstart-java \
        -DarchetypeVersion=1.7.0 \
        -DgroupId=wiki-edits \
        -DartifactId=wiki-edits \
        -Dversion=0.1 \
        -Dpackage=wikiedits \
        -DinteractiveMode=false
    

    Flink中的核心概念--入门版(更多的是DataStream API)

    (仅根据目前接触到的一些核心概念做记录)

    • DataStream: 数据流,flink中所有数据都以流的方式展现。
    • StreamExecutionEnvironment: 流执行的环境,目前看到的很多例子都是通过创建这个对象来串联整体处理流程的。一般通过
    final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    

    这种方式来创建对象。

    • DataSource:数据源,通过env.addSource()来设置。一般可以从db、kafka等地方获取数据作为源。所有dataSource均需要继承 RichSourceFunction 这个抽象类,实现其中的open、close、run、cancel等方法。

    • Sink:沉淀、使下沉,在这里指将处理之后的数据存储起来的地方,一般可以放在redis、db、kafka等中,通过 dataSource.addSink()来设置,可以同时设置多个sink。如下:

      dataStreamSource.addSink(new UrlMysqlSink());        
      dataStreamSource.addSink(new PrintSinkFunction<>());
      

      其中PrintSinkFunction是直接输出到控制台,urlMysqlSink则是一个自定义的mysql sink。

      自定义Sink需要继承 RichSinkFunction 这个抽象类,并实现其中的open、invoke方法。

    • Transformation:各种转换,输入一个或多个Stream,输出一个或者多个Stream,常用的transformation如下:

      • map:转换,类似于java8中stream的map,输入一个流,转换输出另外一个流

      • flatmap:与map类似,但是flat的意思是展开,也就是结果只有一层,不会有嵌套集合

        flatmap中需要实现以下方法,可以看到输出的是collector,也就是只有一层集合,而不是嵌套。

        void flatMap(T var1, Collector<O> var2) throws Exception;
        
      • reduce:返回单个的结果值,并且 reduce 操作每处理一个元素总是创建一个新值。可以用来实现average、sum、max、min、count等功能。

      • keyby:类似于sql中的group by,根据某个字段做分组操作,分组后才可以做更多后续的操作。返回的是一个KeyedStream<Object, Type-key> 的流,后面的是key类型。

      • filter:过滤器,其中需要实现的FilterFunction方法返回的是true/false,true代表数据会包含在返回数据中,false则当前数据会被过滤掉。

      • window:用来对一个无限的流设置一个有限的集合,在有界的数据集上进行操作的一种机制。window 又可以分为基于时间(Time-based)的 window 以及基于数量(Count-based)的 window。

        • tumbling time windows(翻滚时间窗口) -- 不会有窗口重叠,也就是一个元素只能出现在一个窗口中

        • sliding time windows(滑动时间窗口)--会有窗口重叠,也就是一个元素可以出现在多个窗口中

          data.keyBy(1)
            .timeWindow(Time.minutes(1)) //tumbling time window 每分钟统计一次数量和
            .sum(1);
          
          data.keyBy(1)
            .timeWindow(Time.minutes(1), Time.seconds(30)) //sliding time window 每隔 30s 统计过去一分钟的数量和
            .sum(1);
          
      • timeWindow: 如上所说,根据时间来聚合流数据。例如:一分钟的 tumbling time window 收集一分钟的元素,并在一分钟过后对窗口中的所有元素应用于一个函数。

      • windowAll:

      • Aggregations:累积、聚合

        • min/minBy:
        • max/maxBy:
        • sum:
      • union:

      • window join:

      • split:

      • select:

      • project:

    相关文章

      网友评论

        本文标题:flink学习之二-入门版概念

        本文链接:https://www.haomeiwen.com/subject/yinnuqtx.html