[Binospace] HBase Metrics参数详解

2023-11-09

本研究针对HBase 0.94.* 及以上版本的系统。

RegionServer

本目标主要集中分析在RegionServer提供的相关Metrics接口。在0.94新版本中,Metrics包括:RegionServerMetrics、JvmMetrics、以及RegionServerDynamicMetrics。下面分别进行介绍。

1、RegionServerMetrics

这是延续了以前版本的Metrics。它主要是以RegionServer为单位的基本功能的监控信息的收集,主要包括:

1)通用信息的收集。例如RS内store个数、storefiles的个数等。

2)与RS整体读写性能指标相关的参数。例如Cacheblock相关的信息、RS内读写请求个数、写操作相关的性能、以及读操作相关的性能。

3)功能性调整的参数个数。如Compaction、Split等。

下面细化这些参数的含义。(ps:参数名省略了前两位的hbase.regionserver.,例如如果blockCacheCount,那么Metrics上实际名字是hbase.regionserver.blockCacheCount)

  • 与BlockCache相关的参数。
参数名 含义 备注
blockCacheCount RegionServer中缓存到blockcache中block的个数。 如果有大规模的scan操作或者随机读比较频繁,该值往往偏高。
blockCacheFree 返回block cache中空闲的内存大小。计算方法为:getMaxSize() – getCurrentSize(),单位是Byte 该值反映出当前BlockCache中还有多少空间可以被利用。
blockCacheSize 当前使用的blockCache的大小。BlockCache. getCurrentSize(),单位是Byte 该值反映出BlockCache的使用状况。
blockCacheHitCount 被BlockCache命中的getBlock操作。 该值反映出RegionServer上Region的访问特性。
blockCacheMissCount BlockCache未命中的getBlock操作。 该值反映出RegionServer上Region的访问特性。
blockCacheEvictedCount BlockCache中被换出的Block的个数。 该值反映出RegionServer上Region的访问特性。
blockCacheHitRatio getBlock操作中命中缓存的百分比。 该值越高,对于读服务就更加高效。这是优化读服务的一种衡量标准。
blockCacheHitCachingRatio hitCachingCount的含义是指那些因为读block不存在,而把block加入缓存时,会认为这是一次hitCaching操作(直接翻译:正在进行Caching,然后才命中)。 一般如果对于大表进行Scan操作,会造成该值升高。
blockCacheHitRatioPastNPeriods 在过去的N个周期内平均的命中率。(默认的过去周期窗口个数是5) 在CacheStats类中,会有PastN大小的数组,记录在N个周期内的hitCount大小。RegionServer每次取数据时,都会rollMetricsPeriod,从而记录当前hitCount到对应PastN的数组中。
blockCacheHitCachingRatioPastNPeriods 在过去的N个周期内平均CachingBlock的命中率。(默认的过去周期的窗口为5) 同上。
  • 与hdfs本地性相关的参数。
参数名 含义 备注
hdfsBlocksLocalityIndex 统计RegionServer所在机器的数据本地化的概率。 HDFSBlocksDistribution用来计算RegionServer下的所有数据的分散度。
  • 基本配置信息的相关参数
参数名 含义 备注
stores RegionServer包含的Store的个数 每一个HRegion会根据ColumnFamily的个数设置同数目的Store,每个Store下有一个MemStore和若干个StoreFiles组成。因此,stores的个数其实是RegionServer的一种数据组织管理单元。
storefiles RegionServer中所有的Storefiles的个数 如上,每一个Store会包含若干个StoreFiles,每个StoreFile是HFile结构。StoreFiles很多的RegionServer,在一定程度上可以反应出写操作频繁。
memstoreSize RegionServer中所有HRegion中的memstore大小的总和 该值的变化,可以反应出一个RegionServer上写请求的负载状况。可以观察memstoreSize的变化率,如果在单位时间内变化比较抖动,可以近似认为Put操作频繁。
numPutsWithoutWAL RegionServer中不写WAL(Write-Ahead-Log)的Put操作的个数 表示RegionServer中有多少次”不安全”的put操作。这里的不安全是指,如果Put操作只写入MemStore,而不执行Hlog.append操作。
dataInMemoryWithoutWAL RegionServer中不写WAL的Put操作的数据在Memstore占用的空间 表示RegionServer中不安全的put操作占用的Memstore的大小,该值是具体的存储空间的大小。
readRequestsCount RegionServer从启动到统计时刻期间内读请求的个数。 该值表示自从HRegionServer启动到目前为止所有Region的读请求的总和。如下操作会触发HRegion的读请求+1:

 

1)getClosestRowBefore:定位Row时用到,客户端上的HConnectionManager定位row到Region位置的过程。由于在HConnectionManager上有缓存,

因此不是所有的row定位Region的过程中,都需要执行这个操作。

2)getScanner:客户端段换取scanner实例的过程,会记录一次读请求

3)scanner执行一次next(list)操作,会记录一次读请求。ps:如果10000个数据,client的每次next取1,则调用next 10000次,

readRequestCount +=10000

如果client 按照每次next取10000个数据,则只会记录一次读请求。

总结:readRequestCount与客户端读取数据的个数不等价,而且大部分情况下readRequestCount 远小于客户端读取数据个数

writeRequestCount RegionServer从启动到统计时刻期间内写请求得个数。 该值表示自从HRegionServer启动到目前为止所有Region的写请求的总和。如下操作会触发HRegion的写请求的个数+1:

 

1) 单一Delete操作。写请求个数+1

2)单一Put操作。写请求个数+1

3)batchMutate操作。虽然大部分操作都是批量操作(多Row),但是每次批量操作只会记录一次写请求。

4)checkAndMutate操作。写操作+1,操作的范围是单Row。

5)append(Append)操作,Append是对于单行操作的聚集。只记录一次写操作。

6)incrementColumnValue操作。columnValue的必须是64bit long型值,每次操作记录写操作+2

7)bulkLoadHFiles操作。写请求的个数+1,与导入的hfile文件数无关。

总结:writeRequestCount与客户端写操作个数不完全等价,大部分情况下writeRequestCount远小于客户端写操作的个数(尤其批量写频繁的情况下)。

requestCount RegionServer从启动到统计时刻期间内请求的总个数 该值不等于writeRequestCount + readRequestCount的和。它统计的操作是在HRegionServer对象上的操作,因此比HRegion的操作更靠近Client端,统计的内容有:1)getRegionInfo 获得HRegion的相关信息。 +1

 

2)getClosestRowBefore 帮助HConnectionManager定位row对应的Region位置。+1

3)get操作,单行读操作。 +1

4)exists()操作,单行操作,判断Get是否存在。+1

5)put操作,单行写操作。+1

6)put(List<Put>)操作,批量写操作。+ list.size()

7) checkAndMutate 操作,单行操作。 +1

8)openScanner操作,打开一个scanner。 +1

9)scanner next(nbrows)操作,从scanner读取nbrows行数据,+nbrows

10) close() 操作,RegionServer下线前的操作。+1

11)delete操作,单行操作。+1

12)delete(List<Delete>)操作,批量删除操作。+ list.size()

13) lockRow操作。HTable提供了对于单行的客户端加锁服务。+1

14)unlockRow操作。HTable提供了对于单行的客户端解锁服务。+1

15)mutateRow操作。单行复合操作。+1

16)append操作。单行操作 +1

17)increment操作。单行操作 +1

18) incrementColumnValue操作。单行操作 +1

19) Multi(MultiAction<R〉 multi) ,批量操作,大部分的ThriftServer调用的批量操作的入口函数。+multi.size()

20 )execCoprocessor, 执行一次Coprocessor,+1

21) getCompactionState,获取Region的compaction信息, +1

总结:requestCount在很大程度上反映了RegionServer的负载状况。如果对于该Count的值进行分解,按照功能可以分为如下几类:

  • 和客户端读数据直接相关的读操作的个数 (Get、Scan、Next等操作)
  • 和客户度写操作直接相关的写操作的个数 (Put、Delete、Multi、mutate、append、increment、incrementColumnValue、等操作)
  • RegionServer的功能性操作的个数。(getCompactionState,close,getRegionInfo )

 

这里 补充一下在hbase监控页面上看到的每个RegionServer的Request实时计算流程。

RegionServer会定期(hbase.regionserver.msginterval)执行操作,这主要包括:

1)更新RegionServerMetrics对象 。其中

this.metrics.incrementRequests(this.requestCount.get());
this.metrics.requests.intervalHeartBeat();

RegionServerMetrics.requests 属于MetricsRate,也就是每次event时,会在累加count,然后等待执行一次intervalHeartBeat就会把计算在相近的连续两次ntervalHeartBeat之间的速度。request_between_interval/interval。

显然每次执行metrics时,regionserver就会更新这个值到Metrics上。

2)RegionServer向Master报告当前的负载信息 。

会创建成一个HServerLoad,其中有两个参数,一个是当前RegionServer上RegionRequest的个数,是在(hbase.regionserver.msginterval)期间内的所有的request个数,另外一个是metrics刚刚更新的requestCountRate。

其中第一个值用来做HMaster的统计使用,第二个值就是我们在页面上每次刷新看到的最新的request值。

 

3)RegionServer的RequestCount归零。

因此 ,从这个可以看出,如果在Table层次上做统计Table,需要细化到每一个Region的RequestCount,目前未开发的RegionServerMetrics还无法满足这种需求。总结一下,可以继续开发完善的点有 :

1) 按照读写操作区分requestCount的统计,实时掌握以RegionServer为监控对象的负载状况。

2)借助writeRequestCount和readRequestCount的值,在数据收集过程中,按照Table为单位重新整合。如果必要的话,需要对其收集数据的方式进行重算,保证每行的操作能够得到统计。这样可以实时统计每个Table的读写负载状况。(需要较大的开发量)

  • 与HLog、HFile有关的Metrics
参数名 含义 备注
storefileIndexSizeMB

在RegionServer内所有Store下对应的

StoreFile文件都会有一个Reader,

该Reader中包含了dataBlockIndexReader

和 metaBlockIndexReader两类

 

indexSize=dataBlockIndexReader.heapSize()

+ metaBlockIndexReader.heapSize()

该值与HFile的数目以及大小有关,基本上是StoreFile数目越多,该值就会越大。因此,可以通过该值来推断出RegionServer上Store的规模来。
totalStaticIndexSize HRegionServer上每个HFile文件的IndexSize的大小,这是指未压缩的,不带有其它信息的所有HFileBlockIndex信息的总和 。 该值是HFileBlock Index 的总大小,可以反映出RegionServer上HFileBlock的总规模。
rootIndexSizeKB 内容与storefileIndexSizeMB等同  
totalStaticBloomSizeKB 所有Store上的Bloom Filter大小的总和。 可以衡量Bloom Filter占用的存储资源状况。
fsWriteLatency 当前每次写HLog操作的平均Latency 可以反映出写数据的性能状况。
fsWriteSize 当前每次写HLog操作的平均长度 可以结合参数numPutsWithoutWAL,如果numPutsWithoutWAL比较小的情况下,可以一定程度上反映出当前每行的大小。
fsSyncLatency 当前HLog的sync操作的延迟状况 可以在一定程度上反映出HBase所依赖的HDFS 写数据的状态。如果出现过高,此时,监控系统应该给出报警信息。
slowHLogAppendTime 该值反映出RS的Append Hlog操作超过1000ms的平均延迟情况 可以时刻掌握Append HLog性能异常点的状况,可以通过该值分析出,在哪些时间段内的Append Hlog操作的问题较多。
slowHLogAppendCount 当前RS进行Append Hlog操作中,延迟超过1000ms的个数。 实时掌握节点内Append HLog插入异常的状况,如果在一定时间内,发现该值处于不断增长的状况,说明插入的数据有了新问题。
fsReadLatency 当前RS进行的HFile读取操作的平均延迟。 可以实时掌握每一个时间点的延迟情况
fsPReadLatency 同上,不同之处,这里统计的是PositionRead的平均延迟。与fsReadLatency是互斥的。 同上。
checksumFailuresCount HFile进行checksum过程中出错次数。 可以检查HDFS读写数据异常或者网络状况的异常。
fsReadLatencyHistogram 是一种概率统计fsReadLatency,例如99.9%的latency的大小是多少。 借助MetricsHistogram可以更好地分析Latency的状况。HBase性能分析中,可能受到outlier影响比较大,因此,统计大部分的操作的延迟更合理一些。
fsWriteLatencyHistogram 同上,统计写延迟。 同上。
fsPreadLatencyHistogram 同上,统计PostionRead的延迟。 同上。
  • 功能性参数。
参数名 含义 备注
compactionTime 平均执行一次Compaction的时间 Compaction的性能会影响到读写数据性能。
compactionSize 平均执行一次Compaction操作文件的大小 可以衡量出Compaction处理的数据量。
flushTime 当前flush一次MemStore需要使用的时间。 衡量出MemStore到HFile的过程
flushSize 当前flush一次需要的时间。 衡量出MemStore flush的大小。
regionSplitSuccessCount Split成功的次数 Split操作的状况。
regionSplitFailureCount Split出错的次数 Split操作的状况。
updatesBlockedMs 因为MemStore不足需要进行Flush操作,而阻塞正常写操作的时间。 反映出因为阻塞式Flush而造成的写阻塞状况
updatesBlockedSecondsHighWater 当前阻塞的时间积累。 相当于目前已经有多长时间的阻塞。

文章的脚注信息由WordPress的wp-posturl插件自动生成

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[Binospace] HBase Metrics参数详解 的相关文章

  • 如何在 Hive 中访问 HBase 表,反之亦然?

    作为一名开发人员 我通过使用以下命令从现有 MySQL 表导入数据 为我们的项目创建了 HBase 表 sqoop job 问题是我们的数据分析师团队熟悉MySQL语法 意味着他们可以查询HIVE轻松上桌 对于他们 我需要在 HIVE 中公
  • 使用主机系统上的客户端访问在虚拟机中运行的 HBase

    我尝试使用客户端程序将一些数据写入hbase HBase Hadoop 在 Cloudera ubuntu 的预配置虚拟机中运行 客户端运行在托管虚拟机的系统上 并直接在虚拟机中运行客户端 所以现在想使用vm外的客户端来访问vm上的服务器
  • 如何运行Hbase Java示例?

    我在运行简单的 Hbase 示例时遇到问题 我在 HbaseTest java 上创建了一个表并插入了一些记录 在Unix中 我可以编译java类 经过 javac classpath hbase 0 94 2 jar hadoop cor
  • HBase 上的 Thrift 有性能基准吗?

    我有一个可以将大量数据写入 hbase 的系统 系统是用c 编写的 发现hbase有其他语言的thrift接口 我的问题是 HBase 上的 Thrift 有性能基准吗 与java原生api相比 最劣势是什么 我推荐最近关于这个主题的两篇博
  • 我的 cdh5.2 集群在运行 hbase MR 作业时出现 FileNotFoundException

    我的 cdh5 2 集群运行 hbase MR 作业时出现问题 例如 我将 hbase 类路径添加到 hadoop 类路径中 vi etc hadoop conf hadoop env sh 添加行 export HADOOP CLASSP
  • Spark Streaming数据放入HBase的问题

    我是这个领域的初学者 所以我无法理解它 HBase 版本 0 98 24 hadoop2 火花版本 2 1 0 以下代码尝试将从 Spark Streming Kafka 生产者接收的数据放入 HBase 中 Kafka输入数据格式是这样的
  • security.UserGroupInformation:MR 的 PrivilegedgedActionException 错误

    每当我尝试执行映射缩减作业以写入 Hbase 表时 我都会在控制台中收到以下错误 我正在从用户帐户运行 MR 作业 错误 security UserGroupInformation PriviledgedActionException 为
  • Java 项目的 SLOC

    我需要一个免费工具来计算 Java 项目的 SLOC 我只需要以下指标 SLOC 注释行数 可选地javadoc 指标 可选地按文件类型 java js css html xml 等 对统计信息进行排序 Bonus 100 Java 我不喜
  • Java 中 switch 的 McCabe 循环复杂度

    我使用的 switch 语句有 13 个案例 每个案例只有一行返回值 麦凯布将其涂成红色 有没有更简单的方法来编写一个大的 switch 语句 读起来似乎并不复杂 但我不喜欢默认设置变成红色 如果其他人在我的代码上使用相同的工具并看到红色的
  • 无法在 Spring Boot 2(版本 2.0.0.M7)中包含 Prometheus 指标

    无法在 Spring Boot 2 版本 2 0 0 M7 项目中包含 Prometheus 指标 根据千分尺文档 https micrometer io docs ref spring 2 0 prometheus added sprin
  • 如何在 HBase 中续订过期的 Kerberos 票证?

    我有一个小型 spring 服务 它提供基本功能 例如从 hbase 表中放入 删除 获取 一切似乎都正常 但有一个问题 启动 Tomcat 服务器 10 小时后 我的 kerberos 票证过期 因此我应该更新它 我尝试对 hbase 使
  • 如何将多个 QualifierFilter 应用于 HBase 中的一行

    我们想使用两个 QualifierFilters 过滤 HBase 表上的扫描 意味着我们只想获取表中确实具有特定列 col A 的行AND 某个其他列 col B 我们当前的方法如下所示 FilterList filterList new
  • 错误:org.apache.hadoop.hbase.MasterNotRunningException:null+hbase+hadoop

    我最近用两台机器 在ubuntu上 配置了hadoop集群 到目前为止效果很好 但是当我尝试在上面的 hadoop 集群上配置 hbase 时 它 显示错误 这就是我所做的 我有两台机器 192 168 1 110 Hadoop主站 192
  • Hbase 列族

    Hbase 文档表示 避免创建超过 2 3 个列族 因为 Hbase 不能很好地处理超过 2 3 个列族 其原因在于压缩和刷新 以及 IO 但是 如果我的所有列总是填充 对于每一行 那么我认为这个推理并不那么重要 因此 考虑到我对列的访问是
  • HBase如何实现对HDFS的随机访问?

    鉴于HBase是一个数据库 其文件存储在HDFS中 那么它如何实现对HDFS中单个数据的随机访问呢 这是通过什么方法实现的呢 From Apache HBase 参考指南 http hbase apache org book archite
  • Visual Studio 2005 中的代码分析

    我有一个 Visual Studio 2005 解决方案工作区 其中包含 8 个项目 我想分析完整的代码 所有项目 并获取有关每个函数执行所花费的绝对周期的一些度量 或者至少是周期消耗的百分比 我查看了 VS 2005 的帮助以及项目设置选
  • 使用 Cassandra 进行单元版本控制

    我的应用程序使用 AbstractFactory 作为 DAO 层 因此一旦实现了 HBase DAO 系列 创建 Cassandra DAO 系列并从多个角度查看差异对我来说将是非常好的 不管怎样 试图做到这一点 我看到 Cassandr
  • Grafana中从InfluxDB中获取总共两个系列的数据

    我现在很困惑 我在 Influx 和 Grafana 的深处花了一三天时间 绘制了一些对我的需求至关重要的图表 但是 对于最后一个指标 我需要合计两个指标 列值中的两个增量计数 我们将它们称为 notification one 和 noti
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • Hadoop - 直接从 Mapper 写入 HBase

    我有一个 hadoop 作业 其输出应写入 HBase 我并不真正需要减速器 我想要插入的行类型是在映射器中确定的 如何使用 TableOutputFormat 来实现此目的 从所有示例中 我看到的假设是 reducer 是创建 Put 的

随机推荐