实战讲解|Trino 在袋鼠云数栈的探索与实践

当前随着企业内外部数据源的不断扩展和积累,数据呈现出大规模、多样化、质量参差不齐等显著特征。如何有效激活这些结构复杂且类型多样的数据资产,挖掘其深层价值,已成为众多企业亟待解决的实际挑战。

袋鼠云数栈作为新一代一站式大数据基础软件,其核心优势在于不仅提供了快速便捷、易于上手的底层数据开发模块,更推出了涵盖质量、标签及指标等上层偏业务功能模块。这些模块旨在实现对数据质量的有效校验、提升数据加工处理效能以及规范检索流程,从而赋能最上层的业务人员进行自主分析与直观展示。

因此,在技术选型过程中,关键一步便是选择一款集数据ETL、联邦比对、Ad-hoc 查询以及报表展示等一系列功能于一体的全能型底层计算引擎,以驱动整个平台高效运作。

袋鼠云数栈经过技术沉淀与实践,探索出以 Trino 作为底层计算引擎的解决方案,并将此回馈给开发者们。

为什么是 Trino?

Trino 是一种分布式 SQL 查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集。它通过在整个集群的服务器上分配处理任务来实现横向扩展,基于这种架构,Trino 查询引擎可以在集群内的计算节点并行处理海量数据的 SQL 查询。

Trino 作为一个典型的存算分离 OLAP 引擎,采用了经典的 Master-Slave 架构,即 Coordinator+多个 Worker。其中,Coordinator 主要做以下三件事:

· 接收、处理 Client 的请求,返回查询结果给 Client

· 对 SQL 进行词法解析,随后进行语法/语义分析并优化生成执行计划

· 将物理执行计划以 TASK 的方式分发到 Worker 节点去执行并将结果进行汇总

Worker 是实际的执行节点,主要就做一件事情,执行 Coordinator 分发下来的 TASK。

Trino 的前身便是大名鼎鼎的 Presto。Trino 和 PrestoDB 的架构是类似的,在这里附上 PrestoDB 的架构图:

file

我们对于底层计算引擎的选型同样经历了从 PresotDB 到 Trino 的过程,中间对这两者从功能、性能、社区活跃度几个维度进行过详细的调研。通过对比,我们发现 Trino 相较于 PrestoDB 有以下几个优势:

· 动态过滤优化

· 账号安全认证集成度

· 审计日志集成度

· 更多的 RBO 优化规则

· 享受 Spark 统计信息加成

· 更多的 UDF 函数

· 更多基于 ORC 表格式的查询优化

· 社区的高活跃度,在技术上更加激进

其中,社区的高活跃度、更多的 RBO 优化规则以及享受 Spark 统计信息加成是我们选择 Trino 的根本原因。

Trino 在数栈的部署架构

Trino 在袋鼠云数栈落地的探索实践中经历了两种方式的迭代:混合部署方式和资源物理隔离方式。

混合部署方式

在刚刚将 Trino 选定为指标、标签平台底层计算引擎时,考虑到部分企业的业务量以及数据量规模,我们决定采取 Trino Worker 与 HDFS DataNode 混合部署的策略,这样可以避免跨网络节点的数据拉取带来的查询延迟问题。

在企业业务量和数据规模相对较小的情况下,这种混合部署方式确实能够在满足客户业务需求的 SLA 的同时,还能够达到降本增效的效果。但是当客户的业务量以及数据量达到一定规模时,这种混合部署方式也会随之带来一系列资源竞争衍生出的稳定性问题。

具体来说,当数据量不断攀升时,Trino Worker 节点处理每次查询所需内存峰值也会相应增大。当峰值增长太快而 Trino 来不及做内存回撤时,会直接增加 Worker 的堆内存使用,进而影响其他的业务查询。此外,还可能会间接性增加整个 Worker 的堆外内存的使用量,导致 HDFS 的 DataNode 与 Woker 进行资源的抢占,从而降低了两个系统的稳定性。

资源物理隔离方式

为应对大型企业在数栈指标、标签平台每日面临的海量 ETL 处理、Ad-hoc 查询以及 API 报表分析等业务需求,并考虑到 Trino 只能做软性资源隔离的劣势,我们采取了资源物理隔离的解决方案。同时基于客户业务的时效性要求,我们将原来的一个集群划分成了离线集群和 API 集群,以分别高效地处理客户的 ETL 任务和 API 报表分析等业务,同时利用袋鼠云 EMR 运维工具进行集群部署和管理。

针对负责客户 ETL 任务的离线集群,我们采取了降低任务并发、增加任务的容错配置以及写入并发控制等优化策略,从而显著提升 ETL 任务的稳定性;而对于 API 报表分析等业务,则通过适当增加任务并发、算子并行度等手段,来降低客户 API 报表业务的延时性,确保了整体服务性能和用户体验。

挑战、问题及解决方案

在以 Trino 为底层计算引擎,袋鼠云数栈服务企业的过程中,我们也遇到了一些具有代表性的问题以及痛点,在这里分享一部分数栈的解决方案。

任务并发运行数量大带来的任务间稳定性问题

日常情况下,我们同时使用 Trino 的在线用户可能在个位数,运行 SQL 的并发数量屈指可数,因此不会存在用户任务之间资源竞争的问题。但是当我们面临的客户群体规模是「总行+N分行」时,在线用户数和 SQL 执行的并发请求量会显著增加。在这种情况下,受限于当前有限的系统资源,一旦某个分行的任务运行时间较长且占用大量资源,就极有可能导致其他分行的任务响应速度大幅降低,甚至出现任务执行失败的情况。

● 原因分析

Trino 不能够承担很高的并发运行情况,主要在于两点:

· 海量的数据规模导致 Trino 不得不消耗大量的资源去进行快速计算

· TCP 通信的连接数限制会导致大量任务并发运行时 block 或者直接失败掉

● 解决思路

根据当前的 Trino 集群情况,通过配置资源组,合理限制各个分行的任务并发数量,同时限制任务运行的最大执行时长、Memory 大小、CPU 使用时长。这样,既能够保证正在运行的任务稳定性,同时也主动过滤了不合理的任务异常占用资源的情况。更重要的是,通过任务排队的方式,降低任务的失败率,避免影响下游任务的出数。

底层 HiveMetastore 负载过高,任务大量超时失败

数栈客户的主要业务场景之一是通过 Trino 来加速对 Hive 数据的处理以及查询。Trino 与 Hive 的最主要区别是 RunTime 层面不同,一个是基于内存的计算,一个是基于 MR 的计算。本质上 Trino 的 Hive 插件还是依赖 HiveMetastore(下文简称 HMS) 以及 HDFS 做数据的处理以及查询。因此当客户端业务量比较大的情况下,会因为频繁访问 HMS,出现 HMS 内存异常高且访问超时的问题。

● 原因分析

在分析为什么会导致 HMS 负载过高之前,我们得先弄明白 Trino 在哪些步骤会访问 HMS。

通过源码分析发现,Trino 在 SQL 语义分析阶段会通过访问 HMS 来完善每个 Node 的元数据相关信息,后续会借助这些元数据信息生成逻辑执行计划。在对数据进行 DDL 时或者执行 DML 时,也会出现有 HMS 的操作。另外 Trino 基于 Thrift 协议自己实现了一套 HMS 的 Client 端,并实现了失败重试以及高可用功能。

但是我们发现 Trino HMS Client 的失败重试只是针对于连接失败,当一台 HMS 连接不上会去连接另外一台 HMS,而我们现在是 socket read timeout 类的失败。这样的话,即使任务失败了,那么下一次 Trino 还是会连接这台 HMS,从而导致 HMS 持续高负载低响应。其中,由于 Trino 和 PrestoDB 在执行过程上差别不大,在这里附上 PrestoDB 的 SQL 执行过程原理:

file

随后我们又基于 HMS 的 gc 日志以及火焰图进行分析,发现平台性能瓶颈都出现在 String.intern() 这个方法上。具体来说,当 String.intern() 被调用后,底层会从一个 hash table 的数据结构中找同名字符串,在数量较大时会导致 hash 碰撞使 CPU 占用升高。

file

除此之外,我们从 HMS 的元信息数据库 MySQL 中看到表数量和分区数分别达到了十万级别跟百万级别。

● 解决思路

基于上述分析,我们决定从 HMS 和 Trino 两方面入手。

在 HMS 层面,我们调整了 JVM 参数:

-XX:StringTableSize=20000000

但是好景不长,半个月左右问题再次复现,鉴于此,我们开始质疑问题可能并非仅局限于 StringTable 本身,而是怀疑是 StringTable 中的数据没有释放。

在网上搜索“G1 CMS StringTable”关键字查找到 JDK 的一个相关 bug:https://bugs.openjdk.org/browse/JDK-8180048

G1 垃圾回收器在回收 StringTable 上存在问题,效率不及 CMS。最后通过将 Hive MetaStore 的垃圾回收器由 G1 调整为 CMS,问题得以解决。

在 Trino 层面,我们开启了 Metastore 的缓存,考虑到 Coorinator 内存的限制,我们设置了缓存的最大数量。其配置如下:

hive.metastore-cache-ttl=2h
hive.metastore-refresh-interval=1h
hive.metastore-cache-maximum-size=5000000
hive.metastore-refresh-max-threads=30
hive.metastore-cache.cache-partitions=true

另外,基于客户当前的数据量规模,我们发现在某些特殊的场景下 HMS 接口调用20s的超时时间是远远不够的,而 Hive 社区在0.14版本就已经将 HMS 20s的超时时间调整到600s来提高稳定性,因此我们也将 Trino HMS 超时时间调整到了600s:

hive.metastore-timeout=600s

最后,我们优化了 Trino HMS 的访问策略,增加了 RoundRobin 模式,来对 HMS 的请求做负载均衡,避免单台 HMS 的请求负载过高。其配置如下:

hive.metastore.round-robin=true

● 实际使用效果

通过上述的调整之后,数栈的 Trino 集群基本上能够满足日均10w+ETL 任务的快速稳定运行。在这里附上内部离线集群部分日均调用情况:

file

Catalog 配置后冷重启导致业务中断

在客户使用数栈时,经常有很多需要跨数据源的联邦查询场景,因此不得不频繁对 Trino 配置静态 Catalog 文件并进行重启,这样就会影响当前正在运行的任务。因此,我们开始思考如何实现 Catalog 的动态添加与注册。

● 解决思路

如何持久化 Catalog 元数据?

在早期的动态配置 Catalog 方案中,我们选择将 Catalog 元数据保存在 zookeeper 上,默认路径为 /trino/catalog/meta,每一个 Catalog 都会在保存路径下创建一个节点并写入 Catalog 元数据信息。在相应的 Catalog 节点下会存在若干子节点,每个节点代表 Trino 中的一个 Node,节点内容为该 Node 上的该 Catalog 状态信息,该状态信息由各个 Node 定时检测并汇报。

如何操作管理 Catalog?

· 在 Coordinator 中提供出管理 Catalog 的 rest 接口进行访问

· Coordinator 收到请求后会往 zk 上的元数据保存路径下新增一个 Catalog 节点并将 Catalog 元数据信息写入 Catalog 节点

· 随后各个 Node(包含 Coordinator 和 Worker)内的监听线程根据元数据保存路径下的节点事件来通过 CatalogManager 进行操作

· Coordinator 节点在操作完 Catalog 并汇报操作结果后会等待所有节点的操作结果,若在超时时间内获取 Node 的操作结果且都操作成功,那么则认为此次 Catalog 操作成功,否则会认为失败

· 若 Catalog 操作失败,Coorinator 节点会进行事务回滚操作,删除 zk 上的 Catalog 节点以及所有子节点

下图为 Trino 添加 Catalog 的原理图:

file

● 实际使用效果

从客户使用层面来讲,通过在页面动态配置 Trino Catalog,大幅度提升了客户使用平台的效率,同时降低了客户运维侧的成本。

《数栈产品白皮书》下载地址:https://www.dtstack.com/resources/1004?src=szsm

《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm

想了解或咨询更多有关大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szcsdn

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【分布式监控】zabbix与grafana连接

1.在zabbix- server服务端安装grafana,并启动服务 先在官网下载软件 https://grafana.com/grafana/download/9.4.7?editionenterprise&pggraf&plcmtdeploy-box-1#可以翻译成中文介绍,很详细的教程 yum install -y https://dl.grafana.com/ent…

SDL2 连续帧图像显示

QT使用SDL多窗口显示视频(linux,ubuntu)_linux qt sdl-CSDN博客 QT使用SDL播放YUV视频 - C - QT SDL调用OPENGL渲染图像 - C - 心得 C 使用SDL显示RGB图像数据_c sdl-CSDN博客 SDL库入门:掌握跨平台游戏开发和多媒体编程_sdl开…

MySQL篇—性能压测工具mysqlslap介绍

☘️博主介绍☘️: ✨又是一天没白过,我是奈斯,DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux,也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注❣…

gh0st远程控制——客户端界面编写(一)

1、新建一个基于对话框的MFC程序 ghost内核对unicode支持不好,所以不要勾选 在静态库使用MFC有助于我们的代码供别人使用 2、设置窗口可最大最小化 对话框 》右键属性 3、 为对话框添加列表 一个代表列表框架,一个代表日志框架 分别为2个控件添加唯…

SQL Povit函数使用及实例

PIVOT函数常用于数据的行转列&#xff0c;同时也可以用此函数实现类似于Excel中的数据透视表的效果。 PIVOT函数 PIVOT 函数的基本语法如下&#xff1a; -- PIVOT 语法 SELECT <非透视的列>,[第一个透视的列] AS <列名称>,[第二个透视的列] AS <列名称>,.…

Maxwell介绍

一、介绍 介绍&#xff1a;它读取MySQL binlog并将数据更改作为JSON写入Kafka、Kinesis和其他流媒体平台&#xff08;目前支持&#xff1a;kafka、RabbitMQ、Redis、file、Kinesis、Nats、Google Cloud Pub/Sub、Google Cloud Bigquery、SNS&#xff09; 版本&#xff1a;从v1.…

解决百度地图在模拟器上运行报 java.lang.IllegalArgumentException: No config chosen问题

解决百度地图在模拟器上运行报 java.lang.IllegalArgumentException: No config chosen 问题 1. 问题复现 在近期公司使用模拟器(网易MuMu)进行项目演示时&#xff0c;在进入存在百度地图(Android版本 7.4.2版本)之后&#xff0c;页面出现奔溃&#xff0c;后台日志为&#xf…

域环境权限提升

Windows系统配置错误 在Windows系统中&#xff0c;攻击者通常会通过系统内核溢出漏来提权&#xff0c;但是如果碰到无法通过系统内核溢出漏洞法国提取所在服务器权限的情况&#xff0c;就会系统中的配置错误来提权。Windows系统中常见哦欸之错误包括管理员凭证配置错误&#x…

Linux7 安装 Oracle 19C RAC 详细图文教程

实战篇&#xff1a;Linux7 安装 Oracle 19C RAC 详细图文教程 本文是按照&#xff1a;https://www.modb.pro/db/154424的思路进行编写 一、安装前规划 安装RAC前&#xff0c;当然要先做好规划。具体包含以下几方面&#xff1a; 节点主机版本主机名实例名Grid/Oracle版本Publi…

【论文简介】个性化真实人像生成方法(2024.01.15发布,即将开源)

零样本身份保留生成方法&#xff1a;声称效果好于PhotoMaker&#xff08;即将开源&#xff09; 2401.InstantID: Zero-shot Identity-Preserving Generation in Seconds &#xff1a; 项目主页&#xff1a;https://instantid.github.io/ 一、简介 本文的主要内容是介绍了一种…

【MATLAB】SVMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SVMD-LSTM神经网络时序预测算法是一种结合了单变量经验模态分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09…

十年很短,编程很难

前天冲浪看到的一篇文章&#xff0c;深有感触&#xff0c;翻译给大家一起看看吧 许多年前&#xff0c;当我仍是一名主修计算机科学的高年级学生时&#xff0c;我整天浏览各种在线招聘信息&#xff0c;希望能找到适合程序员的实习职位 除了实习职位&#xff0c;我偶尔也会点击一…

统计学R语言实验8 :线性回归

统计学R语言实验8 &#xff1a;线性回归 一、实验目的 1. 掌握理解线性回归的相关概念。 2. 掌握理解线性回归的相关方法。 3. 熟悉R语言等语言的集成开发环境。 二、实验分析与内容 完成教材P132的第2题 散点图 将 shouru 向量作为 x 轴&#xff0c;zhichu 向量作为 y 轴…

各模块的实现

注册模块&#xff1a; 注册使用手机号发送验证码注册的方式&#xff0c;使用的是阿里云的短信发送服务&#xff0c;然后进行认证&#xff0c;有个60s的时间&#xff0c;可以存到redis中&#xff0c;key是手机号&#xff0c;value是验证码。 使用Spring自带的BCryptPasswordEn…

《亚太教育》期刊投稿方式

《亚太教育》杂志是国家新闻出版总署批准的正规教育类期刊&#xff0c;旨在传播教育文化信息和动态&#xff0c;展示教育实践模式和经验&#xff0c;搭建教育科研成果交流平台。杂志将致力于服务教育事业的创新发展&#xff0c;传播教育文化新信息&#xff0c;展示教育实践新模…

java基础:求数组的最值

方法一&#xff1a;顺序查找 先假设数组第一个元素为最值&#xff0c;然后和数组里的数按顺序进行比较得出最值&#xff0c;所以叫顺序查找。 代码如下 package idea;public class arr_int {public static void main(String[] args) { // 初始化一个数组int[] arr {12…

第十一章 请求响应

第十一章 请求响应 1.概述2.请求-postman工具3.请求-简单参数&实体参数4.请求-数组集合参数5.请求-日期参数&JSON参数6.请求-路径参数7.响应-ResponseBody&统一响应结果8.响应-案例 1.概述 将前端发送的请求封装为HttpServletRequest对象 在通过HttpServletRespo…

经典数据库练习题及答案

数据表介绍 --1.学生表 Student(SId,Sname,Sage,Ssex) --SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 --2.课程表 Course(CId,Cname,TId) --CId 课程编号,Cname 课程名称,TId 教师编号 --3.教师表 Teacher(TId,Tname) --TId 教师编号,Tname 教师姓名 --4.成绩…

freeswitch on centos dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs的流程记录&#xff0c;本文使用dockerfile模式。 环境 docker engine&#xff1a;Version 24.0.6 centos docker&#xff1a;7 freeswitch&#xff1a;v1.6.20 dockerfile 创建空目录…

基于springboot+vue的校园周边美食探索及分享平台系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…