Flink这块学习资料比较少,近期都在学习中,之后完善做一个总结,希望对自己和大家的学习有帮助,错误或者不足支持,恳请批评指正,谢谢!

计算框架

目前在学习大数据这块,随着计算成本的降低,和实际业务开发需求的提升,对流式数据的开发也更加频繁,各大公司比较常用的流式框架有:Spark、Storm、Flink;

对于Spark而言:支持Spark Streaming,基于spark core,流式处理过程是通过类似窗口切断,将流分成若干片Discretized Stream,然后转成RDD,之后进行相关的合并或者其他生成结果的操作。Spark Streaming 只能称为准实时,一般可达到秒级别延时,但是相对比较稳定,能够处理大批量数据,很好的容错率。

对于Flink(Blink)而言:就是将其Base所有的输出视为是流(无止境的输入);Dataset在其内部(Stream),也是视为是流;对于Source,通过Streaming和Transformations Operator操作,组成DataFlows(流数据流),最终会将其转化为一个Sink,对于Streaming而言,是多通道的,可以是多个合并成一个,也可以是一个拆分成多个,也可以是多个对应多个(对应:指的是输入输出情况);并且,Flink支持并行:对于Souce和Operator可以进行切割细分,但是值得注意的是:一个流的并行度,与其Operator算法的并行度一致。Flink的延时级别为毫秒级,目前阿里用的比较多的。支持很多数据库作为流式源,如日志源sls、datahub等等,可以写到hbase、rds mysql等等;并且,Blink最上层的API很好地兼容了SQL语法,灵活封装UDF等,拿来用的话非常方便;架构图如下:

                                                                              

spark的checkpoint和flink sparkstreaming flink_sql

一般情况下:顶层的sql API + 封装的UDF(支持java python语言)能够解决大多数问题,如实时事件统计、行为次数统计等等,但是也存在一些问题:如数据流中的二次有序性,如果需要根据数据流中的某个字段,对流进行重排,这个在最上层的SQL API中实现就会存在问题,比如用窗口排序,但是会限制返回值条件,还需要前段进一步优化;针对这部分问题,可以考虑DataStream API,在更底层实现(快照,缓存)。

数据查询

  • 对于离线计算而言,数据查询是静态查询,可以认为是一次查询。当查询语句执行成功之后,倘若数据库不发现变化,返回的查询结果是不变的
  • 对于流计算而言,数据查询是动态的,是持续查询。原因是因为每个时刻数据内容都在发生改变,那么流数据是如何做到结果一致性的呢?
  • 接下来我们以Mysql的存储过程举例,说明Flink的持续查询是如何实现
  • Mysql的任何操作都会被记录在binlog中,将binlog转为中继日志可以实现备份的功能。我们也可以利用该日志来模型持续查询
  • 我们可以写一个触发器,一旦有新的数据进来之后,就进行查询。然后通过一条条的数据插入,对应会有一次次的查询结果
  • 对于无PK(主键)的表而言,事实上实现的是append
  • 对于有PK的表而言,实现的是update,但是Mysql
  • 需要注意:Mysql实现的是全量查询,而在Flink中实现的是增量查询
  • Flink的持续查询也可以这样理解,当有一条数据来的时候Flink会进行一次查询,数据流源源不断,查询结果也会不断刷新,这个过程就是Flink的持续查询