Flink从入门到放弃(十二)-企业实战之事件驱动型场景踩坑(一)

本文基于事件驱动场景来讲解下在企业中的实际应用以及所遇到的坑。(关于Flink主题的所有文章已整理同步到在线腾讯文档,本文中涉及到其他知识点都可在文档中查看,后台回复【文档】获取链接)。

需求背景

某日,小明早上10点打卡到公司,先来一杯热水润润嗓子,打开音乐播放器带上心爱的降噪耳机看看新闻,静静等待11点半吃午饭。突然消息框亮了起来,这个时候小明心想要么来需求了,要么数据就有问题了。这个时候运营A部的同学发消息过来说想要分析下每个渠道当日的实时流量情况,以看板的方式提供就行。 小明看到这种需求,心想这还不简单,立马答应了下来,并许诺下班前完成。

基础环境

小明基于公司现有的Flink1.12.0 SQL接入Kafka来读取数据实现统计,通过渠道维度数据来关联,并将最终结果写入Mysql中,通过Superset来进行展示。整个数据流向也非常简单。

实现逻辑

这里的维度关联采用的是cdc模式,因为运营同学想看分析所有的渠道流量情况,而如果使用Temporal Join 就有可能会丢失部分渠道的数据(比如新接入一个渠道c,而且C渠道没有流量转换,那么就无法统计到C渠道的pv=0,uv=0)

-- Kafka Source
create table real_dwd_flow_info_from_kafka(
    visit_time timestamp,
    channel_code string,
    user_id string,
    url string,
    device_id string
    primary key(unique_id) not enforced
)with( 
  'connector' = 'upsert-kafka',
  'topic' = 'real_dwd_flow_info',
  'properties.bootstrap.servers' = 'bootstrap:9092',
  'key.format' = 'json',
  'value.format' = 'json'
 );
 
--Mysql Sink
create table real_dw_flow_index_info(
   channel string,
   pv int,
   uv int,
   primary key(channel) not enforced
)with(
  'connector' = 'jdbc',
   'url' = 'jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai',
 'table-name' = 'flow_index_info',
 'username' = 'user_name',
 'password' = 'password'
)

--Dim Data
 create table real_dim_channel_code_from_mysql(
  channel_code string,
  channel_name string,
  primary key(channel_code) not enforced
) WITH(
  'connector' = 'mysql-cdc',
  'hostname' = 'localhost',
  'port' = '3306',
  'username' = 'user_name',
  'password' = 'password',
  'database-name' = 'test',
  'table-name' = 'dim_channel',
  'debezium.event.processing.failure.handling.mode' = 'warn',
  'debezium.snapshot.locking.mode' = 'none'
);

--统计指标,这里采用Regular Join
insert into real_dw_flow_index_info
select 
  t1.channel_code,
  sum(case when substr(cast(visit_time as string),1,10) = substr(cast(LOCALTIMESTAMP as string,1,10)) then 1 else 0 end) as pv,
  count(distinct case when substr(cast(visit_time as string),1,10) = substr(cast(LOCALTIMESTAMP as string,1,10)) then user_id end) as uv
from real_dim_channel_code_from_mysql t1
left join real_dwd_flow_info_from_kafka t2
on t1.channel_code  = t2.channel_code 
group by t1.channel_code

如上面的逻辑处理,可以实时统计出当日的实时流量情况。如上图,当运营同学通过配置接入一个新渠道G时,可以立刻在看板中反应出来。

踩坑填坑

入坑:
   小明下班前将该需求交付给运营部门后,开心下班了。不幸的是第二天一早上班,运营同学就来反馈说数据不对,渠道F数据并未发生变化,仍然停留在昨日的统计值上。。作为一名数据人,最害怕的就是别人说数据不对,经过定位排查发现渠道F由于各种因素出现故障,所以一直没有流量进入。
   这里结合Flink的事件驱动特性可以很容易理解,由于渠道F并没有任何事件传输过来,所以Flink本身不会对渠道F进行计算并做初始化的动作,因此结果值仍停留在上次事件发生时的统计状态
填坑:
    既然定位到原因,那么就需要人为或定时驱动事件产生触发计算。因此整个数据流向调整为下图:即在原来的流向中融入离线部分,凌晨定时抽取维度表数据并再次更新到维度表中,这样可以通过CDC模式触发一次计算。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
关于Flink入门到精通的学习路径可以分为以下几个步骤: 1. 学习Flink的基本概念和原理:了解Flink的核心概念,如数据流、转换操作、窗口、状态管理等。可以通过官方文档、教程和书籍进行学习。 2. 安装和配置Flink环境:学习如何在本地或集群环境中安装和配置Flink,并了解各种配置选项和参数的含义和用法。 3. 编写和运行Flink应用程序:学习如何使用Flink的API编写和提交Flink应用程序,包括数据流的处理逻辑、转换操作和窗口计算等。 4. 理解Flink的核心特性和功能:深入学习Flink的一些核心特性和功能,如事件时间处理、容错机制、状态管理和水位线等。 5. 优化和调优Flink应用程序:学习如何优化和调优Flink应用程序,包括调整并行度、内存管理、网络通信和容错机制等方面的优化。 6. 实践应用场景和案例:通过实践应用场景和案例,如流式处理、实时数据分析和机器学习等,来巩固和应用所学的知识。 7. 探索Flink的高级特性和扩展:了解Flink的高级特性和扩展功能,如CEP(复杂事件处理)、表格API、图处理等,并根据需求选择合适的扩展。 总结来说,从入门到精通Flink需要学习基本概念和原理、掌握环境配置和应用开发、理解核心特性和功能、进行优化和调优、实践应用场景和案例,并深入探索高级特性和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击吧大数据

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值