Flink实战—Flink SQL+Kafka在Streaming场景的demo

继续Flink的实战,这次实现的是Flink+Kafka,实现在streaming场景下的应用。全部代码请关注GitHub

Flink版本是1.9.1,kafka版本是2.1.0,使用java8开发。

本例是Flink SQL在Streaming场景下的应用,目标是从kafka中读取json串,串中包含id, site, proctime,计算5秒内的网站流量pv。

1. 数据准备

数据的json结构很简单,包含id,site,proctime三个字段。可以写个脚本不停的写入kafka的topic,我这里就简单使用kafka-console-producer.sh往里面粘贴数据了。

{"id": 1, "site": "www.baidu.com", "proctime": "2020-04-11 00:00:01"}
{"id": 2, "site": "www.bilibili.com/", "proctime": "2020-04-11 00:00:02"}
{"id": 3, "site": "www.baidu.com", "proctime": "2020-04-11 00:00:03"}
{"id": 4, "site": "www.baidu.com/", "proctime": "2020-04-11 00:00:05"}
{"id": 5, "site": "www.baidu.com", "proctime": "2020-04-11 00:00:06"}
{"id": 6, "site": "www.bilibili.com/", "proctime": "2020-04-11 00:00:07"}
{"id": 7, "site": "https://github.com/tygxy", "proctime": "2020-04-11 00:00:08"}
{"id": 8, "site": "www.bilibili.com/", "proctime": "2020-04-11 00:00:09"}
{"id": 9, "site": "www.baidu.com", "proctime": "2020-04-11 00:00:11"}
{"id": 10, "site": "www.bilibili.com/", "proctime": "2020-04-11 00:00:18"}

2. 创建工程

这里直接使用上一篇Flink SQL in Batch创建的项目了,具体信息可参考Flink实战—Flink SQL在Batch场景的Demo

唯一注意的是pox.xml里添了一个处理json的依赖

<dependency>
  <groupId>org.apache.flink</groupId>
  <artifactId>flink-json</artifactId>
  <version>${flink.version}</version>
</dependency>

3. 实现功能

创建SQLStreaming的JAVA类。

package com.cmbc.flink;
​
import org.apache.flink.api.common.typeinfo.Types;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.java.StreamTableEnvironment;
import org.apache.flink.table.descriptors.Json;
import org.apache.flink.table.descriptors.Kafka;
import org.apache.flink.table.descriptors.Schema;
​
import java.sql.Timestamp;
​
​
public class SQLStreaming {
    public static void main(String[] args) throws Exception {
​
        // set up execution environment
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
​
        // kafka source
        Kafka kafka = new Kafka()
                .version("0.10")
                .topic("flink-streaming")
                .property("bootstrap.servers", "localhost:9092")
                .property("zookeeper.connect", "localhost:2181");
        tableEnv.connect(kafka)
                .withFormat(
                        new Json().failOnMissingField(true).deriveSchema()
                )
                .withSchema(
                        new Schema()
                                .field("id", Types.INT)
                                .field("site", Types.STRING)
                                .field("proctime", Types.SQL_TIMESTAMP).proctime()
                )
                .inAppendMode()
                .registerTableSource("Data");
​
        // do sql
        String sql = "SELECT TUMBLE_END(proctime, INTERVAL '5' SECOND) as processtime," +
                "count(1) as pv, site " +
                "FROM Data " +
                "GROUP BY TUMBLE(proctime, INTERVAL '5' SECOND), site";
        Table table = tableEnv.sqlQuery(sql);
​
        // to sink
        tableEnv.toAppendStream(table, Info.class).print();
        tableEnv.execute("Flink SQL in Streaming");
    }
​
    public static class Info {
        public Timestamp processtime;
        public String site;
        public Long pv;
​
        public Info() {
        }
​
        public Info(Timestamp processtime, String site, Long pv) {
            this.processtime = processtime;
            this.pv = pv;
            this.site = site;
        }
​
        @Override
        public String toString() {
            return
                    "processtime=" + processtime +
                            ", site=" + site +
                            ", pv=" + pv +
                            "";
        }
    }
}

功能也比较简单,简单说一下:

  • 初始化flink env
  • 读取kafka内容,配置基本信息并,映射schema,注册成表
  • 消费数据,执行sql
  • 数据保存或输出

4. 运行和结果

  • 启动flink on local的模式 ,在flink的安装路径下找到脚本start-cluster.sh
  • 开启zookeeper, sh zkServer start
  • 开启kafka
sh kafka-server-start ../config/server.properties
  • 开启kafka-console-producer.sh,开始塞数据
sh kafka-console-producer --broker-list localhost:9092 --topic flink-streaming
  • 启动flink程序,查看结果


    1586655394408.jpg

5. 参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 国贸162 20164010224 张思思 一个农民从洪水中救起了他的妻子,他的孩子却被淹死了。...
    空投哎阅读 224评论 0 0
  • 今天今天语文我们考了试,还讲了昨天的试卷儿。数学我们学的是长方形和正方形。今天还上了社团课。
    李鸣菲阅读 155评论 0 0
  • 高中死拼死拼活想要进入一个好大学。老师都说进入大学你们就轻松了,但是当有一天们真的进入大学后,又真的如此吗...
    爱笑的静阅读 530评论 9 10
  • 大千世界,人心难泽,日久见人心,的确,是这样的,平时,见面微笑的打招呼,看不出内心的世界。等到了你病的时侯,才能知...
    红玫瑰8886阅读 279评论 0 2
  • 11111
    白亞羅阅读 204评论 0 0