FlinkSql功能测试及实战演练
前言:Flink在国内的占有率逐步提升的情况下,各项组件的功能与稳定性也得到逐步提升。为了解决目前已有的复杂需求,尝试研究flinksql的特性与功能,作为是否引入该组件的依据。同时尝试将现有需求通过简单demo的形式进行测试。本次测试主要集中在Kafka、mysql、Impala三个组件上,同时将结合官方文档进行:
https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/
1 前期准备
1.1 环境配置
本次研究测试需要用到以下组件:
CDH 6.3.2
Flink 1.12.2
mysql 5.7
impala 3.2.0-cdh6.3.2
kafka 2.2.1-cdh6.3.2
1.2 依赖关系
本次测试会将FlinkSql与kafka、mysql、impala等组件进行conn,因此需要以下依赖包:
flink-connector-kafka_2.11-1.12.2.jar
flink-connector-jdbc_2.11-1.11.2.jar
mysql-connector-java-5.1.47.jar
ImpalaJDBC4.jar
ImpalaJDBC41.jar
flink-sql-connector-kafka_2.11-1.12.2.jar
1.3 重启flink
将上述所需的jar包放入$FLINK_HOME/lib中之后(所有部署flink的服务器都需要放),重启yarn-session
yarn-session.sh --detached
sql-client.sh embedded
2 FlinkSql-kafka测试
FlinkSql-kafka相关资料:
https://ci.apache.org/projects/flink/flink-docs-release-1.12/zh/dev/table/connectors/kafka.html
2.1 FlinkSql-kafka常规功能测试
通过FlinkSql将Kafka中的数据映射成一张表
2.1.1 创建常规topic
1、创建topic
kafka-topics --create --zookeeper 192.168.5.185:2181,192.168.5.165:2181,192.168.5.187:2181 --replication-factor 3 --partitions 3 --topic test01
2、模拟消费者
kafka-console-consumer --bootstrap-server 192.168.5.185:9092,192.168.5.165:9092,192.168.5.187:9092 --topic test01 --from-beginning
3、模拟生产者
kafka-console-producer --broker-list 192.168.5.185:9092,192.168.5.165:9092,192.168.5.187:9092 --topic test01
4、删除topic
kafka-topics --delete --topic test01 --zookeeper 192.168.5.185:2181,192.168.5.165:2181,192.168.5.187:2181
2.1.2 FlinkSql建表
CREATE TABLE t1 (
name string,
age BIGINT,
isStu INT,
opt STRING,
optDate TIMESTAMP(3) METADATA FROM 'timestamp'
) WITH (
'connector' = 'kafka', -- 使用 kafka connector
'topic' = 'test01', -- kafka topic
'scan.startup.mode' = 'earliest-offset',
'properties.bootstrap.servers' = '192.168.5.185:9092,192.168.5.165:9092,192.168.5.187:9092', -- kafka broker 地址
'format' = 'csv' -- 数据源格式为 csv,
);
select * from t1;
2.1.3 写入数据
往kafka中写入数据,同时查看flinksql中t1表的变化
zhangsan,20,1,1
lisi,18,1,2
wangwu,30,2,2
2.1.4 小结
通过kafka数据映射成表这个步骤,可以将数据实时的汇入表中,通过sql再进行后续操作,相对代码编写来说更为简易,同时有问题也相对好排查
2.2 FlinkSql-upsertKafka常规功能测试
upsert-kafka 连接器生产 changelog 流,其中每条数据记录代表一个更新或删除事件。
如果有key则update,没有key则insert,如果value的值为空,则表示删除
2.2.1 FlinkSql建upsert表
drop table t2;
CREATE TABLE t2 (
name STRING,
age bigint,
isStu INT,
opt STRING,
optDate TIMESTAMP(3) ,
PRIMARY KEY (name) NOT ENFORCED
) WITH (
'connector' = 'upsert-kafka',
'topic&#