数仓成本下降近一半,StarRocks 存算分离助力云览科技业务出海

news2024/11/14 21:12:29

成都云览科技有限公司倾力打造了凤凰浏览器,专注于为海外用户提供服务,公司致力于构建一个全球性的数字内容连接入口,为用户带来更为优质、高效、个性化的浏览体验。

作为数据驱动的高科技公司,从数据中挖掘价值一直是公司核心任务,公司以前选用了众多组件来提升内部大数据分析效率,如 Trino 作为即席查询的工具、用 ClickHouse 和 StarRocks 来加速报表业务查询,但经过长期实践,最终决定将所有内部数据分析平台统一至 StarRocks。

而且,社区在 3.0.0 版本中发布了存算分离能力,与公司内部大数据平台部门正在推动的降本增效理念非常契合,部门也在第一时间测试验证,确定评测各方面满足业务需求后,已经开始逐步在线上业务中替换现有系统,未来也会作为公司大数据平台部门统一数据架构的重点发展方向。

平台现状

作为公司内部大数据平台部门,主要负责公司海量数据处理、数据质量保证及指标体系维护的工作,服务公司四大业务场景:用户画像、报表、实验系统以及业务服务。公司大数据平台经过上云及几次云平台迁移,当前结合某云 EMR、对象存储建设存算分离的架构,主要架构如下图所示:

alt

如图所示,原始数据存储在 Kafka 中,通过 Flink 消费,写入到 OSS 中,然后通过 Hive 和 Spark 进行数据进一步加工,最后再将数据导入不同的 OLAP 组件中供业务查询。后期统一了计算引擎,使用 Spark on K8s 的架构,使用 Spark SQL 和自定义了 UDF/UDAF 对数据进行统一处理。

平台痛点

我们在发展过程中不断采用新技术来满足不同业务需求,日积月累,各种数据处理与分析组件越来越多,面临着巨大的压力与挑战,主要表现在以下几点:

使用组件多,维护成本高

公司的业务近几年飞速增长,伴随着业务扩张带来了数据量指数式增长。我们的分析平台规模也相应增长,使用的规模变大,平台维护成本也成倍增长。例如,仅 OLAP 我们就使用了 Trino、ClickHouse、StarRocks。其中,Trino 给业务同学提供即席查询用途,ClickHouse 负责应用与用户洞察、实验系统和报表,StarRocks 对接业务报表。维护成本高体现在:

学习成本高,不同的系统实现不同,语法兼容性不同,对开发人员提出了很高要求。

定位问题复杂,三种组件对应三套监控系统,定位排查问题需要查看不同的监控系统,搜索各自的日志,排查链路很长。

链路冗长,数据时效性难以保证

数据由客户端上报,通过统一的转发服务,进入到不同的 Kafka 实例中,再经由 Flink 消费,sink 到数仓的 ODS 层,最后通过 tez 和 Spark SQL 对数据进行处理,构建数仓分层。而这其中 ODS 层的数据统一处理,整体时间就需要3小时左右,偶尔中间任务数据产出有误,需重跑整条链路,数据延时会被进一步拉长。

服务稳定性不足

当并发量大、大查询多时,Trino 很容易出现内存溢出,稳定性不足,目前统计线上查询失败的情况约有10%左右由内存溢出导致。ClickHouse 则无法处理高并发场景,很容易因 cpu 打满导致服务重启。

StarRocks 存算分离调研

StarRocks 社区在 3.0.0 版本推出了存算分离版本,与我们内部追求降本增效的目标不谋而合,我们也第一时间进行了调研测评。

在调研时我们特别关注这几个方面:

查询效率,相比存算一体,用户不能感觉到较为明显的查询变慢

显著的成本降低,这也是我们尝试存算分离新架构的初衷

能够无缝替换我们正在使用的各个组件,为未来统一分析打好基础

运维简单,减轻开发运维同学的日常工作复杂度

最后是需要社区比较活跃,问题能得到及时的处理

以下是我们针对各个维度的一些调研结果。

性能对比

我们针对单表和多表 Join 两种真实线上场景进行了具体测试,采用两个相同规模的集群,对同一数据量的表,进行相同的查询,多次查询,取平均值的方式进行对比。ClickHouse 集群规模:单节点 96C * 384G , StarRocks 集群 6 * 16C * 64G。单表查询的数据量大小为 200G,数据行数为1.3亿行,对表进行 count 计数查询。Join 查询为表进行自 Join,然后进行 count 计数查询。

alt

alt StarRocks VS ClickHouse

测试表明,在 ClickHouse 最拿手的单表查询场景中, StarRocks 存算分离性能可以保持一致,在多表 Join 场景中,StarRocks 能快3倍左右。

存储成本

在对比了性能后,我们对比了存算一体和存算分离的成本情况。在存算一体中数据量 1T 的表通过 export 到 OSS,再通过 Broker Load 到存算分离集群中,由标准磁盘存储转换为对象存储,后期还可以在对象存储内将数据进行冷热归档,进一步节省成本。从云服务文档中了解到,标准磁盘存储 1T 存储一天7 (某云法兰克福 OSS 计费),存储费用降为原来的1/15。成本的详细计算可以看后文。

易用性

我们了解到 StarRocks 也推出了 Operator 支持 K8s 集群部署。利用 K8s 本身的容灾恢复机制以及强大的 StarRocks Operator 显著降低了集群部署运维复杂性。另外,StarRocks 还提供了较为丰富的监控和诊断工具,便于我们在第一时间观察系统运行情况。

StarRocks 存算分离实践

查询优化

物化视图

在一些实时查询的场景,我们发现,通过物化视图进行预聚合的方式,能达到查询事半功倍的效果。例如我们的实时分析场景,通过 Flink 直接将明细数据写入到 StarRocks,最初直接对原始明细数据复杂查询,耗时约30秒左右,后来看社区力推物化视图,我们也为该表创建异步物化视图,对明细数据进行预聚合,结果显示,查询延迟降低为3秒左右,带来了10倍性能提升。

物化视图的场景我们刚刚体验,就取得了比较惊艳的效果,未来我们将在更多场景中推广该能力,进一步提升业务同学体验。

数据分桶

在初见 StarRocks 存算分离时,我们简单认为数据存储在对象存储中,建表时我们没有关注分桶数设置,分桶数设置过多,结果在使用时发现随着系统 Tablet 数量越来越多,发现 FE 的内存被打满。后来在社区同学帮助下定位发现是由于 Tablet 过多导致 FE 节点一直在 GC。最后通过增加 FE 内存,再按数据量合理分配不同表的分桶数便彻底解决了该问题。

根据我们实际使用的经验来看,一般为每个分桶差不多容纳 1 ~ 3G 数据容量比较合理,过多的数据分桶会产生大量的小文件且降低了 I/O 效率,而分桶数不足则可能会影响查询的并发效果。

聚合查询模型

最初公司大部分报表都是参照 Kylin 模型,使用 Hive、Spark 将数据预聚合处理,再将处理结果数据导入到 StarRocks 中进行查询,依靠 StarRocks 强大的查询能力降低查询延迟。

这种方式虽然提升了查询速度,但会导致数仓中结果表的数据量膨胀,且部分报表增加维度后会存在数据兼容性问题。后来我们将部分预聚合查询转换为 StarRocks 的聚合模型,通过测试和提前预聚合的查询效率几乎相同,同时也解决了数据膨胀和历史数据兼容问题。

Cache

上面我们提到调研测评时,我们也详细评估了存算分离与其他系统的性能对比,上面的测试都是在开启 Local Disk Data Cache 情况下达到,因此,我们对于线上所有的表在创建时都开启了 Data Cache。

目前,我们线上计算节点规模为6个,每个计算节点配置了 2 块 200G 容量大小的 SSD(最好不要用 HDD),通过该配置,我们基本上能将业务访问的热点数据都缓存在 Local Disk 上。同时,我们观察到目前线上磁盘使用到达一定量时,存储空间会自动下降,经过与社区沟通发现这是内部触发了自动 LRU 缓存淘汰,这一点极大缓解了我们空间焦虑。

降本

使用 StarRocks 存算分离替换现有架构后,能在以下三个方面给成本带来较大的降低:

将 OLAP 组件换成 StarRocks,首先是通过聚合模型替代在数仓中的结果表预聚合,不必对所有维度进行排列组合,计算各个组合的结果数据。省去这一步骤后,存储对比之前减少了20%左右。 通过使用 StarRocks 存算分离,数据被存储在对象存储,通过将存算一体集群中 5T 左右的数据导入到对象存储中,一个月能节省 1000$ 左右,未来随着数据量的不断增长,成本降低会愈发明显。 使用 K8s 部署,方便部署的同时也省去了一笔不菲的云平台服务费。

通过以上几点综合测算,相比原来使用 Spark 离线计算出结果,再将结果导入ClickHouse 的方式,使用 StarRocks 存算分离,我们将成本降低了 46%。

运维监控

StarRocks 的监控可以无缝对接 Prometheus 和 Grafana,使用 StarRocks 存算分离版本后,我们根据建议首先配置了较为完善的监控,StarRocks 存算分离在存算一体基础上增加了不少对于系统 I/O 等指标,通过这些监控我们可以直观查看当前的各种指标。

alt

FE、BE相关监控

alt

StarRocks I/O 相关监控

另外,我们使用过程中比较关注查询性能问题,而也出现过由于版本太多导致了查询时读取文件数较多的问题,在社区提醒下,可以利用 SQL 监控当前集群 Compaction 情况:

alt

有了这种监控,我们也能看出当前是否出现 Compaction 慢等情况并考虑是否资源不足,需要扩容。

另外,从使用来看,相比于存算一体,存算分离版本有一个极大的简化就是无需关注多副本数据一致性,存算分离数据位于 OSS 之上,本地缓存单副本,再也无需关注副本的数据均衡迁移、数据修复等问题,这是一个不小的解放。

最后,社区的各种文档也比较丰富,尤其是存算分离最近给我们提供了最佳实践、各种运维指导、参数优化等文档,作为 StarRocks 新用户,我们也能根据这些文档快速上手取得最佳效果。当然,随着使用的深入,我们还希望能更深入地了解 StarRocks 内部实现原理,希望社区能在这方面提供更多指导。

我们使用存算分离集群,上线初期遇到了一些 bug 导致集群运行不稳定,但是在社区帮助下,我们快速定位并修复后,现在集群已经稳定运行了3月有余。

数据迁移

由于目前社区尚未提供一键式迁移工具将数据从存算一体集群迁移至存算分离集群,咨询过社区后,我们决定采用 export 到对象储存再使用 Broker Load 到新集群的方式进行数据迁移。

另外,在进行 Broker Load 时,导入任务和线上查询任务会对磁盘的 I/O 资源产生争用,这可能会导致 K8s 将 BE 节点驱逐,进而导致短时间 StarRocks 查询变慢,对此我们也建议降低 Broker Load 并发度,同样通过分批导入的方式来减少 I/O 争抢。

通过 Export + Broker Load 配合我们提到的优化手段,目前,我们已经将线上 80% 的业务数据迁移到存算分离集群中,并做到用户在使用上体验感更佳。后续会继续将所有业务迁移至集群,最终完成统一大业。

另外,我们也从社区获知,社区已经在推进一键式迁移工具的开发,如果不着急的小伙伴可以等等这个,我们后续也会尝试使用这种新方式来提升数据迁移效率,另外,我们也很期待社区能推出从更多数据源的迁移方式,便于我们可以更快速地将数据架构统一至 StarRocks。

未来规划

短期目标|数据湖 + StarRocks 缩短计算链路

数据入仓后,ODS 层的统一处理需要2-3个小时,这对数据及时产出有不小的影响,且计算成本较高。通过对数据湖的调研,我们计划将 ODS 层的处理提前到 Flink 当中,省去这几个小时的计算时间和计算资源,将 Flink 处理的数据直接落入数据湖中。利用 StarRocks 和数据湖的结合,实现对数据的实时查询,解决离线数仓中的数据不方便实时查询的问题。

长期规划|使用 StarRocks 构建数据湖仓一体新架构

在文章的开头我们也提过,公司现在使用了三种 OLAP 组件服务不同场景,每种组件都需要将 Spark 加工好的数据导入至对应系统,运维复杂,难以保证数据时效性同时数据的多方存储也进一步提升了成本。我们也一直在思考,能否做到 Spark 不参与计算加工,只用 StarRocks 搭建数仓呢?经过我们调研推导,发现还是有可能实现这一步的。

具体来说,Flink 消费 Kafka 的数据后,直接入湖(Hudi、Iceberg 等),接下来我们利用 StarRocks 作为计算引擎直接查询湖上数据,利用强大的湖查询能力(这块尚未深入测试,看社区其他用户有不少 Good Case)可以直接进行查询,对于某些查询效率较低的查询,我们直接为其构建物化视图。

我们之前的测试表明,利用物化视图能带来 10 倍以上的加速效果。构建数仓的过程中,涉及到简单的 ETL 也能够通过逻辑视图结合物化视图的方式来完成。通过这样一套 Lakehouse 新架构,我们理想中能够达到以下几点目的:

去掉当前多套 OLAP 服务,只保留 StarRocks 作为计算引擎,节约大量计算资源

数据无需多处存储,降低数据延迟时效性。同时使用存算分离架构,数据单一存储能节约大量存储成本(尤其原来存算一体架构下数据依靠云盘多副本存储,云盘价格过于昂贵) 利用 StarRocks 存算分离带来的弹性和数据共享能力,我们可以做到

1). 为不同的业务实现资源硬隔离;

2). 业务峰谷期间可以轻松实现快速弹性,业务高峰期快速扩容以应对突发流量,业务低峰期可以快速缩容以削减成本

架构简化也减轻了运维复杂度,使得我们有更多时间可以考虑提升业务增效,来达到公司降本增效的目的。

而且,通过调研学习,发现众多业内技术领先企业和我们的想法不谋而合。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

佳易王羽毛球馆计时计费软件灯控系统安装教程

佳易王羽毛球馆计时计费软件灯控系统安装教程 佳易王羽毛球馆计时计费软件,点击开始计时的时候,自动打开灯,结账后自动关闭灯。 因为场馆每一场地的灯功率都很大,需要加装交流接触器。这个由专业电工施工。 1、计时计费功能 &…

玻色量子“揭秘”之多项式回归问题与QUBO建模

摘要:多项式回归(Polynomial Regression)是一种回归分析方法,通过拟合一个多项式方程来模拟自变量与因变量之间的非线性关系。多项式回归的目标是找到一组多项式系数,使得拟合曲线尽可能地接近数据点。这种方法可以用于…

Arm64版本的centos编译muduo库遇到的问题的归纳

环境:Mac m2 pro下的VMware虚拟机中Arm64 centos ./build.sh 执行后提示如下 cmake -DCMAKE_BUILD_TYPErelease -DCMAKE_INSTALL_PREFIX…/release-install-cpp11 -DCMAKE_EXPORT_COMPILE_COMMANDSON /root/package/muduo-master – Boost version: 1.69.0 – Co…

12.docker的网络-host模式

1.docker的host网络模式简介 host模式下,容器将不会虚拟出自己的网卡、配置IP等,而是使用宿主机的IP和端口;也就说,宿主机的就是我的。 2. 以host网络模式创建容器 2.1 创建容器 我们仍然以tomcat这个镜像来说明一下。我们以h…

Java之《ATM自动取款机》(面向对象)

《JAVA编程基础》项目说明 一、项目名称: 基于JAVA控制台版本银行自动取款机 项目要求: 实现银行自动取款机的以下基本操作功能:读卡、取款、查询。(自动取款机中转账、修改密码不作要求) 具体要求: 读卡…

CSS实现三角形

CSS实现三角形 前言第一种:bordertransparent第二种borderrgb使用unicode字符 前言 本文讲解三种实现三角形的方式,并且配有图文以及代码解说。那么好,本文正式开始。 第一种:bordertransparent border是边框,而transparent是透明的颜色&a…

计数排序+桶排序+基数排序 详讲(思路+图解+代码详解)

文章目录 计数排序桶排序基数排序一、计数排序概念:写法一:写法二: 二、桶排序概念代码 三、基数排序概念1.LSD排序法(最低位优先法)2.MSD排序法(最高位优先法) 基数排序VS基数排序VS桶排序 计数…

C++语法知识点-vector+子数组

C语法知识点-vector子数组 一维数组定义无参数有参数迭代器扩容操作reserve 二维数组 vector 定义创建m*n的二维vectorvector< vector<int> > v(m, vector<int>(n) ) 初始化定义vector常用函数的实例分析访问操作resize 函数push _back ( )pop_back()函数siz…

宣传技能培训1——《新闻摄影技巧》光影魔法:理解不同光线、角度、构图的摄影效果,以及相机实战操作 + 新闻摄影实例讲解

新闻摄影技巧 写在最前面摘要 构图与拍摄角度景别人物表情与叙事远景与特写 构图与拍摄角度案例 主体、陪体、前景、背景强调主体利用前景和背景层次感的创造 探索新闻摄影中的构图技巧基本构图技巧构图技巧的应用实例实例分析1. 黄金分割和九宫格2. 三角型构图3. 引导线构图4.…

2 使用React构造前端应用

文章目录 简单了解React和Node搭建开发环境React框架JavaScript客户端ChallengeComponent组件的主要结构渲染与应用程序集成 第一次运行前端调试将CORS配置添加到Spring Boot应用使用应用程序部署React应用程序小结 前端代码可从这里下载&#xff1a; 前端示例 后端使用这里介…

unity shaderGraph实例-可交互瀑布

不要问我水在哪里&#xff0c;你自己相像这是一个瀑布&#xff0c;瀑布的效果我还不会做 效果展示 整体结构 这里片元着色器最后输出的baseColor应该是黑色&#xff0c;白色为错误。 各区域内容 区域1 计算球到瀑布的距离&#xff0c;然后减去一个值&#xff0c;实现黑色区域…

【小黑送书—第九期】>>重磅!这本30w人都在看的Python数据分析畅销书:更新了!

想学习python进行数据分析&#xff0c;这本《利用python进行数据分析》是绕不开的一本书。目前该书根据Python3.10已经更新到第三版。 Python 语言极具吸引力。自从 1991 年诞生以来&#xff0c;Python 如今已经成为最受欢迎的解释型编程语言。 pandas 诞生于2008年。它是由韦…

【亚太杯前两问论文】2023年第十三届APMCM亚太地区大学生数学建模竞赛——(文末领取方式)

2023年第十三届APMCM亚太地区大学生数学建模竞赛——论文无偿分享&#xff01;&#xff01;&#xff01; C题前两问论文代码已出&#xff0c;其他赛题及后续论文代码会持续更新。 祝各位小伙伴都能在比赛中发挥出色&#xff0c;取得心仪的成绩呦&#xff01;一起加油&#xff…

使用Arrays.Sort并定制Comparator排序解决合并区间

合并区间-力扣算法题56题 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&am…

姿态传感器——MPU6050

1、MPU6050介绍 MPU6050是由三个陀螺仪和三个加速度传感器组成的6轴运动处理组件&#xff0c;是一款六轴&#xff08;三轴加速度三轴角速度&#xff08;陀螺仪&#xff09;&#xff09;传感器。 内部主要结构 陀螺仪、加速度计、数字运动处理器DMP&#xff08;Digital Moti…

uniapp 轮播图(含组件封装,自动注册全局组件)

效果预览 组件封装 src\components\SUI_Swiper.vue 可参考官网配置更多属性 swipernavigator <script setup lang"ts"> import { ref } from vue defineProps({config: Object, })const activeIndex ref(0) const change: UniHelper.SwiperOnChange (e) &…

msvcp120.dll丢失是什么意思,哪个修复方法最简单

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到msvcp120.dll”。这个错误通常发生在运行某些程序或游戏时&#xff0c;它会导致程序无法正常启动或运行。那么&#xff0c;这个错误提示到底是什么意思呢&#xff1f;为了解决这个问…

当老师应该选文科还是理科

教育不断发展和改革&#xff0c;教师职业的选择也越来越受到关注。许多人在选择专业时都会考虑成为一名教师&#xff0c;但对于选择文科还是理科却感到困惑。本文将探讨当老师应该选文科还是理科。 文科注重的是人文素养和社会科学方面的知识&#xff0c;而理科则注重自然科学和…

springcloud超市管理系统源码

技术说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看用户&#xff0c;商品&#xff0c;销售数量&#xff1b;…

王道p150 20.将给定的表达式树转化为等价的中缀表达式(通过括号反应操作符的计算次序)

本题代码如下 void btreetoexp(tree t, char deep) {if (t NULL)return;else if (t->lchild NULL && t->rchild NULL)printf("%c", t->data);//输出操作数&#xff0c;不加括号else {if (deep > 1)printf("(");btreetoexp(t->l…