目录
Flink简介
Flink能干啥
流式分析
数据管道&ETL
事件驱动应用
玩转Flink
无缝集成
数据源管理
简化Flink SQL
极简数据管道
获取flink-jobs
Flink是一个优秀的流式处理引擎,不仅拥有完善的流式处理解决方案,而且将批处理视为有界流,完美实现了流批处理一体化。
Flink可持续不断地处理事件流,并明确支持以下三种时间语义:
值得一提的是Flink的DataStream API和Table API & SQL均可支持这三种语义。
Flink擅长ETL(抽取、转换、加载)管道任务,从一个或多个数据源获取数据,再进行一些信息补充和转换操作,最后将结果存储起来。除了使用常见的DataStream API来实现这些功能之外,还可以使用Table API & SQL来实现。
通过处理函数(ProcessFunction)将事件处理与时钟(Timer)、状态(State)相结合,可以构建强大的流处理应用,从而实现逻辑复杂的事件驱动应用。
典型的事件驱动类应用有:
通常而言,通过Flink的Table API & SQL就可以实现常见的流式分析、数据管道&ETL和事件驱动应用。由于SQL是一种高级开发语言,比DataStream API要简单很多,且可维护性很高。因此,如果对Flink的Table API & SQL做一些抽象化封装,必然可以极大提高开发效率。基于此,flink-jobs便应运而生。
flink-jobs为基于Flink的Java应用程序提供快速集成的能力,可通过继承FlinkJobsRunner快速构建基于Java的Flink流批一体应用程序。flink-jobs提供了数据源管理模块,通过flink-jobs运行Flink SQL会变得极其简单。而通过使用flink-jobs-launcher,可以实现基于Java API启动flink-jobs应用程序,将flink任务通过XML配置文件来实现。
通过flink-jobs-launcher(与flink-jobs配套的开源Flink作业启动框架)可将flink快速集成到现有基于Java实现的系统中。通过XML格式的任务配置文件,更能带领开发者玩转Flink SQL。借助于flink-jobs-launcher,配置Flink作业变得极其简单(通过serviceName可实现应用的模块化管理):
启动作业直接使用Java语言编程即可:
FlinkJobs flinkJobs = XMLConfigLoader.getInstance()
.load("\r\n" +
"\r\n" +
" ");
CommandLineFlinkJobsLauncher flinkJobsLauncher = new CommandLineFlinkJobsLauncher();
flinkJobsLauncher.setFlinkHome("/opt/flink-1.13.1");
flinkJobsLauncher.setAction(Action.RUN);
FlinkJobsApplicationInfo appInfo = flinkJobsLauncher.launch(flinkJobs);
将Flink SQL的数据源通过配置文件统一管理,避免开发者反复拼写过多无用配置信息:
#FlinkSQL数据源配置
#Debezium
#配置名称为kafka的数据源
datasource.kafka.connector=kafka
datasource.kafka.properties.bootstrap.servers=192.168.1.101:9092,192.168.1.102:9092,192.168.1.103:9092
datasource.kafka.properties.group.id=flink-jobs
datasource.kafka.scan.startup.mode=earliest-offset
datasource.kafka.format=debezium-json
datasource.kafka.debezium-json.schema-include=true
#PostgreSQL
#配置名称为bidb的数据源
datasource.bidb.connector=jdbc
datasource.bidb.driver=org.postgresql.Driver
datasource.bidb.url=jdbc:postgresql://192.168.1.104:5432/bidb
datasource.bidb.username=your_name
datasource.bidb.password=your_password
#引用配置文件内的另一个配置
#配置名称为syndb的数据源
datasource.syndb.connector=${datasource.bidb.connector}
datasource.syndb.driver=${datasource.bidb.driver}
datasource.syndb.url=${datasource.bidb.url}?currentSchema=syndb
datasource.syndb.username=${datasource.bidb.username}
datasource.syndb.password=${datasource.bidb.password}
#MySQL
#配置名称为kaorder的数据源
datasource.kaorder.connector=jdbc
datasource.kaorder.driver=com.mysql.cj.jdbc.Driver
datasource.kaorder.url=jdbc:mysql://192.168.1.105:3306/kaorder?useSSL=false&serverTimezone=Asia/Shanghai
datasource.kaorder.username=your_name
datasource.kaorder.password=your_password
#SQLServer
#配置名称为sqltool的数据源
datasource.sqltool.connector=jdbc
datasource.sqltool.driver=org.postgresql.Driver
datasource.sqltool.url=jdbc:sqlserver://192.168.1.106:1433;DatabaseName=sqltool;
datasource.sqltool.username=your_name
datasource.sqltool.password=your_password
#Hive
#配置名称为hivedb的数据源
datasource.hivedb.type=hive
datasource.hivedb.default-database=default
datasource.hivedb.hive-conf-dir=/etc/hive/conf
运行Flink SQL不需要传递过多的数据源配置信息,还可以使用动态SQL和传参( 基于DSL,一个动态脚本解析框架实现),并通过XML配置文件轻松描述Flink SQL任务:
CREATE TABLE books (id BIGINT NOT NULL, title STRING, authors STRING, `year` INT, PRIMARY KEY (id) NOT ENFORCED)
CREATE TABLE books_sum (`year` INT NOT NULL, `count` BIGINT, PRIMARY KEY (`year`) NOT ENFORCED)
INSERT INTO books_sum (`year`, `count`) SELECT `year`, count(*) FROM books GROUP BY `year`
通过封装的数据同步(data-sync)功能,可以快速实现数据管道服务。
TO_TIMESTAMP(FROM_UNIXTIME(UPDATE_TIME/1000, 'yyyy-MM-dd HH:mm:ss'))
详情见:https://gitee.com/tenmg/flink-jobs