加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列 - 持续查询(Continuous Queries)

发布时间:2018-11-08 10:42:25 所属栏目:教程 来源:孙金城
导读:一、实际问题 我们知道在流计算场景中,数据是源源不断的流入的,数据流永远不会结束,那么计算就永远不会结束,如果计算永远不会结束的话,那么计算结果何时输出呢?本篇将介绍Apache Flink利用持续查询来对流计算结果进行持续输出的实现原理。 二、数据管

上图描述了一个双流JOIN的场景,双流JOIN的底层实现会将左(L)右(R)两面的数据都持久化到Apache Flink的State中,当L流入一条事件,首先会持久化到LState,然后在和RState中存储的R中所有事件进行条件匹配,这样的逻辑如果R流product_id为P001的产品销售记录已经流入4条,L流的(P001, 48) 流入的时候会匹配4条事件流入下游(join_sink)。

2. 问题

上面双流JOIN的场景,我们发现其实inventory和sales表是有业务的PK的,也就是两张表上面的product_id是唯一的,但是由于我们在Sorure上面无法定义PK字段,表上面所有的数据都会以append only的方式从source流入到下游计算节点JOIN,这样就导致了JOIN内部所有product_id相同的记录都会被匹配流入下游,上面的例子是 (P001, 48) 来到的时候,就向下游流入了4条记录,不难想象每个product_id相同的记录都会与历史上所有事件进行匹配,进而操作下游数据压力。

那么这样的压力是必要的吗?从业务的角度看,不是必要的,因为对于product_id相同的记录,我们只需要对左右两边最新的记录进行JOIN匹配就可以了。比如(P001, 48)到来了,业务上面只需要右流的(P001, 22)匹配就好,流入下游一条事件(P001, 48, 22)。 那么目前在Apache Flink上面如何做到这样的优化呢?

3. 解决方案

上面的问题根本上我们要构建一张有PK的动态表,这样按照业务PK进行更新处理,我们可以在Source后面添加group by 操作生产一张有PK的动态表。如下:

  1. SQL: 
  2.  
  3. CREATE TABLE inventory_tab( 
  4. product_id VARCHAR, 
  5. product_count BIGINT 
  6.  
  7. CREATE TABLE sales_tab( 
  8. product_id VARCHAR, 
  9. sales_count BIGINT 
  10. CREATE VIEW inventory_view AS 
  11. SELECT 
  12. product_id, 
  13. LAST_VALUE(product_count) AS product_count 
  14. FROM inventory_tab 
  15. GROUP BY product_id; 
  16.  
  17. CREATE VIEW sales_view AS 
  18. SELECT 
  19. product_id, 
  20. LAST_VALUE(sales_count) AS sales_count 
  21. FROM sales_tab 
  22. GROUP BY product_id; 
  23.  
  24. CREATE TABLE join_sink( 
  25. product_id VARCHAR, 
  26. product_count BIGINT, 
  27. sales_count BIGINT, 
  28. PRIMARY KEY(product_id) 
  29. )WITH ( 
  30. type = 'print' 
  31. ) ; 
  32.  
  33. CREATE VIEW join_view AS 
  34. SELECT 
  35. l.product_id, 
  36. l.product_count, 
  37. r.sales_count 
  38. FROM inventory_view l 
  39. JOIN sales_view r 
  40. ON l.product_id = r.product_id; 
  41.  
  42. INSERT INTO join_sink 
  43. SELECT 
  44. product_id, 
  45. product_count, 
  46. sales_count 
  47. FROM join_view ; 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读