我觉得本篇博客算是性能优化的一个补充,性能优化篇:
Blink性能优化配置及原理

文章目录

  • 双流john
  • 维表join以及优化
    • 维表join开启cache策略
    • 缓存未命中 key
    • Distribute By 提高缓存命中率
    • Partitioned All Cache 解决超大维表 JOIN
    • Async维表join优化
  • 最佳实践

双流john

• 支持等值连接和不等值连接
• 支持 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, ANTI JOIN, SEMI JOIN
• 不等值连接因为缺少等值条件,所以数据会聚集到一个并发上计算,性能会不高

  SELECT o.rowtime, o.productId, o.orderId, o.units,p.name, p.unitPriceFROM Orders AS oJOIN Products AS pON o.productId = p.productId;

维表join以及优化

维表join详细的内容以及优化内容在整个blink文档中多次提及,且在ata文章中也有很多讲到,我也是刚刚阅读完整个文档,遂将所有维表相关的join以及优化操作进行了整理,方便查阅。

维表join开启cache策略

LRU
通过 cache='LRU’参数可以开启 LRU 缓存优化,每个 JoinTable 节点创建一个 LRU 本地缓存。当每个数据进来的时候,先去缓存中查询,如果存在则直接关联输出,减少了一次 IO 请求。如果不存在,再发起数据库查询请求(异步或同步方式),请求返回的结果会先存入缓存中以备下次查询。
为了防止缓存无限制增长,所以使用的是 LRU 缓存,并且可以通过 cacheSize 调整缓存的大小。为了定期更新维表数据,可以通过 cacheTTLMs 调整缓存的失效时间。cacheTTLMs 是作用于每条缓存数据上的,也就是某条缓存数据在指定 timeout 时间内没有被访问,则会从缓存中移除。
ALL
ALL cache 可以通过 cache='ALL’参数开启,通过cacheTTLMs控制缓存的刷新间隔。Flink SQL 会为 JoinTable 节点起一个异步线程去同步缓存。在 Job 刚启动时,会先阻塞主数据流,直到缓存数据加载完毕,保证处理维表关联时,缓存数据已经被加载到缓存中。之后的更新缓存的过程不会阻塞主数据流,因为异步更新线程会将维表数据加载到临时缓存,加载完毕后再与原先的缓存做原子替换。
因为几乎没有 IO 操作,所以使用 cache ALL 的维表 JOIN 性能可以非常高。但是由于内存需要能同时容纳下两份维表拷贝,因此需要加大内存的配置。

使用方式
Cache 策略是配置在维表 DDL 的 WITH 参数里。Cache 相关的参数如下:

配置项说明:
当使用LRU Cache 时,需要配置: 缓存大小(cacheSize),缓存超时时间(cacheTTLMs), 是否开启 PartitionedJoin 优化 (partitionedJoin)。
当使用 ALL Cache 时,需要配置:缓存更新间隔(cacheTTLMs),更新时间黑名单(cacheReloadTimeBlackList)和 是否开启 PartitionedJoin 优化 (partitionedJoin)。

缓存未命中 key

在使用 LRU 缓存时,如果存在大量的 invalid key ,或者数据库中不存在的 key。由于命中不了缓存,导致缓存的收益较低,仍然会有大量请求打到数据库。因此我们将未命中的 key 也加进了缓存,提高了未命中 key 和 invalid key 情况下的缓存命中率

Distribute By 提高缓存命中率

默认 JoinTable 节点与上游节点之间是chain在一起,不经过网络。这在缓存大小有限、key总量大、热点不明显的情况下, 缓存的收益可能较低。这种情况下可以将上游节点与 JoinTable 节点的数据传输改成按 key 分区。这样通常可以缩小单个节点的 key 个数,提高缓存的命中率。比如一段时间内 JoinTable 节点总共需要处理100万个key, 节点并发100, 在数据不倾斜时单节点平均只需处理1万个key = 100万/100并发. 如果不做 key 分区, 单节点实际处理的key个数可能远大于1万。使用上也非常简单,在维表的 DDL 参数中加上partitionedJoin='true’即可。

Partitioned All Cache 解决超大维表 JOIN

其实就是维表太大了,join的过程中为了满足cache all,所以需要很大的缓存资源,这时候如果使用partitioned all cache就可以实现一个shuffle功能,将缓存的压力分发给很多并发中,这样就可以避免无法加载全量维表数据的问题。
背景
原始的维表 JOIN 是同步访问的方式,来一条数据,去数据库查询一次,等待返回后输出关联结果。
维表 JOIN 使用 Cache All 策略的情况下,默认行为是每个进程会加载全量的维表数据到缓存中。使用 Cache All的情况下,维表 JOIN 节点的内存配置至少是维表大小的2倍。
当维表较大时,维表 JOIN 节点需要消耗大量内存,另外作业 GC 会比较严重;甚至对于超大维表(比如 1T+),内存里无法加载全量维表数据。
为了解决这个问题,引入 Partitioned All Cache 优化,上游数据会按照 Join Key Shuffle 数据,每个并发上只需要加载部分维表数据到缓存中。
使用方式
只需要在维表的 DDL 的 WITH 参数里加上 partitionedJoin = ‘true’ 参数即可。
开启 PartitionedJoin 优化,可以减少内存开销。但是由于上游数据需要按照 JoinKey 做 shuffle,引入额外的网络开销和 CPU 开销。因此下面两种场景不适合开启 PartitionedJoin:

  1. 上游数据在 Join Key 上存在严重的数据倾斜,这种场景下如果开启 PartitionedJoin,会因为数据倾斜导致慢节点。
  2. 维表数据很小(比如小于 2G)的场景下如果开启 PartitionedJoin,节约的内存开销和额外引入的网络开销和 CPU 开销相比,可能并不划算。

Async维表join优化

背景
原始的维表 JOIN 是同步访问的方式,来一条数据,去数据库查询一次,等待返回后输出关联结果。可以发现网络等待时间极大地阻碍了吞吐和延迟。为了解决同步访问的问题,引入异步模式并发地处理多个请求和回复,从而连续的请求之间不需要阻塞等待。

Flink SQL 基于框架的 Async IO 和异步客户端实现了维表 JOIN 的异步化,极大地提高了吞吐率。
使用方式
在维表的 DDL 中加上 async=‘true’ 参数。Async 相关参数如下:

最佳实践

在使用维表 JOIN 时,如果维表数据不大,或者 miss key (维表中不存在的 key)非常多,则可以使用 ALL cache,但是可能需要适当调大节点的内存,因为内存需要能同时容纳下两份维表拷贝。如果用不了 ALL cache,则可以使用 Async + LRU 来提高节点的吞吐

Blink中的维表join及优化相关推荐

  1. flink sql 知其所以然(十四):维表 join 的性能优化之路(上)附源码

    看了那么多的技术文,你能明白作者想让你在读完文章后学到什么吗? 大数据羊说__的文章会让你明白 大数据羊说 用数据提升美好事物发生的概率~ 43篇原创内容 公众号 博主会阐明博主期望本文能给小伙伴们带 ...

  2. Flink SQL 功能解密系列 —— 维表 JOIN 与异步优化

    2019独角兽企业重金招聘Python工程师标准>>> 引子 流计算中一个常见的需求就是为数据流补齐字段.因为数据采集端采集到的数据往往比较有限,在做数据分析之前,就要先将所需的维度 ...

  3. 阿里云流计算中维表join VS 流join

    最近业务上使用blink进行清洗数据,使用到了双流join和维表join,今天有同学问我流join和维表join有什么区别.在此我做个简单的说明,描述不对的地方,欢迎大家纠正,后面补充. 流式计算过程 ...

  4. flink中维表Join几种常见方式总结

    flink中维表Join 需求如下: 一个主流中数据是用户信息,字段包括用户姓名.城市id: 维表是城市数据,字段包括城市ID.城市名称. 要求用户表与城市表关联,输出为:用户名称.城市ID.城市名称 ...

  5. Flink 实时计算 - 维表 Join 解读

    Flink 实时计算 - 维表 Join 解读 前言 Flink 1.9 版本可以说是一个具有里程碑意义的版本,其内部合入了很多 Blink Table/SQL 方面的功能,同时也开始增强 Flink ...

  6. ​实战:Flink 1.12 维表 Join Hive 最新分区功能体验

    我们生产常有将实时数据流与 Hive 维表 join 来丰富数据的需求,其中 Hive 表是分区表,业务上需要关联上 Hive 最新分区的数据.上周 Flink 1.12 发布了,刚好支撑了这种业务场 ...

  7. mysql表分区join_​实战:Flink 1.12 维表 Join Hive 最新分区功能体验

    ​实战:Flink 1.12 维表 Join Hive 最新分区功能体验 余东@哗啦啦 Flink 中文社区 我们生产常有将实时数据流与 Hive 维表 join 来丰富数据的需求,其中 Hive 表 ...

  8. MapReduce 中的两表 join 几种方案简介

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的.而在HADOOP中进行JOIN操作,同样常见且耗时,由于Hadoop的独特设计思想,当进行JOIN操作时,有一些特殊的 ...

  9. 袋鼠云研发手记 | 开源·数栈-扩展FlinkSQL实现流与维表的join

    作为一家创新驱动的科技公司,袋鼠云每年研发投入达数千万,公司80%员工都是技术人员,袋鼠云产品家族包括企业级一站式数据中台PaaS数栈.交互式数据可视化大屏开发平台Easy[V]等产品也在迅速迭代.在 ...

最新文章

  1. java学习笔记(九)----多线程
  2. python字符垂直输出型烟雾机_python+opencv实现水平投影和垂直投影
  3. 大数据玩家们对2013年趋势的预测
  4. linux send与recv函数详解
  5. python输入学号返回成绩_Python模拟登陆正方教务系统并抓取成绩单
  6. IOS Push 证书的重新生成
  7. SpringBoot开发案例之整合Spring-data-jpa
  8. mysql开启权限控制_mysql开启远程访问及相关权限控制
  9. 本博客停止更新,后续用博客园。
  10. Android平台的通话计时源码
  11. Hadoop技术内幕-Hadoop文件系统
  12. 神经网络控制与matlab仿真,matlab神经网络能做什么
  13. IMX6Q开发板使用USB直接连接HP LaserJet 1020 plus打印机打印。
  14. 经纬度坐标系之间相互转化工具(百度与WGS84、百度与国测局、国测局与WGS)
  15. C我语言编程老鼠寻路,数据结构课设-走迷宫游戏.doc
  16. CentOS7图形界面启动报错unable to connect to X server
  17. 云呐|常用的固定资产盘点方法有哪些
  18. Python 操作Mongodb 聚合前过滤筛选
  19. Keil软件介绍与烧录工具的使用
  20. 文件传输工具FileZillaWinSCP

热门文章

  1. 自定义平台MQ,SpringBoot自动注入【xdx-mq-starter】
  2. GLSL——常用内建函数与应用
  3. 【iOS】—— 引用计数
  4. 项目日志20190713
  5. 超级求爱程序--为我们的程序工作找乐子
  6. 红心html 制作,CSS3实现红心点赞特效
  7. sparkStreaming:实时流数据详解
  8. Java学习之路让我帮助很大的书籍
  9. topsec***检测系统规则库手动升级
  10. 2021年8月国产数据库排行榜:TiDB稳榜首,达梦返前三,Kingbase进十强,各厂商加速布局云生态