通常的认识是:Flink 流模式跑流任务,批模式跑批任务,用流模式跑离线任务也是个有意思的事情
虽然新版 Flink 已经在 sql 上实现了一定程度的流批一体,但是 DataStream 和 DataSet API 还是相差比较大的
用 Flink 跑离线任务也是机缘巧合(也是必然,毕竟我不会 Spark)
现在的项目组经常会跑历史数据,当然是批模式的,在用 Flink batch 被遇到各种各样的问题困扰之后
深入思考了我们需要跑的历史任务的特性,将流模式的的概念稍微变通一下,也可以达到离线的效果
这一切都有一个前提: Flink 任务的算子,在处理完全部数据后,就自动退出了,基于这个前提,就可以达到离线任务的效果
比如,看下面的 Mysql Source
class MysqlSourceFunction(sql: String) extendsRichSourceFunction[String] {private val logger = LoggerFactory.getLogger("MysqlSourceFunction")private var connection: java.sql.Connection =_private var queryPS: PreparedStatement = null
private var count: Long = 0override def open(parameters: Configuration): Unit={
connection=DriverManager.getConnection(Common.MYSQL_URL, Common.MYSQL_USER, Common.MYSQL_PA