打造高效实时数仓,从Hive到OceanBase的经验分享
本文作者:Coolmoon1202,大数据高级工程师,专注于高性能软件架构设计
我们的业务主要围绕出行领域,鉴于初期采用的数据仓库方案面临高延迟、低效率等挑战,我们踏上了探索新数仓解决方案的征途。本文分享了我们在方案筛选与实施过程中的经验总结,期望能为您提供有价值的参考与启示。
旧方案:(Hive + Spark)的三个挑战
线上业务环境主要以数据统计与查询分析为主,数据来源主要有两部分:一部分是通过前端应用采集,采集到的实时流数据先存储在消息队列中,使用Spark Streaming任务每10分钟定期同步Kafka数据到Hive数据仓库。这部分数据规模较大,最大的表数据量在百亿级。
另一部分是通过政务数据共享交换平台获取,汇聚后存储在前置库RDS中,通过Spark任务定期全量同步到Hive数据仓库。这部分数据规模较小,最大的表数据量在千万级。当各种源端数据汇总在 Hive 环境之后,使用 Spark 读取数据并在大数据集群进行分析计算。
使用这样的业务方案(Spark + Hive方案)存在三个挑战。
1.实时业务的挑战:数据定时导入Hive数据仓库,无法做到实时更新,数据时延10分钟以上;
2.复杂度的挑战:数据定期从RDS全量导入Hive时,导入速度较慢,导入一次千万的表需要3分钟上;
3.成本效率的挑战:使用Spark读取Hive进行数据分析统计时,一次上亿数据的统计需要3分钟以上;使用Spark进行数据定期导入与分析统计,消耗大数据集群CPU,内存资源较高,同一时间任务太多时需要排队执行。
为解决上述挑战,我们尝试用轻量级的实时数仓解决方案。由于此前对国产原生分布式数据库 OceanBase 有所耳闻,该数据库具备HTAP特性且满足实时数仓所要求的海量数据实时写入、实时更新、实时分析的特性。当我们得知其在2021年6月已经正式开源,就决定对 OceanBase 社区版3.1.1版本进行性能测试,测试详情见《OceanBase 社区版V3.1.1压力测试情况》(仅供参考)。
测试的结论是:在当前测试环境下,按照TPC-C标准进行测试,最高可达355,739 TpmC,最快可以在24.05秒完成整个TPC-H的测试SQL执行,说明OceanBase开源版V3.1.1在OLTP与OLAP场景下都有不俗的表现,并可通过横向扩展满足大部分海量数据高并发业务场景的性能需求。
除 OceanBase 数据看库外,我们也对TiDB、PloarDB-X进行了性能测试与综合评估,OceanBase 社区版在TPC-H性能测试下和内部真实业务压力下的表现最佳。经过内部评估,OceanBase 满足目前业务需求且 OceanBase 开源社区提供了良好的技术服务与支持,最终决定尝试使用 OceanBase 社区版作为实时数仓业务的解决方案。
新方案:(OceanBase+Flink)的部署与成效
经过一段时间的方案选型与测试评估后,我们最终决定使用 OceanBase 社区版3.1.3版本替换原来的Hive数据仓库,OceanBase 集群架构选择3-3-3。
- 硬件配置:ECS 9 台,32核128G内存,每台ECS挂载两块硬盘,一块500G SSD硬盘,用于保存数据库redo日志,另一块4T SSD硬盘,用于保存数据库数据。
- 资源分配:OBServer的memory_limit为102G,system_memory为30G,OBProxy内存为4G。OceanBase 集群部署成功后,修改sys租户资源为4核4G,新建业务租户分配资源26核64G,primary_zone设置为RANDOM,让业务租户表分区的Leader随机分配到这9台ECS中。
最初计划使用OCP部署 OceanBase 集群,但由于安装OCP需要依赖 OceanBase数据库,所以最终决定使用OBD进行部署,不过后期可以通过 OCP 来接管 OBD 部署的集群,这个过程也很方便。下图为 OceanBase 集群部署拓扑图。

使用新方案(OceanBase+Flink方案)后,成效显著,主要表现为以下三个方面。
第一,端到端数据链路时延从分钟级缩短到 3秒内。数据同步从Hive+Spark模式迁移到 OceanBase+Flink模式后,数据查询与分析业务也从Hive+Spark模式迁移到 OceanBase SQL模式。业务迁移后,数据从前端应用产生到从OceanBase查询出来,端到端链路时延降低到3秒以内,而之前由于数据是从Kafka定期同步到Hive,再用Spark从Hive查询出来,至少需要10分钟的时间。
第二,硬件成本收益明显。RDS数据同步由Spark定期全量同步到Hive改成了使用Flink CDC实时增量同步到 OceanBase 后,增量模式的流任务对资源占用由抖动变得平滑,通过Flink session模式,减少了增量数据同步流任务资源空占,从而大幅度降低了大数据集群的资源占用,所需大数据集群资源从140核280G降低到23核46G,硬件成本下降84%。
第三,SQL 查询时间从分钟级到秒级。将Spark+Hive查询统计任务改成OceanBase 的SQL语句后,开启SQL分布式执行的并行Hint,6000万左右的数据查询统计(select /*+ parallel(36) */ count(1) from health_query_log where datetime >='2022-05-01 00:00:00' and datetime<='2022-06-01 00:00:00'; )在15秒内完成,而之前需要3分钟,因此统计SQL执行时间从3分钟降低至 15秒。
选择 OceanBase 的实践总结
在我们将OceanBase社区版作为实时数仓的使用过程中,总结了OceanBase社区版在该业务下的一些使用实践,供大家参考。
1. 表的创建删除索引速度较快,这样可以根据业务需求按需进行索引创建,从而大幅提高数据检索效率。
2.支持丰富的窗口函数,可以满足较为复杂的查询与统计需求。
3.支持JSON数据类型,可以直接从JSON数据中提取所需数据并创建虚拟列,从而当上游数据结构发生变化后也不需要重跑历史数据,非常好用。
4.在多表 join 情况下,尤其是使用 TableGroup功能后查询速度更快,强烈推荐。
5.OceanBase 社区版兼容 MySQL 5.7 的绝大部分功能和语法,极大地降低了开发人员的学习成本,在RDS数据同步过程中基本上没有遇到兼容性问题,迁移过程顺利。
此外,在实际使用中发现一些当前 OceanBase 社区版不支持或有计划支持的功能,目前已提交社区进行下一步迭代:
1. 暂不支持全文索引,当遇到需要对中文字符串进行模糊查询时,需要对全表进行扫描。比如,需要用家庭住址的部分信息进行模糊查询时,可使用 MySQL 的 FullText索引,然而迁移到 OceanBase 后,则无法利用全文索引来提高查询性能,当前使用 like 模糊匹配临时绕过。经过和社区官方技术团队沟通,OceanBase 计划在后续版本中进行支持。
2. 暂不支持物化视图,对于一些大表(亿级别以上)无法进行数据实时增量统计。比如对大表进行 count + group by操作时,因每次都要进行全量数据的计算,不能利用物化视图的预计算特性来降低每次查询时的数据计算量,导致部分场景计算速度达不到预期的效果。因此,当对海量数据统计实时性要求很高时,不得不寻求其他解决方案。
3. 可能导致该语句执行时,OceanBase 节点内存OOM而引起节点宕机的风险,可以通过改写子查询select count(*) from (select distinct ...)来规避此问题。
最后,感谢 OceanBase 社区技术人员对本次项目的技术支持。在我们进行OceanBase 社区版的部署、测试、迁移、使用及运维的各个阶段中,对我们提出有关 OceanBase 的各方面问题都进行了耐心与及时的解答,针对系统执行较慢的SQL统计语句也给出了优化建议,从而保证了业务实时数仓改造的顺利进行。预祝 OceanBase 社区发展越来越红火。
相关文章:
打造高效实时数仓,从Hive到OceanBase的经验分享
本文作者:Coolmoon1202,大数据高级工程师,专注于高性能软件架构设计 我们的业务主要围绕出行领域,鉴于初期采用的数据仓库方案面临高延迟、低效率等挑战,我们踏上了探索新数仓解决方案的征途。本文分享了我们在方案筛选…...
15.3 JDBC数据库编程
15.3 JDBC数据库编程 15.3.1 创建数据库和表 创建一个名为webstore的数据库,并向其中添加数据,代码如下: 1.创建数据库 CREATE TABLE products( id int PRIMARY KEY, pname VARCHAR(20) brand VARCHAR(20), price FLOAT(7,2), stock SMALLINT, ) …...
SSH公私钥后门从入门到应急响应
目录 1. SSH公私钥与SSH公私钥后门介绍 1.1 SSH公私钥介绍 1.1.1 公钥和私钥的基本概念 1.1.2 SSH公私钥认证的工作原理(很重要) 1.2 SSH公私钥后门介绍 2. 如何在已拿下控制权限的主机创建后门 2.1 使用 Xshell 生成公钥与私钥 2.2 将公钥上传到被需要被植入后门的服务…...
服务器数据恢复—Linux操作系统环境下网站数据的恢复案例
服务器数据恢复环境: 一台linux操作系统服务器上跑了几十个网站,服务器上只有一块SATA硬盘。 服务器故障: 服务器突然宕机,尝试再次启动失败。将硬盘拆下检测,发现存在坏扇区。找当地一家数据恢复公司处理后ÿ…...
开放式耳机是怎么样的?开放式耳机的优缺点分析?
开放式耳机作为一种独特的耳机类型,因其独特设计和使用体验受到了许多用户的喜爱。了解开放式耳机的优缺点有助于大家更好地选择适合自己需求的耳机。以下是开放式耳机的一些主要优点和缺点分析: 优点 l 舒适度高 开放式耳机的设计通常更加轻盈&#…...
HDMI色块移动——FPGA学习笔记13
一、方块移动原理 二、实验任务 使用FPGA开发板上的HDMI接口在显示器上显示一个不停移动的方块,要求方块移动到边界处时能够改变移动方向。显示分辨率为800*480,刷新速率为90hz。(480p分辨率为800*480,像素时钟频率Vga_clk 800x4…...
MySQL中去除重复
除去相同的行 SELECT DISTINCT 列名 FROM 表名; 示例:查询employees表,显示唯一的部门ID select distinct department_id from employees;...
【C++】vector容器的基本使用
一、vector是什么 vector是STL第一个正式的容器,它的底层其实就是动态数组,插入数据时当容量满了会自动扩容,它和string差不多,不同的之处之一在于vector本身是一个模板,它这个容器中可以存放各种各样的类型的数据&am…...
【强化学习系列】Gym库使用——创建自己的强化学习环境2:拆解官方标准模型源码/规范自定义类+打包自定义环境
目录 一、 官方标准环境的获取与理解 二、根据官方环境源码修改自定义 1.初始化__init__() 2.重置环境 reset() 三、打包环境 1.注册与创建自定义环境 2.环境规范化 在本文的早些时候,曾尝试按照自己的想法搭建自定义的基于gym强化学习环境。 【强化学习系列】Gy…...
PyQt5实现按钮选择文件夹及文件夹
目录 1、选择文件夹并显示 2、选择文件 3、选择多个文件 4、设置保存文件路径 1、选择文件夹并显示 from PyQt5 import QtWidgetsdirectory QtWidgets.QFileDialog.getExistingDirectory(None, "选取文件夹", "./") # 起始路径 print(directory) 2…...
Gin渲染
HTML渲染 【示例1】 首先定义一个存放模板文件的 templates文件夹,然后在其内部按照业务分别定义一个 posts 文件夹和一个 users 文件夹。 posts/index.tmpl {{define "posts/index.tmpl"}} <!DOCTYPE html> <html lang"en">&…...
前端——JS基础
定义变量:let / var 字符串 字符串拼接: 字符串和数字拼:您.... 25 ; 这个25会转成字符串再拼接 字符串和数组拼:10以内的质数有: [2,3,5,7] > 10以内的质数有:2,3,5,7 字符串长度:leng…...
MATLAB入门教程
MATLAB安装教程可参考链接:matlab怎么安装 matlab安装教程-电脑软件-PHP中文网 1.MATLAB的工作环境 (1)命令窗(command window) 是对MATLAB进行操作的主要载体。默认情况下,启动MATLAB时就打开命令窗。MATLAB的所有所数…...
muduo - 概要简述
作者:陈硕 编程语言:C 架构模式:Reactor 代码链接:GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C11 设计自述:https://www.cnblogs.com/Solstice/archive/2010/08…...
Selenium点击元素的方法
前言 点击方法在web自动化测试中经常用到,下面就来介绍一下selenium常用和不常用的点击方法; 1、常用方法 1.1、使用 click() 方法: 这是最简单和最常用的方法。通过选中要点击的元素,然后使用 click() 方法来触发点击事件。 示例代码: element = self.driver.find_e…...
kali里面搭建docker容器
注意事项:kali版本,镜像源 (1)权限为管理员: sudo su (2) 更新软件包列表并升级已安装的软件包 apt-get update apt-get upgrade 出错了,应该是更新源出问题了。 (3)更换镜像源&am…...
WebGL系列教程八(GLSL着色器基础语法)
目录 1 前言2 基本原则3 基本数据类型4 顶点着色器和片元着色器4.1 声明4.2 初始化项目4.3 赋值 5 结构体5.1 声明5.2 赋值 6 函数6.1 基本结构6.2 自定义函数6.3 常用内置函数 7 精度8 其他9 总结 1 前言 通过前七讲,我们已经见过了WebGL中的部分基础语法ÿ…...
go多线程
1、简单使用(这个执行完成,如果进程执行比较久,这里不会等待它们结束) package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…...
【话题】如何看待IBM中国研发部裁员?
(一)背景 在全球化的大趋势下,跨国公司的业务布局一直处于动态调整之中。IBM 作为全球知名的 IT 企业,在中国市场已经运营多年,其在中国的研发中心曾经为公司的全球业务发展做出了重要贡献。近年来,全球经…...
【C/C++】涉及string类的经典OJ编程题
【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数(atoi)解法一:(不用long)完整代码:解法二:(用long) 二.字符串相加代码实现(含注释)&a…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
