Flink作为近几年甚是火爆的数据实时处理框架,吸引了一大批程序员的学习,更是凭借着流批一体化,高效实时数据计算,尤其是在数据量特别大的情况下,每秒钟的数据处理量高达7TB,受到了一大批企业的青睐,纷纷将Flink作为日常实时计算的核心。
对于我们大数据程序员来说,掌握Flink也是我们的基本技能,尤其是现在的很多企业,对于实时的要求越来越高,所以在这里,我将学习Flink的全部过程记录下来,一方面给大家做一个参考,另外一方面也算是技术沉淀。
这里我学习Flink用的是Java语言,版本是1.12,当然用Scala语言也可以,不过Scala语言的门槛相对来说高一些,我们不用纠结用哪门语言,适合自己的就是最好的。
好了,废话不多说,直接开始吧。
既然学习Flink,那什么是Flink?能用来干嘛?想必对于不熟悉的小伙伴一头雾水,这里给大家简单介绍一下,有不足之处,还望指正。
Flink是一个实时数据计算框架,所谓的实时,就是当数据产生的时候,就能立马接收到数据,对数据进行逻辑计算,输出结果,尤其是数据量特别大的时候效果特别显著。比如说大家熟知的阿里双十一,每个用户下单购买产生的数据,通过相应的业务逻辑计算,将成交额成交量实时的显示在大屏幕上。截止几点成交量多少,成交额多少,就可以通过Flink计算得来。
Flink另外一个重要的作用就是流批一体化,什么是流批一体化?如果把数据比如长江黄河的话,一条一条的数据就像长江黄河里面的水,数据来一条处理一条,源源不断,实时接收,实时计算,没有头也没有尾,这个就是流,至于批就是一定量的数据作为一个批次,统一进行处理。不像流一样,数据来一条处理一条,这就是Flink的厉害之处。
哪能用来干什么?既然是实时计算,当然是用在对实时性要求比较高的场景,那我们公司的业务场景来说,线下的各个门店举办促销活动,在进行会员卡销售的时候,就会进行PK,截止到12点或者18点,每个门店的销售额是多少?销售量是多少?是否进行了折扣?折扣力度是多少?都要在这一刻进行汇总计算,然后将计算结果以报表的形式给到运营,这个就对实时性要求比较高,就会用到Flink。
看到这里,或许你就会明白Flink具体是用来干嘛的。当然这只是Flink的冰山一角,里面具体的细节,我会在接下来的过程中一一为大家讲解。
Flink的官网上有这样的一句介绍,Flink是数据流上有状态的计算?
第一个概念,什么是有状态的计算?
通俗的话讲,就是历史的数据,不管是数据整体,还是数据结果,比如说我们在处理第十条数据的时候,需要用到第一条数据,这个时候怎么办?那就保存下来,不管是保存在内存还是磁盘,保存下来的数据就叫做状态。
而在Flink中,所有的算子都可以有状态,哪怕只是一个普通的Map操作,都可以有状态。当然如果你只是做一个简单的转换操作,不需要用到状态,也是可以的。
Flink是事件驱动型应用,他是一种有状态的应用。
第二个概念,什么是事件驱动型?有状态的上面已经说过了,这里不再强调。
在说Flink之前,回顾一下Spark,Spark是以时间驱动的,当数据源有数据的数据就处理数据,如果没有数据的话,Spark依然会进行数据处理,只不过没有数据罢了,具体可以通过print打印时间戳来验证,当有数据的时候,就会打印数据,没有数据的时候,依然会一个空的时间戳,说明Spark是通过时间的方式来处理数据。
所谓的事件驱动就是一条一条的数据,Flink将读取过来的数据封装成了一个Event,来一条处理一条,来一条处理一条。当源头有数据的时候就进行计算,没有数据的时候就不计算,就停了,不浪费资源。这也是跟Spark最大的一个区别,也是最本身的一个区别。
第三个概念,流与批的世界观,什么是流?什么是批?上面已经说过了,这里不再赘述,这里只是简单的总结一下两者的特点。
批处理的特点是数据是有限的,而且数据量大,一般用作离线场景。
流处理的特点是数据是无限的,只有开头,没有结束,而且是实时的,对系统中传递过来的数据进行实时计算,通常用作实时统计。
第四个概念,有界流,无界流
无界流,数据有开头,没有结尾,不停的有数据过来,过来了之后就要进行处理。
有界流,数据有开头有结尾,有明确的开始和结束。有界流的处理也叫批处理。
第五个概念,分层API
Flink提供了最核心的编程分层API,从下到上分别是,最底层的状态流处理process,核心API DataStream和DatsSet,TableAPI以及SQL。从上往下,功能越来越强大,可以处理复杂的业务。
当然还有其他的概念,比如说窗口函数、Exactly-Once语义、CEP复杂事件处理、水位线、侧输出流等等,我会在后续的学习中一一为大家讲解。
有兴趣的可以关注公众号:bigdata_world