10分钟掌握Doris,超越Hive、Elasticsearch和PostgreSQL

介绍Apache Doris作为数据仓库的升级,提高数据处理效率和查询能力。

微信搜索关注《Java学研大本营》

图片

以前,数据仓库通常由Apache Hive、MySQL、Elasticsearch和PostgreSQL组成。它们支持数据仓库的数据计算和数据存储层:

  • 数据计算:Apache Hive作为计算引擎。

  • 数据存储:MySQL为DataBank、Tableau和我们面向客户的应用程序提供数据。Elasticsearch和PostgreSQL用于我们的DMP用户分割系统:前者存储用户分析数据,后者存储用户组数据包。

不过,这样会导致数据管道又长又复杂,需要高维护成本,并且有损于开发效率。此外,它们无法进行特定查询。因此,作为数据仓库的升级,可以用Apache Doris替换了其中大部分组件,这是一种基于MPP架构的开源分析型数据库。

图片

图片

1 数据流

这是数据仓库的侧面视图,可以从中看到数据如何流动。

图片

首先,MySQL的binlog将通过Canal被摄入到Kafka中,而用户活动日志将通过Apache Flume传输到Kafka中。在Kafka中,数据将被清理并组织成平面表,然后将转换为聚合表。然后,数据将从Kafka传递到Apache Doris,它充当存储和计算引擎。

我们在Apache Doris中采用不同的数据模型来处理不同的场景:来自MySQL的数据将按照Unique模型进行排列,日志数据将放在Duplicate模型中,而DWS层中的数据将合并在Aggregate模型中。

这就是Apache Doris如何取代我们数据仓库中Hive、Elasticsearch和PostgreSQL的角色。这种转变在开发和维护方面节省了我们大量的工作量。它还使特定查询成为可能,并使我们的用户分割更加高效。

2 临时查询

之前:每次提出新请求时,我们都会在Hive中开发和测试数据模型,并在MySQL中编写调度任务,以便我们面向客户的应用程序平台可以从MySQL读取结果。这是一个复杂的过程,需要大量时间和开发工作。

之后:由于Apache Doris拥有所有明细数据,因此每当它面临新请求时,它只需提取元数据并配置查询条件即可。然后它就可以进行特定查询了。简而言之,它只需要低代码配置即可响应新请求。

图片

3 用户分割

之前:基于元数据创建用户分割任务后,相关的用户ID将被写入PostgreSQL配置文件列表和MySQL任务列表中。同时,Elasticsearch将根据任务条件执行查询;在产生结果后,它将在任务列表中更新状态,并将用户组位图包写入PostgreSQL。(PostgreSQL插件能够计算位图的交集、并集和差集。)然后,PostgreSQL将为下游操作平台提供用户组数据包。

Elasticsearch和PostgreSQL中的表格无法重复使用,这使得这种架构成本效益低。此外,我们必须预定义用户标签,才能执行新类型的查询。这减慢了速度。

之后:用户ID仅会被写入MySQL任务列表中。对于第一次分割,Apache Doris将根据任务条件执行特定查询。在随后的分割任务中,Apache Doris将执行微批量滚动,并计算与先前生成的用户组数据包相比的差异集,并通知下游平台进行任何更新。(这是由Apache Doris中的位图函数实现的。)

在这个以Doris为中心的用户分割过程中,我们不必预定义新标签。相反,标签可以根据任务条件自动生成。处理管道具有灵活性,可以使我们基于用户组进行A/B测试更加容易。此外,由于明细数据和用户组数据包都在Apache Doris中,因此我们不必关注多个组件之间的读写复杂性。

图片

4 提高用户分组速度的技巧,可提高70%

由于风险规避原因,随机生成user_id是许多公司的选择,但这会在用户组数据包中产生稀疏和非连续的用户ID。在用户分组中使用这些ID,我们必须忍受等待位图生成的漫长时间。

为了解决这个问题,我们为这些用户ID创建了连续和密集的映射。通过这种方式,我们将用户分组延迟降低了70%。

图片

图片

5 示例

步骤1:创建用户ID映射表:

我们采用唯一模型用于用户ID映射表,其中用户ID是唯一键。映射的连续ID通常从1开始严格递增。

图片

步骤2:创建用户组表:

我们采用聚合模型用于用户组表,其中用户标签作为聚合键。

图片

假设我们需要挑选出ID在0到2000000之间的用户。

以下代码段分别使用非连续(tyc_user_id)和连续(tyc_user_id_continuous)用户ID进行用户分组。它们的响应时间之间存在很大差距:

  • 非连续用户ID:1843ms

  • 连续用户ID:543ms

图片

6 总结

我们在Apache Doris中拥有2个容纳数十TB数据的集群,每天几乎有10亿行新数据流入。随着数据量的扩大,我们曾经目睹数据摄入速度急剧下降。但是,在使用Apache Doris升级数据仓库后,我们将数据写入效率提高了75%。此外,在结果集小于500万的用户分组中,它能够在毫秒内响应。最重要的是,我们的数据仓库对开发人员和维护人员更加简单和友好。

图片

推荐书单

《Spring Cloud 微服务快速上手》

《Spring Cloud 微服务快速上手》介绍了当下最主流的属于Spring生态的微服务框架,它继承了Spring Boot的优点,开发部署都非常简单。本书内容全面,介绍了微服务架构的发展历程,包含Spring Cloud Netflix 和 Spring Cloud 阿里巴巴的组件,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等。在解读核心组件的实现原理的同时,配以案例进行实践。本书内容包含微服务架构和云原生架构,读者在掌握微服务之后,可以进一步掌握云原生知识。
《Spring Cloud 微服务快速上手》icon-default.png?t=N7T8https://item.jd.com/13251159.html

图片

精彩回顾

10分钟掌握SQL连接:inner、outer、left、right

手把手教你用IntelliJ IDEA连接MySQL、PostgreSQL、MongoDB、Redis数据库

5个最难的SQL任务:数据缺失、透视、独热编码。。。

掌握这5个要点,利用IntelliJ IDEA进行前端开发

4条建议,打造精简、弹性、可维护的Android架构

微信搜索关注《Java学研大本营》

访问【IT今日热榜】,发现每日技术热点

### 关于DorisHive的关系及其交互方式 在现代大数据处理环境中,Apache Doris Apache Hive 都扮演着重要角色。然而两者的设计目标有所不同:Doris 是一款实时OLAP数据库,旨在提供快速的数据查询能力;而 Hive 更像是一个基于 Hadoop 的数据仓库工具,适合用于批处理大规模静态数据集。 为了实现更灵活的数据访问模式以及提高整体系统的效率,在某些场景下可以考虑将二者结合起来使用。具体来说,通过配置 DorisHive Catalog 功能[^1],可以让 Doris 直接读取存储在 Hive 中的数据文件,从而无需重复导入导出操作即可享受两种技术的优势——既保留了原有 Hive 数据湖中的海量历史资料,又能够利用 Doris 实现高效的即席查询服务。 #### 使用Doris连接到Hive的具体方法如下: 首先需要确保已经正确设置了 MySQL 客户端环境来管理多源之间的切换命令 `switch` 可以帮助用户轻松改变当前会话所使用的外部表所属的Catalog名称。当输入 `mysql> switch hive;` 后如果返回提示信息为 "Query OK, 0 rows affected" 则表示成功选择了名为 'hive' 的Catalog[^5]。 接着可以通过创建外表的方式定义指向HDFS上由Hive管理的实际位置路径下的Parquet/ORC等格式化后的结构化数据文件作为新的逻辑视图供后续SQL语句调用分析之需。 ```sql CREATE EXTERNAL TABLE IF NOT EXISTS dws_sales_order_detail ( order_id BIGINT, product_id INT, quantity DOUBLE, price DECIMAL(9,2), create_time DATETIME ) ENGINE=HIVE PROPERTIES( "resource" = "hive_catalog", "database" = "default" ); ``` 上述代码片段展示了如何在一个支持 SQL 查询接口的应用程序里声明一张关联至远端 Hive 表格的新实体对象实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值