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

Apache Flink 漫谈系列 - JOIN 算子

发布时间:2018-11-20 17:47:47 所属栏目:教程 来源:孙金城
导读:聊什么 在《Apache Flink 漫谈系列 - SQL概览》中我们先容了JOIN算子的语义和根基的行使方法,先容进程中各人发明Apache Flink在语法语义上是遵循ANSI-SQL尺度的,那么再深思一下传统数据库为啥必要有JOIN算子呢?在实现道理上面Apache Flink内部实现和传统

按照JOIN的语义以INNER JOIN为例,右边有两条沟通的订单流入,我们就应该向下流输出两条JOIN功效,当有撤回的变乱流入时辰,我们也必要将已经下发下流的JOIN变乱撤回,如下:

Apache Flink 漫谈系列 - JOIN 算子

上面的场景以及LEFT JOIN部门先容的撤回环境,Apache Flink内部必要处理赏罚如下几个焦点点:

  • 记录一再记录(完备记录一再记录可能记录沟通记录的个数)
  • 记录正向记录和撤回记录(完备记录正向和撤回记录可能记录个数)
  • 记录哪一条变乱是第一个可以与左边变乱举办JOIN的变乱

(1) 双流JOIN的State数据布局

在Apache Flink内部对差异的场景有非凡的数据布局优化,本篇我们只针对上面说的环境(通用计划)先容一下双流JOIN的State的数据布局和用途:

数据布局

  1. Map<JoinKey, Map<rowData, count>>; 
  • 第一级MAP的key是Join key,好比示例中的P001, value是流上面的全部完备变乱;
  • 第二级MAP的key是行数据,好比示例中的P001, 2,value是沟通变乱值的个数

数据布局的操作

  • 记录一再记录 - 操作第二级MAP的value记录一再记录的个数,这样大大镌汰存储和读取
  • 正向记录和撤回记录 - 操作第二级MAP的value记录,当count=0时辰删除该元素
  • 判定右边是否发生撤回记录 - 按照第一级MAP的value的size来判定是否发生撤回,只有size由0酿成1的时辰(第一条和左可以JOIN的变乱)才发生撤回

双流JOIN的应用优化

1. 结构更新流

我们在 《Apache Flink 漫谈系列 - 一连查询(Continuous Queries)》篇秩傩耀流JOIN为例先容了怎样结构营业上的PK source,结构PK source本质上在担保营业语义的同时也是对双流JOIN的一种优化,好比多级LEFT JOIN会让流上的数据不绝膨胀,造成JOIN节点机能较慢,JOIN之后的下流节点边堵(数据量大导致,非热门)。那么嫌少流入JOIN的数据,好比结构PK source就会大大镌汰JOIN数据的膨胀。这里不再一再举例,各人可以查阅 《Apache Flink 漫谈系列 - 一连查询(Continuous Queries)》 的双流JOIN示例部门。

2. NULL造成的热门

好比我们有A LEFT JOIN B ON A.aCol = B.bCol LEFT JOIN C ON B.cCol = C.cCol 的营业,JOB的DAG如下:

Apache Flink 漫谈系列 - JOIN 算子

假设在现实营业中有这样的特点,大部门时辰当A变乱流入的时辰,B还没有可以JOIN的数据,可是B来的时辰,A已经有可以JOIN的数据了,这特点就会导致,A LEFT JOIN B 会发生大量的 (A, NULL),个中包罗B内里的 cCol 列也是NULL,这时辰当与C举办LEFT JOIN的时辰,起首Blink内部会操作cCol对AB的JOIN发生的变乱流举办Shuffle, cCol是NULL进而是下流节点大量的NULL变乱流入,造成热门。那么这题目怎样办理呢?

我们可以改变JOIN的先后次序,来担保A LEFT JOIN B 不会发生NULL的热门题目,如下:

Apache Flink 漫谈系列 - JOIN 算子

3. JOIN ReOrder

对付JOIN算子的实现我们知道阁下双方的变乱城市存储到State中,在流入变乱时辰在从另一边读取全部变乱举办JOIN计较,这样的实现逻辑在数据量很大的场景会有必然的state操纵瓶颈,我们某些场景可以通过营业角度调解JOIN的次序,来消除机能瓶颈,好比:A JOIN B ON A.acol = B.bcol JOIN C ON B.bcol = C.ccol. 这样的场景,假如 A与B举办JOIN发生数据量很大,可是B与C举办JOIN发生的数据量很小,那么我们可以逼迫调解JOIN的联接次序,B JOIN C ON b.bcol = c.ccol JOIN A ON a.acol = b.bcol. 如下表示图:

Apache Flink 漫谈系列 - JOIN 算子

小结

本篇向各人先容了数据库计划范式的要求和现实营业的查询必要是传统数据库JOIN算子存在的缘故起因,并以详细示例的方法向各人先容JOIN在数据库的查询进程,以及隐藏的查询优化,再以现实的例子先容Apache Flink上面的双流JOIN的实现道理和State数据布局计划,最后向各人先容两个双流JOIN的行使优化。

作者:孙金城,混名 金竹,今朝就职于阿里巴巴,自2015年以来一向投入于基于Apache Flink的阿里巴巴计较平台Blink的计划研发事变。

【本文为51CTO专栏作者“金竹”原创稿件,转载请接洽原作者】

【编辑保举】

  1. Apache Flink 漫谈系列 - State
  2. Apache Flink 漫谈系列 - Fault Tolerance
  3. Apache Flink 漫谈系列 - 流表对偶(duality)性
  4. Apache Flink 漫谈系列 - 一连查询(Continuous Queries)
  5. Apache Flink 漫谈系列 - SQL概览
【责任编辑:赵宁宁 TEL:(010)68476606】
点赞 0

(编辑:湖南网)

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

热点阅读