热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hbase读写调优_深入浅出HBase系列(一)

前言近期采用kylinsuperset方案解决公司多维自助查询分析的问题,大家都知道kylin将预计算的结果写入HBase中以加快多维数据的查询速度,所
cec008bb3b914c345f19cf61382ea465.png

前言

近期采用kylin+superset方案解决公司多维自助查询分析的问题,大家都知道kylin将预计算的结果写入HBase中以加快多维数据的查询速度,所以不可避免需要对HBase进行各种调优,调优过程中带着学习的目的深入研究了HBase的相关机制,想到以前非常喜欢台湾侯捷先生的名著《深入浅出MFC》以及李维先生的《Inside VCL》,所以把这系列取名深入浅出,当然这里主要是想记录过程,非常粗糙,权做抛砖引吧。

言归正传,先讲原理:

一、HBase原理解析

1、HBase的架构设计及基本的数据结构

1.1服务器节点架构

246bb9f7ccef37a224e7ef2294541394.png
图1.1.1 HBase节点架构

1.1.1 Client

包含访问HBase的接口,维护着一些Cache来加快对HBase的访问,比如缓存regione的位置信息等;

1.1.2 Zookeeper

保证任何时候,集群中只有一个master;存贮所有Region的寻址入口Root Region的位置;实时监控Region Server的状态,将Region server的上线和下线信息实时通知给Master;存储Hbase的schema,包括有哪些table,每个table有哪些column family;

1.1.3 Master

主要负责Region的分配与重分配;RegionServer的负载均衡;处理Schema更新(新建表、修改表结构等)的请求等;不参与HBase的读写数据过程;

d1e89e2d1c11fccf5cdaff8bfa8ff67e.png
图1.1.3.1 HBase Master&RegionServer

1.1.4 RegionServer

一个RegionServer对应一个节点,Regionserver是调度者,维护多个Region,处理对这些Region的IO,负责切分在运行过程中变得过大的Region,一个Region只能属于一个Regionserver,Regionserver可以自动调整Region所在的服务器;底层数据是持久化在HDFS上的;

1.1.5 Client

访问hbase上数据的过程并不需要master参与(寻址访问zookeeper和region server,数据读写访问regione server),master仅仅维护者table和region的元数据信息,负载很低;

1.2数据结构模型

1.2.1整体结构

数据结构层面整体是这样的:

5fabcda4b21cf5cde336f53cba7e3c5c.png
图1.2.1.1 HBase数据结构(V1)

1.2.2 Region与HFile

一个Table表会被横向分成多个Region,一个Region只属于一个RegionServer,一个RegionServe管理多个Region,Region逻辑结构如下;

505f068cbc3fb4b5e35efcac4efbf3c9.png
图1.2.2.1 Region的逻辑结构

每个Region是一个rowkey段内的行记录集合,在逻辑上对应多个Store,一个Store在逻辑上对应一个MemStore和多个StoreFile,StoreFile对应物理存储文件HFile。

写入Hbase的数据可能是随机的,如果直接写入磁盘文件可能会系性能低下,因此,引入MemStore内存结构来存储来自客户端的写入或更新操作,因为是存储在内存,所以直接在 MemStore 里面进行随机写是非常高效的。同时,存储在 MemStore 里面的数据也是按照 RowKey 进行排序的,MemStore的数据会在满足一定参数阈值的时候触发 Flush 操作,存储在 MemStore 里面的数据就直接写到一个 HFile 里面,这样就解决了随机写性能低下的问题。

04f1f3f65edcbef855011aad39505e0d.png
图1.2.2.2 Memstore&StoreFile&Hfile的关系

1.2.3 StoreFile的结构

StoreFile具体分为几部分(见下图):

fb8cb5a9ce53144664715e0dd669d4d6.png
图1.2.3.1 HFile中各段的指向(V1)

比较重要的是Trailer这个段,其结构见下图:

a4ef4e0704e76c231aee80cdc77be8b4.png
图1.2.3.2 Trailer具体结构(V1)

Trailer这一段长度是固定的,保存了每一段的偏移量。读取一个HFile时,会首先读取Trailer,Trailer保存了每个段的起始位置(段的Magic Number用来做安全check),然后,Data Index会被读取到内存中,这样,当检索某个key时,不需要扫描整个HFile,而只需从内存中找到key所在的block,通过一次磁盘io将整个 block读取到内存中,再找到需要的key。

1.2.4 HLog

由于MemStore 是存储在内存的,所以如果对应的 RegionServer 突然挂掉了,那么没有 Flush 的数据就被丢失了,为了解决这个问题,HBase 引入了 HLog(WAL)(write-ahead-log)机制,所有的更新在写入 MemStore 之前先写到 HLog(WAL) 里面,HLog(WAL)是直接存储在 HDFS 上的,但写入时是顺序写,也就是直接Append到文件的后面,因此写入性能非常高,通过这种机制,即使对应的 RegionServer 挂了,但是由于 HLog(WAL)的存在,数据还是可以恢复。

HLog又叫WAL log(Write ahead log),类似mysql中的binlog,用来做灾难恢复。HLog记录数据的所有变更,一旦数据修改,就可以从HLog中进行恢复。每个Region Server维护一个HLog,而不是每个Region一个,这样不同region(来自不同table)的日志会混在一起,这样做的目的是不断追加单个文件,相对于同时写多个文件而言,可以减少磁盘寻址次数,从而提高对table的写性能。带来的问题是,如果一台region server下线,为了恢复其上的region,需要将region server上的log进行拆分,然后分发到其它region server上进行恢复。

WAL 文件里面的数据组织形式和 HFile 里面的是完全不一样的。WAL 文件里面包含一系列的修改,每条修改代表单个 put 或 delete。这些编辑数据包含当前修改是对应哪个 Region 的。编辑数据是按照时间编写的,因此所有的修改都是以追加的形式写到 WAL 文件的末尾。由于 WAL 里面的数据是按照修改时间编写的,所以写 WAL 文件不会发生随机写,这样可以大大提高写 WAL 的操作。

当 WAL 文件越来越大,这个文件最终是会被关闭的,然后再创建一个新的 active WAL 文件用于存储后面的更新。这个操作称为 rolling WAL 文件。一旦 WAL 文件发生了 Rolled,这个文件就不会再发生修改。

默认情况下,WAL 文件的大小达到了 HDFS 块大小的 50%(HBase 2.0.0 之前是 95%,详见 HBASE-19148),这个 WAL 文件就会发生 roll 操作。 我们可以通过 hbase.regionserver.logroll.multiplier 参数控制达到块大小的多少百分比就发生 roll。我们也可以通过 hbase.regionserver.hlog.blocksize 参数来控制块大小(注意,这个块大小不是 HDFS 的块大小)。除了文件大小能触发 rolling,HBase 也会定时去 Rolling WAL 文件,这个时间是通过 hbase.regionserver.logroll.period 参数实现的,默认是一小时。这两个策略满足一个就可以出发 WAL 的 Rolling 操作。

WAL 文件的大小对于 HBase 恢复是有影响的,因为 HBase 在使用 WAL 文件恢复数据的时候,对应的 Region 是无法提供服务的,所以尽量保持少一些的 WAL 文件。

一个 RegionServer 会包含多个 Region 的,HBase 并不为每个 Region 使用一个 WAL,而是整个 RegionServer 里面的 Regions 共用一个 WAL 日志。同时,只有一个 WAL 文件处于 active 状态。

WAL 在 HDFS 上的目录命名格式如下:

/hbase/WALs/,,

/hbase/WALs/192.168.1.103,16020,1542292581331

WAL 文件名称命名格式如下:

/hbase/WALs/,,/%2C%2C.

/hbase/WALs/192.168.1.103,16020,1542292581331/192.168.1.103%2C16021%2C1547646103879.1547646379202

1.2.5 HFile V1的问题

HFile V1的问题主要是:Region Open的时候,需要加载所有的Data Block Index数据,另外,第一次读取时需要加载所有的Bloom Filter数据到内存中。一个HFile中的Bloom Filter的数据大小可达百MB级别,一个RegionServer启动时可能需要加载数GB的Data Block Index数据。这在一个大数据量的集群中,几乎无法忍受。(测算Data Block index到底有多大,具体测算可见附录)。

1.2.6 HFile V2的一些说明

HFile V2.0之后有了一些变化,主要变化如下两图:

01553653d665e6342c80ca53cfffe453.png
图1.2.6.1 HFile V2结构
b984535164ee480b8d1066e26c8815fb.png
图1.2.6.2 HFile V2中各段的指向

HFile V2设计的初衷是期望显著降低RegionServer启动时加载HFile的时延,更希望解决一次全量加载数百MB级别的BloomFilter数据带来的时延过大的问题。由上面图可以看到主要采用了对索引进行了分层处理以解决索引数据过大的问题。

好,到此位置讲清楚了HBase的基本组织架构和数据结构,下一章我们详细讲讲HBase的读写流程,敬请关注探讨,如果觉得有用,别忘了关注点赞哦!



推荐阅读
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 软件测试行业深度解析:迈向高薪的必经之路
    本文深入探讨了软件测试行业的发展现状及未来趋势,旨在帮助有志于在该领域取得高薪的技术人员明确职业方向和发展路径。 ... [详细]
  • 在CentOS 7中部署Nginx并配置SSL证书
    本文详细介绍了如何在CentOS 7操作系统上安装Nginx服务器,并配置SSL证书以增强网站的安全性。适合初学者和中级用户参考。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 七大策略降低云上MySQL成本
    在全球经济放缓和通胀压力下,降低云环境中MySQL数据库的运行成本成为企业关注的重点。本文提供了一系列实用技巧,旨在帮助企业有效控制成本,同时保持高效运作。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文详细介绍了在 CentOS 系统中如何创建和管理 SWAP 分区,包括临时创建交换文件、永久性增加交换空间的方法,以及如何手动释放内存缓存。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • 本文详细介绍了在Windows系统中如何配置Nginx以实现高效的缓存加速功能,包括关键的配置文件设置和示例代码。 ... [详细]
author-avatar
唯美爱人2014
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有