# 九、监控和管理 HBase

所有的 HBase 服务都提供了一个简单的网络用户界面，它为您提供了关于服务如何运行的基本信息，并允许您访问日志。这些对于故障排除和诊断非常有用，核心服务(主服务器和区域服务器)拥有更丰富的网络用户界面，可以告诉您很多关于数据库运行状况的信息。

网络用户界面是使用 Jetty 网络服务器(内存占用少，响应时间快)嵌入的，因此它们在您运行相关服务时启动。它们都是不安全的网站；它们在没有通过 HTTP 进行身份验证的情况下运行。每个用户界面都运行在一个非标准的 HTTP 端口上，因此如果您想要限制用户界面的可用性，您需要阻止对端口的外部访问。

Docker 容器 hbase-简洁地说，所有的 HBase 服务器都在运行，所有的 UI 端口都暴露出来了，所以你可以运行一个实例并浏览到每个 UI。

节俭和星际之门用户界面为每个服务器提供相同的基本信息。图 17 显示了在端口 9095 上运行的节俭用户界面的主页:

![](img/00028.jpeg)

 17:节俭服务器 UI

类似的界面如图 18 所示，星际之门用户界面，运行在端口 8085 上:

![](img/00029.jpeg)

 18:Stargate UI

两个用户界面都显示了正在运行的 HBase 的确切版本，包括 git 提交标识(在修订字段中)和服务器的正常运行时间。如果服务器没有运行，您将不会从网络用户界面得到响应。

节俭用户界面还显示了一些关键的设置细节(它接受的传输和协议类型)，并且两个用户界面具有相同的链接集:

本地日志–查看服务器上的日志文件

日志级别–获取或设置服务器的日志级别

指标转储–提供服务器统计信息的详细转储

服务器配置–显示服务器的所有配置设置

最后两个环节值得单独看。Metrics Dump(来自基本路径的 URL 是/jmx)给出了包含大量信息的 JSON 输出，这些信息是从服务器中运行的 Java Management Extensions 捕获的。

您可以使用 JMX 客户端来导航输出，或者添加自定义监控来查询服务器并解析 JSON，作为自动诊断测试的一部分。代码清单 61 显示了度量转储输出的 JVM 堆使用部分:

 61: JMX 指标转储

```java
          "HeapMemoryUsage": {
              "committed": 62652416,
              "init": 64689792,
              "max": 1018560512,
              "used": 16339616
          }

```

糖化血红蛋白配置链接(来自基本网址的/conf)以 XML 形式返回活动糖化血红蛋白配置。每个属性都包含当前值和值的来源(可以是服务器的 hbase-site.xml 或 hbase 默认值)，这对于跟踪配置错误的环境非常有用。

代码清单 62 显示了 HBase 配置中的动物园管理员地址:

 62: XML 配置设置

```java
          <property>
           <name>hbase.zookeeper.quorum</name>
           <value>localhost</value>
           <source>hbase-default.xml</source>
          </property>

```

在区域服务器上，网络用户界面具有与外部应用编程接口用户界面相同的日志、指标和配置链接，但它包含了关于服务器性能及其提供的数据的更多详细信息。

图 19 显示了运行在端口 60030 上的区域服务器用户界面的主页:

![](img/00030.jpeg)

 19:区域服务器网页界面

“服务器指标”部分告诉您这一个区域服务器工作有多努力—它托管多少个区域，以及它当前每秒服务多少请求。这些是来自任何一个应用编程接口的请求，所以如果你使用的是 Java、节俭和星际之门客户端，总的使用量会显示在这里。

您可以深入到指标中检查服务器的内存使用情况，并查看区域正在使用的 WAL 和 Store 文件的细分。如图 20 所示，Requests 选项卡显示了累计服务的请求:

![](img/00031.jpeg)

 20:区域服务器界面中的服务器指标

这些统计数据是所有区域的读写总数，因为服务器一直在运行。

主页还显示任何长期运行的任务及其状态。在图 21 中，绿色条突出显示某个区域的块缓存已完成刷新(在本例中是元数据表，hbase:meta):

![](img/00032.jpeg)

 21:区域服务器界面任务状态

区域服务器用户界面值得进一步探索。您还可以获得缓存工作情况的统计数据、服务器托管的所有区域的细分(带有开始和结束行键)以及每个区域的请求数量。

这些细节有助于了解您的区域在服务器之间的平衡情况，并有助于您检测任何热点，如图 22 所示，其中访问日志表的区域 e 有 75K 个读取请求，而相邻区域为 0 个:

![](img/00033.jpeg)

22:UI 中的一个区域热点

虽然区域服务器用户界面很有用，但是主服务器用户界面运行在更高的级别，显示所有区域服务器的性能和指标。这是检查您的 HBase 系统运行状况的第一个地方。

默认情况下，网络用户界面运行在主服务器的端口 60010 上。如果您正在运行多个主控形状，则只有活动的主控形状显示任何信息。主屏幕如图 23 所示，打开时显示所有区域服务器的摘要，说明每个服务器服务多少个区域，以及它们当前每秒处理多少个请求:

![](img/00034.jpeg)

 23:主网页界面

在区域服务器部分，主用户界面还显示区域服务器的内存使用、单个区域请求和存储文件的组合细节。契约选项卡告诉您是否有任何重大契约正在发生，以及它们处于什么状态。

从顶层导航中，您可以访问主服务器的本地日志文件并更改日志级别，还可以查看指标转储和 HBase 配置。调试转储为您提供了服务器正在做什么的非常低级的细节(除非它行为不当，否则您很少需要)，但是表细节链接为您提供了有用的信息，如图 24 所示:

![](img/00035.jpeg)

 24:主界面中的表格明细

此页面显示了数据库中定义的每个表以及完整的配置(您可以看到第 2 章中的 with-custom-config 表为列系列指定了三个版本，而其他表中的默认版本为一个)。

我们在第 4 章、第 5 章和第 6 章中看到的所有客户端 API 都有 DDL 特性，但是我更喜欢将客户端代码从管理工作中解放出来，并使用 HBase Shell 脚本进行 DDL 和管理。还有一些管理功能只能从 Shell 中获得。

通常，您需要在 HBase 上执行的管理功能是针对表未按您预期的方式使用，并且性能受到影响的情况。表在一个区域比其他区域有更多活动数据的热点可以通过手动拆分表来纠正。

split 命令可以在不同的级别使用，可以拆分命名区域或命名表。当您拆分现有的表时，这通常是因为您更了解数据是如何分布的，并且 HBase 允许您为新区域提供拆分键，如代码清单 63 所示:

 63:拆分现有表

```java
          hbase(main):006:0> split 'access-logs', 'ej'
          0 row(s) in 0.4650 seconds

```

图 25 显示了主用户界面中的表格细节，在拆分之后，原来的 e 区域现在是两个独立的区域:

![](img/00036.jpeg)

 25:主界面中的区域分割

手动拆分区域时，新区域将与原始区域位于同一台服务器上。这保持了数据的局部性，因为原始数据都在一台服务器上，但是如果您想要删除热点并在更多服务器上共享数据，这就没有帮助了。

每当您的区域没有很好地平衡时(例如，如果您已经手动拆分了它们，或者添加了新的表)，您可以使用 balancer 命令强制进行重新平衡，该命令不带参数运行，如代码清单 64 所示:

 64:启动负载平衡器

```java
          hbase(main):007:0> balancer
          true                                                                                                                                       
          0 row(s) in 0.0680 seconds

```

如果能够启动重新平衡过程，平衡器命令将返回 true。平衡器实际上异步运行，并将在命令返回后继续运行。如果区域已经被主控从另一个进程移动，您不能开始重新平衡，命令将返回 false。

可能损害性能的最后一种情况是，由于区域被移动或服务器被添加到群集中，您的区域被分割成许多存储文件，和/或您的数据局部性较差。要解决这个问题，您需要进行一次大规模压缩，将两个或多个存储文件合并到一个区域和列族的 HFile 中，并确保每个 HFile 对于承载它的区域服务器都是本地的。

HBase 将按计划运行大型压缩，大约每 24 小时运行一次，如果在高峰访问时间运行，将会影响性能。如果您知道您的数据是碎片，那么最好在服务器负载较低时运行手动压缩。

压缩从 major _ compact 命令开始，您可以压缩整个表、一个列族、一个区域或一个区域中的一个列族。代码清单 65 显示了从访问日志表开始的压缩:

 65:开始表格的主要压缩

```java
          hbase(main):002:0> major_compact 'access-logs'
          0 row(s) in 0.2990 seconds

```

压缩可能需要很长时间，尤其是对于有许多区域的大型表。“区域服务器”用户界面中的“区域”视图向您显示压缩进度，但这一切都发生在后台，压缩区域在压缩运行时仍可读写。

通过在所有服务器进程中嵌入网络用户界面，HBase 为您提供了大量关于数据库运行情况的信息。还使用 JMX 收集指标，这使得将它们插入第三方监控工具(如 Ganglia)变得很容易。

节俭用户界面和星际之门用户界面为您提供了一个基本的概述来展示这些服务器的性能，但是主用户界面和区域用户界面为您提供了关于您的数据是如何构建的以及如何使用的丰富见解。从管理界面中，您可以很容易地看到一个区域服务器比它应该做的更努力的热点。

使用 HBase Shell，您可以纠正更常见的性能问题，我们看到了如何手动拆分表、强制主服务器跨服务器重新平衡区域，以及运行主要压缩来优化存储级别的数据。

HBase 的内容比我在这本小书里介绍的要多得多，如果您认为 HBase 非常适合您的下一个数据存储，还有很多值得探索的地方。如果你想尝试一下你的首选客户，这本书附带的 Docker 图像是一个很好的开始。

如果您想在生产环境中尝试使用 HBase 而不调试一套服务器，您可以在云中运行托管的 HBase 集群，在 AWS 上运行弹性地图缩减，在 Azure 上运行 HDInsight。

这两种云都提供了一种简单的入门方法

h 一个高性能集群，有了 Azure，你可以注册一个新的账号，免费试用 HDInsight 上的 HBase 一周。如果你想看看 HBase 如何在 Azure 上与 Hadoop 生态系统的其他部分协同工作，我在 Pluralsight 课程 [HDInsight Deep Dive: Storm、HBase 和 Hive](https://www.pluralsight.com/courses/hdinsight-deep-dive-storm-hbase-hive) 中构建了一个完整的解决方案，该课程现已推出。