离线数据Join我懂,但是实时数据怎么做Join的? by彭文华

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 离线数据Join我懂,但是实时数据怎么做Join的? by彭文华

刚接触实时数据的时候,那时候比较时兴叫“流式数据”。我就非常怀疑实时数据的应用场景极其有限。别的不说,单说 Join 这个非常常用的数据操作,你说咋实现?


Join 是咋回事?

在关系型数据库中,两个表的 Join 原理其实还是比较容易理解的。我们用最朴素的方式方法去理解,就是这个样子:

主表和副表进行 Join ,其实就是拿主表的每一条记录跟副表的每一条记录进行查询、匹配。有人说了,匹配上一条是不是就可以了?当然不行了,因为可能会存在多对多的关系,所以必须要每一条进行匹配。

匹配结束后,把匹配的结果进行合并,然后输出结果,这就是全表 Join 的原理了。不过这种方式简单且容易理解,但是这开销也太大了吧!相当于 N 个全表扫描了。

这种情况在一般的场景不多见,因为有经验的数据工程师会用第二种方法:

其实就是在副表的关联字段上建一个索引。这样,主表在去找数据的时候,就不用做全表扫描了,索引里有直接拿,然后回查一下就好了。速度那是嗷嗷快啊!

不过,对于那些就是没有索引的咋办?我们玩数据的最喜欢加一层中间层。Join 也是这么弄的,加一层 Join Buffer :

这样呢,一来可以减少对主表的访问频次,二来呢,在合并的时候也能减少对副表的访问次数。这样至少比两边都全表扫描快一些了。

不过,在这里你可能也发现了,这个主表很关键。如果主表里的数据也非常多,那效率影响还是会很大。如果主表里的id还会重复的话,那就更费劲了。

所以 Join 的几个优化原则就出来了:

  • 小表驱动大表,原理是减少主表的循环次数;
  • 副表Join字段必须有索引,原理是减少匹配的次数;
  • 尽量增加 JoinBuffer ,应对那些确实没有索引的情况。

如果是在 Hive 等大数据环境,还可以用一些分桶等优化的方式加快 Join 的效率。


这时候你可能会说了,你这都是离线数据的 Join ,咱都能理解。这离线数据都是已经放在那里的,怎么 Join 都行啊。但是实时数据,都是流动的,想关联一个 id ,副表里的数据还没到呢,咋关联啊?是啊,愁人!


实时数据咋 Join ?

实时数据,也叫流式数据。顾名思义啊,数据都是流动的,你都不知道下一个数据是啥时候来,不能做全表的排序和匹配,所以没办法跟离线数据一样直接 Join ,这个的确是比较复杂了一些。既然不能直接 Join ,那么我们能不能分不同的情况不同对待呢?当然是可以的了!我们来分析一下哈~~

我们在做 Join 的时候基本上有几种情况:

1、业务表和维表关联;

2、业务表和业务表关联;

   2.1、大表和小表关联;

   2.2、大表和大表关联;

   2.3、当前数据和当前数据关联;

   2.4、当前数据和历史数据关联。


你看,是不是基本就这些情况啊?好,我们一个一个来分析,看看咋解决。


业务表和维表关联

实时数据基本都是以 MQ 为传输和存储介质,用 Spark Streaming 、 Flink 作为计算引擎。所以呢,Join 的过程也就是在Spark Streaming、Flink 里进行了。

既然如此,我们能不能在这些计算引擎里把各种需要 Join 的不经常变的维表数据先读到 Redis 或者 HBase 等查询非常快的存储介质里,业务数据过来了,跟存储里的数据 Join 一下是不是就可以了?

当然可以了!这就是流表与维表的 Join 方案了!

不过这里还有一个小问题,就是维表是会发生变化的,这个好解决,我们整一个流程实时更新一下,这样就把 Redis 里的维表变成实时维表了,这样问题就解决。

业务表和业务表关联

这里分 4 种不同的情况,咱先说大表和小表关联。既然是小表,那这个还是比较好办的。咱的机器内存都不小,假设服务器都是 32G 内存的,空出 1G 放小表是不是 OK 啊?影响不会太大。所以大表和小表 Join 的解决方案就出来了,把小表通过广播的方式在大表所在的节点内存中,是不是就可以了?这样大表 Join 小表的时候,直接去内存里读取就好了么。


大表和大表关联呢?这个没办法。这种常规的全量 Join ,就只能把所有数据都在状态中存储所有的数据了。这种方法的资源占用是最大的,也是最没办法的。

当前数据和当前数据 join , Spark Streaming 和 Flink 都有办法解决。Flink 用的是窗口的逻辑。在同一个窗口中,两边的数据都到齐了,直接  join 就好了。我们需要操心的是数据迟到咋办,大致的思路就要么多等一会,要么之后再补齐一下。


当前数据和历史数据 join 其实跟上面的做法大致差不多,就是得加一个指定时间。


总结

离线数据 Join 其实就是无数个查询、匹配的过程。优化思路也比较清晰,减少主表数据量、增加副表索引等。


实时数据就比较费劲,因为没法做全量数据的排序啥的,所以得分很多种情况。但是都有解决方案。我们需要关注的是数据迟到了咋办,应对办法一般是多等会,或者之后再补齐。


这里借用一下鸣宇淳同学画的图作为总结,这张图上写的非常清晰。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
4月前
|
SQL 存储 分布式计算
奇思妙想的SQL|去重Cube计算优化新思路
本文主要分享了作者在蚂蚁集团高管数据链路改造升级过程中,针对去重Cube的优化实践。
642 48
|
7月前
|
存储 数据处理 数据库
TDengine 用户案例合集 | 智能环保项目的时序数据处理难点与优化实践
本篇文章汇总了三个典型的智能环保项目的数据架构升级实践,给有需要的企业参考。
167 1
|
4月前
|
SQL 分布式计算 数据挖掘
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
46 0
面试官嫌我Sql写的太low?要求我重写还加了三个需求?——二战Spark电影评分数据分析
|
5月前
|
jstorm 大数据 分布式数据库
大数据下的实时热点功能实现讨论(实时流的TopN)
我司内部有个基于jstorm的实时流编程框架,文档里有提到实时Topn,但是还没有实现。。。。这是一个挺常见挺重要的功能,但仔细想想实现起来确实有难度。实时流的TopN其实离大家很近,比如下图百度和微博的实时热搜榜,还有各种资讯类的实时热点,他们具体实现方式不清楚,甚至有可能是半小时离线跑出来的。今天不管他们怎么实现的,我们讨论下实时该怎么实现(基于storm)。
118 0
|
8月前
|
SQL 存储 分布式数据库
如何同时兼顾多维分析和快速查询的需求?Kudu来帮忙!彭文华
如何同时兼顾多维分析和快速查询的需求?Kudu来帮忙!彭文华
|
11月前
|
数据挖掘
白话Elasticsearch38-深入聚合数据分析之案例实战 下钻分析之统计每季度每个品牌的销售额
白话Elasticsearch38-深入聚合数据分析之案例实战 下钻分析之统计每季度每个品牌的销售额
87 0
|
11月前
|
数据挖掘
白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
白话Elasticsearch44-深入聚合数据分析之案例实战_颜色+品牌下钻分析时按最深层metric进行排序
65 0
|
SQL BI 索引
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(二十八):数仓报表场景☞人员分布问题以及不同组(分区)同时聚集如何实现
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
本篇文章讲解的主要内容是:***如何使用lag函数让结果集重复数据只显示一次、用行转列pivot写法优化部门之间计算工资差异类似需求、如何通过ceil函数对已有数据进行分组打印、放假安排团队分组值班,如何通过ntile()over(order by )快速进行人员分组***
【SQL开发实战技巧】系列(二十五):数仓报表场景☞结果集中的重复数据只显示一次以及计算部门薪资差异高效的写法以及如何对数据进行快速分组
【SQL开发实战技巧】系列(二十六):数仓报表场景☞聊聊ROLLUP、UNION ALL是如何分别做分组合计的以及如何识别哪些行是做汇总的结果行
本篇文章讲解的主要内容是:***ROLLUP、UNION ALL是如何分别做分组合计的以及如何通过CUBE 、GROUPING、GROUPING_ID 识别哪些行是做汇总的结果行***
【SQL开发实战技巧】系列(二十六):数仓报表场景☞聊聊ROLLUP、UNION ALL是如何分别做分组合计的以及如何识别哪些行是做汇总的结果行