多流join的场景如何优化

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

多流join的场景如何优化

hl9902@126.com
请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。

电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段):
market_act(营销活动): {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店}
new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间}
orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店}

需求:按活动统计活动期间新会员产生的订单金额
伪sql:
select act_id,count(1) as order_num,sum(amt) as order_amt
from orders t1
inner join new_member t2 on t1.member_id=t2.member_id
inner join market_act t3 on t2.act_id=t3.act_id
where t1.create_time between t3.start_time and t3.end_time ;

目前做法:
将 market_act 和 new_member 两个维表消息放到redis缓存,
flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动,
是则输出{act_id,order_no,amt,member_id},然后sink到db。

我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算?



[hidden email]
Reply | Threaded
Open this post in threaded view
|

Re: 多流join的场景如何优化

nick
flink sql + zeppelin

[hidden email] <[hidden email]> 于2021年1月26日周二 上午11:30写道:

> 请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。
>
> 电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段):
> market_act(营销活动):
> {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店}
> new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间}
>
> orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店}
>
> 需求:按活动统计活动期间新会员产生的订单金额
> 伪sql:
> select act_id,count(1) as order_num,sum(amt) as order_amt
> from orders t1
> inner join new_member t2 on t1.member_id=t2.member_id
> inner join market_act t3 on t2.act_id=t3.act_id
> where t1.create_time between t3.start_time and t3.end_time ;
>
> 目前做法:
> 将 market_act 和 new_member 两个维表消息放到redis缓存,
> flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动,
> 是则输出{act_id,order_no,amt,member_id},然后sink到db。
>
> 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算?
>
>
>
> [hidden email]
>
Reply | Threaded
Open this post in threaded view
|

Re: Re: 多流join的场景如何优化

hl9902@126.com
我们还没用到flink sql,有用流API实现的思路吗?



[hidden email]
 
发件人: yang nick
发送时间: 2021-01-26 11:32
收件人: user-zh
主题: Re: 多流join的场景如何优化
flink sql + zeppelin
 
[hidden email] <[hidden email]> 于2021年1月26日周二 上午11:30写道:
 

> 请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。
>
> 电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段):
> market_act(营销活动):
> {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店}
> new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间}
>
> orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店}
>
> 需求:按活动统计活动期间新会员产生的订单金额
> 伪sql:
> select act_id,count(1) as order_num,sum(amt) as order_amt
> from orders t1
> inner join new_member t2 on t1.member_id=t2.member_id
> inner join market_act t3 on t2.act_id=t3.act_id
> where t1.create_time between t3.start_time and t3.end_time ;
>
> 目前做法:
> 将 market_act 和 new_member 两个维表消息放到redis缓存,
> flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动,
> 是则输出{act_id,order_no,amt,member_id},然后sink到db。
>
> 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算?
>
>
>
> [hidden email]
>
Reply | Threaded
Open this post in threaded view
|

Re: Re: 多流join的场景如何优化

nick
两两join吧

[hidden email] <[hidden email]> 于2021年1月26日周二 下午2:28写道:

> 我们还没用到flink sql,有用流API实现的思路吗?
>
>
>
> [hidden email]
>
> 发件人: yang nick
> 发送时间: 2021-01-26 11:32
> 收件人: user-zh
> 主题: Re: 多流join的场景如何优化
> flink sql + zeppelin
>
> [hidden email] <[hidden email]> 于2021年1月26日周二 上午11:30写道:
>
> > 请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。
> >
> > 电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段):
> > market_act(营销活动):
> > {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店}
> > new_member(新增会员):
> {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间}
> >
> >
> orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店}
> >
> > 需求:按活动统计活动期间新会员产生的订单金额
> > 伪sql:
> > select act_id,count(1) as order_num,sum(amt) as order_amt
> > from orders t1
> > inner join new_member t2 on t1.member_id=t2.member_id
> > inner join market_act t3 on t2.act_id=t3.act_id
> > where t1.create_time between t3.start_time and t3.end_time ;
> >
> > 目前做法:
> > 将 market_act 和 new_member 两个维表消息放到redis缓存,
> > flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动,
> > 是则输出{act_id,order_no,amt,member_id},然后sink到db。
> >
> > 我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算?
> >
> >
> >
> > [hidden email]
> >
>
Reply | Threaded
Open this post in threaded view
|

Re:多流join的场景如何优化

Ye Chen
In reply to this post by hl9902@126.com
双流join或者多流join从技术上是可以实现你这个场景的,网上有很多成熟的案例。
但是要考虑具体的业务需求,比如数据是否能在规定时间到达,未到达如何处理,如果因为多流join造成数据缺失或者延迟,对业务影响比较大的话还不如继续用维表。

















在 2021-01-26 11:30:56,"[hidden email]" <[hidden email]> 写道:

>请教各位大佬,我现在有个多流join计算的场景,不知道该如何进行优化。
>
>电商业务有3个kafka消息源,消息结构描述如下(只列举主要字段):
>market_act(营销活动): {act_id:营销活动id,start_time:活动开始时间,end_time:活动结束时间,shop_id:活动的门店}
>new_member(新增会员): {member_id:新会员id,act_id:吸引会员的营销活动id,create_time:新会员生成时间}
>orders(订单):{order_no:订单号,amt:订单金额,member_id:会员id,create_time:订单时间,shop_id:下单的门店}
>
>需求:按活动统计活动期间新会员产生的订单金额
>伪sql:
>select act_id,count(1) as order_num,sum(amt) as order_amt
>from orders t1
>inner join new_member t2 on t1.member_id=t2.member_id
>inner join market_act t3 on t2.act_id=t3.act_id
>where t1.create_time between t3.start_time and t3.end_time ;
>
>目前做法:
>将 market_act 和 new_member 两个维表消息放到redis缓存,
>flink接orders 消息,在flatmap中读取redis维表信息,判断当前订单是否属于某个有效的活动,
>是则输出{act_id,order_no,amt,member_id},然后sink到db。
>
>我感觉这种做法没有充分发挥flink流的特性,有没有办法在flink里面直接join这3个流,搭配状态,进行计算?
>
>
>
>[hidden email]