HBase学习笔记——基于HBase的日志系统的性能优化

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 我之前参与过一个日志系统的开发,存储用HBase。我简单罗列下用到的HBase优化,备忘。以后把它整理成更友好的介绍性文章。 # 系统简介 * 有一张大的日志数据表,保存所有日志。row key是 hash + app id + log-severity + timestamp + host等,cell保存日志正文数据。 * 可以看到row key的hash保证日志散列在各

我之前参与过一个日志系统的开发,存储用HBase。我简单罗列下用到的HBase优化,备忘。以后把它整理成更友好的介绍性文章。

系统简介

  • 有一张大的日志数据表,保存所有日志。row key是 hash + app id + log-severity + timestamp + host等,cell保存日志正文数据。

    • 可以看到row key的hash保证日志散列在各个region中,写入、查询的负载均衡。但是无法通过它进行范围查询,所以为不同查询模式,建立了多张索引表。
  • 为不同的日志级别(DEBUG, INFO, WARN, ERROR, FATAL)分别建立了一张索引表。在每张索引表中,row key是 app id + timestamp + host等。也就是说,用于通常选择一个应用,加上时间范围,也可以进一步选择一台应用服务器,来查询日志。

表结构相关优化

  • 多条日志打包,压缩保存。

    • 我们发现,如果简单地将一条日志保存为HBase表中的一行,会导致HBase表记录数很大,row key数量很大,region数量很多,HBase元数据开销很大。这会造成HBase集群不稳定。
    • 于是,我们决定将多条日志打成一个包(chunk)。一个包作为HBase表中的一行保存,大大减少了HBase表的记录数,减轻了HBase元数据的开销。打包是通过写入日志时,在应用服务器的内存中收集日志直到字节数超出一定阈值来实现的。
    • 除了打包,压缩也是在应用服务器端完成的,而不是依靠HBase (column family的compression配置)完成。因为我们希望压缩不仅能节省HBase存储空间,还要能节省应用服务器和HBase之间的网络流量。
    • 打包时,根据row key的语义,正确设置row key。比如开始时间是第一条日志的开始时间,结束时间是最后一条日志的结束时间。
    • 时间上相邻的日志,其正文内容往往很相似。因此,将多条日志打包压缩,比一条一条日志分开压缩,能获得更高的压缩率,节省网络传输带宽和存储。
    • 打包意味着查询时的解包。为此我们部署了coprocessor在HBase集群中,充分利用HBase集群的CPU解包。
  • fuzzy row filter

    • 通常来说,只有查询条件是row key的前缀,这个row key才能被用于查询。例如如果某张表的row key是 app id + host,则它能被用于根据某个应用id 的日志查询, 和 根据应用id + host的查询。
    • 如果要根据host查询,上述row key就不行了,不符合前缀匹配。我们得遍历整个表中所有的row key,对每个row key检查它是否以查询条件中给定的host结尾——十分低效。假如有10个应用,每一个应用有100个host,我们只能遍历10*100=1000条记录,找到给定host的记录。
    • 但是,应用FuzzyRowFilter后,我们仍然可以部分利用这个row key,只根据host查询。

      • 虽然row key的首部是app id,导致我们必须遍历所有app id,但是在扫描一个app id下的所有row key时,通过fuzzy row filter,可以利用row key的全局分布式索引树(-ROOT-, .META, region ) 直接跳转到查询条件给定的host开始处进行扫描。因此,我们只需要为每个app id,从查询条件的host处开始扫描,共100次扫描。

系统配置类优化

  • HBase客户端优化——牺牲可靠性,提高日志写入的吞吐量

    • 关闭WAL,直接写入日志。
    • 适当增加writer buffer大小。
    • 批量Put,传入List;关闭autoFlush。
  • 压缩算法改用snappy,牺牲压缩率,降低CPU消耗,提高吞吐量。
  • 调整HFile data block大小。data block越大,索引粒度越粗,顺序访问吞吐量越高。

    • 在一个data block内部,通常只能顺序遍历,看我们搜索的Key是否存在。但是,也可以启用bloom filter,很快地告诉我们,一个Key是否一定不在这个data block中。
  • 关闭某些column family的block cache缓存。

    • 查询时,只有重复性的、随机的访问,才能命中block cache。如果某一个列只是用于海浪数据的顺序访问,那么对它缓存没有意义,相反,它能冲掉block cache本应该缓存的其他列的数据。对于这样的列, 应该关闭block cache缓存。
  • 日志归档
      * 写入HBase的日志,TTL设为7天。HBase用于实时的web查询,只能看这7天的日志。

    • 这个系统有另外一路,实时写日志进HDFS,供HIVE分析。这是用于离线查询7天以前的历史日志的。
  • HBase默认存三个版本的cell,对日志来说没有必要,只需要存一个版本。

顺便提下与HBase无关的其他优化

  • 通常我们会用先进先出的队列保存临时积压的日志。但是,在日志系统的场景中,当日志积压时,让用户看到最新写入的日志,比让用户看到历史日志更重要。所以我们用先进后出的栈,保存临时积压的日志。
相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
存储 数据采集 数据处理
【Flume拓扑揭秘】掌握Flume的四大常用结构,构建强大的日志收集系统!
【8月更文挑战第24天】Apache Flume是一个强大的工具,专为大规模日志数据的收集、聚合及传输设计。其核心架构包括源(Source)、通道(Channel)与接收器(Sink)。Flume支持多样化的拓扑结构以适应不同需求,包括单层、扇入(Fan-in)、扇出(Fan-out)及复杂多层拓扑。单层拓扑简单直观,适用于单一数据流场景;扇入结构集中处理多源头数据;扇出结构则实现数据多目的地分发;复杂多层拓扑提供高度灵活性,适合多层次数据处理。通过灵活配置,Flume能够高效构建各种规模的数据收集系统。
71 0
|
6天前
|
Windows Python
如何反向读取Windows系统日志EVTX文件?
以下是如何反向读取Windows系统日志EVTX文件
16 2
|
13天前
|
存储 Linux Docker
centos系统清理docker日志文件
通过以上方法,可以有效清理和管理CentOS系统中的Docker日志文件,防止日志文件占用过多磁盘空间。选择合适的方法取决于具体的应用场景和需求,可以结合手动清理、logrotate和调整日志驱动等多种方式,确保系统的高效运行。
13 2
|
1月前
|
PyTorch 算法框架/工具
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
本文介绍了PyTorch中的F.softmax()和F.log_softmax()函数的语法、参数和使用示例,解释了它们在进行归一化处理时的作用和区别。
385 1
Pytorch学习笔记(七):F.softmax()和F.log_softmax函数详解
|
25天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
47 1
|
1月前
|
监控 网络协议 安全
Linux系统日志管理
Linux系统日志管理
42 3
|
1月前
|
监控 应用服务中间件 网络安全
#637481#基于django和neo4j的日志分析系统
#637481#基于django和neo4j的日志分析系统
35 4
|
3月前
|
存储 消息中间件 人工智能
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
早期 MiniMax 基于 Grafana Loki 构建了日志系统,在资源消耗、写入性能及系统稳定性上都面临巨大的挑战。为此 MiniMax 开始寻找全新的日志系统方案,并基于阿里云数据库 SelectDB 版内核 Apache Doris 升级了日志系统,新系统已接入 MiniMax 内部所有业务线日志数据,数据规模为 PB 级, 整体可用性达到 99.9% 以上,10 亿级日志数据的检索速度可实现秒级响应。
AI大模型独角兽 MiniMax 基于阿里云数据库 SelectDB 版内核 Apache Doris 升级日志系统,PB 数据秒级查询响应
|
1月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
197 0
|
3月前
|
jenkins 持续交付
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出
jenkins学习笔记之三:使用jenkins共享库实现日志格式化输出