Flink提出了批流一体化的概念,并且在1.12版本中开始正式引入批流一体化API,这个特性为批流一体化数仓的产生奠定了基础。
废话不多说,下面我们就来感受一把批流一体化代码把!
本文中的代码基于目前最新的Flink 1.15版本进行开发。
1:引入Flink相关的maven依赖。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-scala_2.12</artifactId>
<version>1.15.0</version>
<!-- <scope>provided</scope> -->
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-clients</artifactId>
<version>1.15.0</version>
<!-- <scope>provided</scope> -->
</dependency>
2:核心代码如下。
import org.apache.flink.api.common.RuntimeExecutionMode
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.windowing.assigners.TumblingProcessingTimeWindows
import org.apache.flink.streaming.api.windowing.time.Time
/**
* 基于最新Flink批流一体化的API开发
* Created by xuwei
*/
object WordCountScala {
def main(args: Array[String]): Unit = {
//获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//指定处理模式,默认支持流处理模式,也支持批处理模式。
/**
* STREAMING:流处理模式,默认。
* BATCH:批处理模式。
* AUTOMATIC:让系统根据数据源是否有界来自动判断是使用STREAMING还是BATCH。
*
* 建议在客户端中使用flink run提交任务的时候通过-Dexecution.runtime-mode=BATCH指定
*/
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC)
//指定DataSource
val text = env.socketTextStream("bigdata04", 9001)//当处理模式指定为AUTOMATIC时,会按照流处理模式执行
//val text = env.readTextFile("D:\\data\\hello.txt")//当处理模式指定为AUTOMATIC时,会按照批处理模式执行
//指定具体的业务逻辑
import org.apache.flink.api.scala._
val wordCount = text.flatMap(_.split(" "))
.map((_,1))
.keyBy(_._1)
//针对时间窗口,目前官方建议使用window,主要是为了让用户指定窗口触发是使用处理时间 or 事件时间
.window(TumblingProcessingTimeWindows.of(Time.seconds(2)))
.sum(1)
//指定DataSink
wordCount.print().setParallelism(1)
//执行程序
env.execute("WordCountScala")
}
}
慕课网大数据体系课程中Flink版本已升级至Flink1.15版本,紧跟一线前沿技术。
慕课网大数据工程师体系课直达链接:
https://class.imooc.com/sale/bigdata