news 2026/4/2 15:48:12

一文搞懂!Hologres高性能写入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一文搞懂!Hologres高性能写入

holoClient.flush()

代码如下:

arduino ``` @Value("${spring.datasource.hologres.jdbc-url:jdbc:postgresql://hgprecn-cn-nwy3e73kt001-cn-shanghai.hologres.aliyuncs.com:80/rjhy_dc_cdp}") private String jdbcUrl; @Value("${spring.datasource.hologres.username:BASIC$dc_cdp_test}") private String username; @Value("${spring.datasource.hologres.password:KUnRu5XCE2V9z_i5}") private String password; @Bean public HoloClient generateHoloClient() { HoloConfig config = new HoloConfig(); config.setJdbcUrl(jdbcUrl); config.setUsername(username); config.setPassword(password); config.setOnConflictAction(OnConflictAction.fromWriteMode(INSERT_OR_UPDATE)); try { return new HoloClient(config); } catch (HoloClientException e) { log.error("HoloDataSourceConfig.generateHoloClient, errorMsg:", e); throw new RuntimeException(e); } } ```
ini @Resource private HoloClient holoClient; TableSchema tableSchema = holoClient.getTableSchema(keyTypeEnums.getTableName()); batchData.forEach(listableBeanFactory -> { Put put = new Put(tableSchema); listableBeanFactory.forEach(put::setObject); try { holoClient.put(put); } catch (HoloClientException e) { log.error("holoClient.put(put), errorMsg:", e); } }); holoClient.flush();

holoClient.flush() 的批处理是Hologres写入性能的核心,其底层是一个分阶段、高度并行化的数据管道。为了让你直观地理解这个复杂过程,下图描绘了数据从你的Java堆内存出发,直到安全写入Hologres存储引擎的完整旅程:

下面,我们来详解每个阶段的关键设计:

🔍 第一阶段:客户端内存准备与攒批

  1. Shard分组缓冲区:HoloClient 在内存中为每个目标表的每个Shard维护了一个独立的缓冲区(RecordBuffer)。当你调用 put(put) 时,客户端会根据表的分布键(如主键)计算该行数据所属的Shard,并将其放入对应的缓冲区。
  2. 触发条件:flush() 被调用时,会立即锁定所有缓冲区,准备发送。此外,系统也会在以下条件满足时自动触发类似 flush() 的操作:
  3. 批量大小:单个缓冲区数据达到 writeBatchSize(默认256)。
  4. 数据体积:缓冲区数据总字节数达到 writeBatchByteSize。
  5. 时间阈值:距离上次发送间隔达到 writeMaxIntervalMs。

⚙️ 第二阶段:序列化与网络传输

  1. 高效序列化:锁定的缓冲区数据会被高效地序列化成紧凑的二进制格式(如Protobuf)。与逐条发送SQL或JSON相比,这极大地减少了网络传输量。
  2. 多路复用与并行:客户端会为每个目标Shard复用或创建独立的网络连接,并由专门的写入线程(writeThreadSize控制)并行发送这些二进制Batch,充分利用网络带宽。

🚀 第三阶段:服务端Shard并行处理

  1. 前端路由:Hologres的 Frontend 节点接收请求后,会快速解析协议,并根据请求中的Shard信息,将Batch直接路由到对应的存储节点(Worker Node)
  2. 并行事务每个Shard的处理完全独立。每个Shard收到自己的Batch后,会在一个轻量级的事务中处理这批数据。由于Shard间无锁,这是写入能线性扩展的关键。

💾 第四阶段:存储引擎写入与持久化

这是最核心的阶段,确保数据既快又稳:

  1. Write-Ahead Log:数据写入Shard后,首先被顺序、同步地追加到该Shard的WAL中。WAL是预写式日志,写入操作一旦成功落盘,数据持久性就已得到保证,即使后续系统崩溃,也能从WAL恢复。这是 flush() 操作原子性和持久性的基石
  2. MemTable更新:在WAL写入成功后,数据被应用到内存中的MemTable。MemTable 是一个行式存储的数据结构,数据写入此处后,对读请求就立即可见。这也是Hologres写入低延迟的重要原因。
  3. 后台异步Compaction:当 MemTable 增长到一定大小,它会被标记为只读(Immutable MemTable),并由后台线程异步地与磁盘上的旧数据进行合并(Compaction),最终转换成高效的列式存储文件(SSTable)。这个过程不影响前台写入的吞吐和延迟

⚡ 性能关键总结

  • 批处理:客户端攒批极大地减少了网络RPC和事务开销。
  • Shard并行:数据分片实现了真正的并行写入,无共享资源竞争。
  • 高效的二进制协议:紧凑的序列化节省了网络和解析成本。
  • WAL + MemTable:顺序写WAL保证持久性,内存写MemTable保证低延迟可见。
  • 读写分离的存储格式:行存优化写,列存优化读,后台转换互不干扰。

因此,当你调用 holoClient.flush() 时,你触发的是一台设计精密的“数据高速列车”,它将离散的数据包在客户端打包成集装箱,通过多条并行轨道(Shard)高速运输,并在目的地(存储节点)经过一个高效的标准化入库流程(WAL -> MemTable),最终安全入库。理解了这一点,你就能更好地通过调整 writeBatchSize、writeThreadSize 等参数来优化你的写入吞吐和延迟。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/31 2:13:58

ByteDance联手顶尖学府重新定义AI思考:当机器学会分层理解世界

这项突破性研究由ByteDance Seed团队联合曼彻斯特大学、魁北克AI研究院、清华大学和M-A-P机构共同完成,发表于2026年1月1日,论文编号arXiv:2512.24617v1。对这项研究感兴趣的读者可通过该编号查阅完整论文内容。现代AI就像一个过度勤奋的学生&#xff0c…

作者头像 李华
网站建设 2026/3/31 17:29:23

中佛罗里达大学破解仿真优化难题:让计算机在噪声中找到最优解

中佛罗里达大学仿真与训练研究所的Bulent Soykan博士及其团队最近发表了一项令人瞩目的研究成果。这项发表于2025年12月30日的论文(编号arXiv:2512.24007v1),由仿真与训练研究所的Bulent Soykan以及建模、仿真与训练学院的Sean Mondesire和Gh…

作者头像 李华
网站建设 2026/3/27 21:01:59

基于微信小程序的养老服务平台系统毕业设计项目源码

题目简介 在人口老龄化加剧、养老服务需求精细化的背景下,传统养老服务存在 “资源对接不畅、服务标准不统一、安全监护滞后” 的痛点。基于微信小程序构建的养老服务平台系统,适配平台管理员、养老机构、服务人员、老年人及家属等角色,实现服…

作者头像 李华
网站建设 2026/3/24 9:59:00

第九课Open3D点云数据处理:直通滤波

1 算法原理 2 代码实现 2.1 提取滤波后点云和噪声点云 2.2 优化后的代码 直通滤波(AABB包围盒法) 1 算法原理 2 AABB法直通滤波 2.1 X轴方向的直通滤波 2.2 Y轴方向的直通滤波 2.3 Z轴方向的直通滤波 2.4 函数封装 pass_through_by_AABB(cloud…

作者头像 李华
网站建设 2026/3/30 11:00:45

第十一课Open3D点云数据处理:中值滤波

1 中值滤波原理 2 与均值滤波对比 3 中值滤波代码实现 3.1 代码行实现 3.2 将中值滤波的实现封装到函数 pointCloud_median_filter() 中 1 中值滤波原理 点云中值滤波是将空间中每个点的值替换为其邻域点值的中位数。具体来说,对于给定点云中的每个点&#xff…

作者头像 李华