做一个简单的demo,从kafka队列中流失读取数据,计算后输出到mysql表中。
部署环境
java 1.8
flink
kafka
mariadb
采用单机部署模式。
安装
下载flink和kafka后分别解压
运行
准备kafka数据源
启动zookeeper
nohup bin/zookeeper-server-start.sh config/zookeeper.properties &
启动kafka
nohup bin/kafka-server-start.sh config/server.properties &
创建kafka topic,并手工输入数据
bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic user_behavior --partitions 1 --replication-factor 1
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic user_behavior
输入如下数据,可以多输入几条。这跟之后要建立的flink表是对应的。注意TIMESTAMP类型格式需要是yyyy-mm-dd hh:mm:ss[.fffffffff]
1,1,1,behavior1,2020-11-02 09:00:00
准备mysql
建立对应的表和授权,表需要有主键。
create database flink;
use flink;
create table flink_output(id bigint ,pv bigint,PRIMARY KEY (ID));
CREATE USER 'flink'@'%' IDENTIFIED BY 'flink';
GRANT all ON flink.flink_output TO 'flink'@'%';
kafka sink目前不能支持group后的输出,所以采用mysql作为输出。
运行flink
启动flink 本地集群
bin/start-cluster.sh
运行 sql client
需要对应的connector。这里需要kafka和mysql。下载如下三个文件,放到flink的新建libs目录下。
flink-connector-jdbc_2.11-1.11.2.jar
flink-sql-connector-kafka_2.11-1.11.2.jar
mysql-connector-java-5.1.49.jar
下载地址:
启动sql client,需要带上附加jar包的目录;
bin/sql-client.sh embedded -l libs/
在flink里建立对应的表并提交sql。
CREATE TABLE kafkaTable (
user_id BIGINT,
item_id BIGINT,
category_id BIGINT,
behavior STRING,
ts TIMESTAMP(3)
) WITH (
'connector' = 'kafka',
'topic' = 'user_behavior',
'properties.bootstrap.servers' = 'localhost:9092',
'properties.group.id' = 'testGroup',
'format' = 'csv',
'scan.startup.mode' = 'earliest-offset'
);
CREATE TABLE flink_output (
id BIGINT,
pv bigint,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://localhost:3306/flink',
'table-name' = 'flink_output',
'username' = 'flink',
'password' = 'flink'
);
insert into flink_output select user_id,count(1) from kafkaTable group by user_id;
可以在网页查看作业详情
参考
JDBC SQL Connector: ci.apache.org/projects/fl…
原文链接:www.luozhucheng.com