flink学习之二-入门版概念

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:

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容