升级时无法跳过主要版本。 如果要从版本0.98.x升级到2.x,则必须先从0.98.x升级到1.2.x,然后再从1.2.x升级到2.x.

查看Apache HBase配置,特别是Hadoop。 熟悉支持和测试期望。

Hbase版本及其兼容性

Aspirational Semantic Versioning

从1.0.0版本开始,HBase正在为其发布版本进行语义版本控制。综上所述:

  • 给定版本号MAJOR.MINOR.PATCH,增加:
  • 进行不兼容的API更改时的MAJOR版本,
  • 以向后兼容的方式添加功能时的MINOR版本,以及
  • 当您进行向后兼容的错误修复时,PATCH版本。
  • 预发布和构建元数据的附加标签可用作MAJOR.MINOR.PATCH格式的扩展。
  • 兼容性尺寸
  • 除了通常的API版本控制注意事项外,HBase还有其他兼容性维度,我们需要考虑这些因素。
  • 客户端 - 服务器线协议兼容性
  • 允许更新客户端和服务器不同步。
  • 我们只能允许首先升级服务器。即服务器将向后兼容旧客户端,这样新的API就可以了。
    示例:用户应该能够使用旧客户端连接到升级的群集。
  • Server-Server协议兼容性
  • 不同版本的服务器可以在同一群集中共存。
  • 服务器之间的线路协议兼容。
  • 分布式任务(例如复制和日志拆分)的工作人员可以在同一群集中共存。
  • 也不会更改从属协议(例如使用ZK进行协调)。
  • 示例:用户可以执行滚动升级。
  • 文件格式兼容性
  • 支持向后和向前兼容的文件格式
  • 示例:文件,ZK编码,目录布局作为HBase升级的一部分自动升级。用户可以降级到旧版本,一切都将继续工作。
  • 客户端API兼容性
  • 允许更改或删除现有客户端API。
  • 在我们更改/删除API之前,需要弃用整个主要版本的API。
  • 修补程序版本中提供的API将在所有后续修补程序版本中提供。但是,可能会添加新的API,这些API在早期的修补程序版本中不可用。
  • 补丁版本中引入的新API将仅以源兼容的方式添加[1:请参阅“源兼容性”https://blogs.oracle.com/darcy/entry/kinds_of_compatibility]:即实现公共API的代码将继续编译。
  • 示例:使用新弃用的API的用户无需使用HBase API调用修改应用程序代码,直到下一个主要版本。
  • 客户端二进制兼容性
  • 写入给定补丁版本中可用API的客户端代码可以针对新版本的后续补丁版本运行不变(无需重新编译)。
  • 写入给定补丁版本中可用API的客户端代码可能不会针对早期补丁版本中的旧jar运行。
  • 示例:旧编译的客户端代码将与新jar一起保持不变。
  • 如果客户端实现HBase接口,则可能需要重新编译才能升级到较新的次要版本(有关不兼容更改的警告,请参阅发行说明)。将尽一切努力提供默认实现,因此不应出现此情况。
  • 服务器端有限API兼容性(取自Hadoop)
  • 内部API标记为稳定,演变或不稳定
  • 这意味着协处理器和插件(可插入类,包括复制)的二进制兼容性,只要这些只使用标记的接口/类。
  • 示例:旧编译的协处理器,过滤器或插件代码将与新jar一起保持不变。
  • 依赖性兼容性
  • 除Apache Hadoop外,HBase的升级不需要依赖项目的不兼容升级。
  • HBase的升级不需要Java运行时的不兼容升级。
  • 示例:将HBase升级到支持依赖性兼容性的版本不需要升级Apache ZooKeeper服务。
  • 示例:如果当前版本的HBase支持在JDK 8上运行,则升级到支持依赖性兼容性的版本也将在JDK 8上运行。



Hadoop版本

以前,我们尝试维护基础Hadoop服务的依赖兼容性,但在过去几年中,这已被证明是站不住脚的。虽然HBase项目试图维持对旧版本Hadoop的支持,但我们删除了未能继续查看版本的次要版本的“受支持”指示符。此外,Hadoop项目有自己的一组兼容性指南,这意味着在某些情况下,必须更新到较新的受支持的次要版本可能会破坏我们的一些兼容性承诺。

  • 操作兼容性
  • 指标更改
  • 服务的行为变化
  • 通过/ jmx / endpoint公开的JMX API
  • 总结
  • 补丁升级是替代品。不允许任何非Java二进制和源兼容的更改。 [2:请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls- 13.html。]修补程序版本中的降级版本可能不兼容。
  • 次要升级不需要修改应用程序/客户端代码。理想情况下,如果使用新的jar,可能需要重新编译客户端代码,协处理器,过滤器等。
  • 重大升级允许HBase社区进行重大更改。

滚动升级

滚动升级是一次在服务器中更新服务器的过程。 如果它们是二进制或线路兼容的,您可以在HBase版本之间滚动升级。 有关这意味着什么的更多信息,请参阅在二进制/有线兼容的版本之间滚动升级。 粗略地说,滚动升级是优雅停止每个服务器,更新软件,然后重新启动。 您可以为群集中的每个服务器执行此操作。 通常先升级Master,然后升级RegionServers。 有关可以帮助使用滚动升级过程的工具,请参阅滚动重新启动。
例如,在下面,HBase被符号链接到实际的HBase安装。 在升级时,在通过群集运行滚动重新启动之前,我们将符号链接更改为指向新的HBase软件版本,然后运行

$ HADOOP_HOME=~/hadoop-2.6.0-CRC-SNAPSHOT ~/hbase/bin/rolling-restart.sh --config
  ~/conf_hbase

滚动重启脚本将首先正常停止并重新启动主服务器,然后依次启动每个RegionServers。 由于符号链接已更改,因此在重新启动时,服务器将使用新的HBase版本。 随着滚动升级的进行,检查日志中的错误。

在二进制/有线兼容的版本之间滚动升级

除非另有说明,否则HBase次要版本是二进制兼容的。 您可以在HBase点版本之间进行滚动升级。 例如,您可以通过在集群中进行滚动升级来替换1.2.4二进制文件,使用1.2.6二进制文件从1.2.6转到1.2.4。
在下面的次要版本特定部分中,我们将调出版本与线路/协议兼容的位置,在这种情况下,还可以执行滚动升级。

回滚

有时在尝试升级时,事情没有按计划进行。本节介绍如何执行回滚到早期HBase版本。请注意,只有在Major和一些Minor版本之间才需要这样做。您应始终能够在同一次要版本中的HBase Patch版本之间降级。这些说明可能要求您在开始升级过程之前采取措施,因此请务必事先仔细阅读本节。

注意事项

  • 回滚vs降级

本节介绍如何在HBase次要版本和主要版本之间的升级上执行回滚。在本文档中,回滚是指获取已升级的群集并将其还原到旧版本,同时丢失自升级后发生的所有更改的过程。相比之下,群集降级会将升级的群集还原到旧版本,同时保留自升级以来写入的任何数据。我们目前只提供回滚HBase集群的说明。此外,只有在执行升级之前遵循这些说明时,回滚才有效。

当这些说明谈到先决条件集群服务(即HDFS)的回滚与降级时,您应该将服务版本与退化的退化情况相同。

  • 复制

除非您正在执行全服务回滚,否则HBase群集将丢失任何已配置的HBase复制对等项。如果您的群集已配置为HBase复制,则在遵循这些说明之前,您应记录所有复制对等项。执行回滚后,您应该将每个记录的对等体添加回群集。有关启用HBase复制,列出对等项和添加对等方的详细信息,请参阅管理和配置群集复制。另请注意,自升级以来写入群集的数据可能已经或可能尚未复制到任何对等方。确定哪些对等方看到了复制数据以及回滚这些对等方中的数据是否超出了本指南的范围。

  • 数据位置

除非您正在执行全服务回滚,否则执行回滚过程可能会破坏区域服务器的所有位置。在群集有时间进行压缩以恢复数据位置之前,您应该期望性能下降。 (可选)您可以强制执行压缩以加速此过程,但代价是生成群集负载。

  • 可配置的位置

以下说明假定HBase数据目录和HBase znode的默认位置。这两个位置都是可配置的,您应该在继续之前验证群集中使用的值。如果您有不同的值,只需将默认值替换为配置中找到的值* HBase数据目录是通过密钥’hbase.rootdir’配置的,默认值为’/ hbase’。 * HBase znode通过密钥’zookeeper.znode.parent’配置,默认值为’/ hbase’。

所有服务回滚

如果您要执行HDFS和ZooKeeper服务的回滚,那么HBase的数据将在此过程中回滚。

  • 要求
    能够回滚HDFS和ZooKeeper

升级前

升级前无需其他步骤。 作为额外的预防措施,您可能希望使用distcp备份要升级的群集的HBase数据。 为此,请按照“HDFS降级后回滚”部分的“升级前”部分中的步骤进行操作,但要复制到另一个HDFS实例而不是同一实例中。

  • 执行回滚
  1. 停止HBase
  2. 执行HDFS和ZooKeeper的回滚(HBase应保持停止)
  3. 将已安装的HBase版本更改为以前的版本
  4. 启动HBase
  5. 验证HBase内容 - 使用HBase shell列出表并扫描一些已知值。

HDFS回滚和ZooKeeper降级后回滚

如果您将回滚HDFS但是经过ZooKeeper降级,那么HBase将处于不一致状态。在完成此过程之前,必须确保未启动集群。

  • 要求
  • 能够回滚HDFS
  • 降级ZooKeeper的能力

升级前

升级前无需其他步骤。作为额外的预防措施,您可能希望使用distcp备份要升级的群集的HBase数据。为此,请按照“HDFS降级后回滚”部分的“升级前”部分中的步骤进行操作,但要复制到另一个HDFS实例而不是同一实例中。

  • 执行回滚
  1. 停止HBase
  2. 执行HDFS的回滚和ZooKeeper的降级(HBase应保持停止)
  3. 将已安装的HBase版本更改为以前的版本
  4. 清除与HBase相关的ZooKeeper信息。警告:此步骤将永久销毁所有复制对等项。有关更多信息,请参阅Caveat下的HBase Replication部分。

清除ZooKeeper中的HBase信息

[hpnewton@gateway_node.example.com ~]$ zookeeper-client -server
 zookeeper1.example.com:2181,zookeeper2.example.com:2181,zookeeper3.example.com:2181
 Welcome to ZooKeeper!
 JLine support is disabled
 rmr /hbase
 quit
 Quitting...

5.启动HBase
6.验证HBase内容 - 使用HBase shell列出表并扫描一些已知值。

HDFS降级后回滚

如果您要执行HDFS降级,那么无论ZooKeeper是通过回滚,降级还是重新安装,您都需要遵循这些说明。

  • 要求
  • 能够降级HDFS
  • 升级前群集必须能够运行MapReduce作业
  • HDFS超级用户访问
  • HDFS中至少有两个HBase数据目录副本的足够空间

升级前

在开始升级过程之前,您必须完整备份HBase的后备数据。以下说明包括备份当前HDFS实例中的数据。或者,您可以使用distcp命令将数据复制到另一个HDFS集群。

  1. 停止HBase群集
  2. 使用distcp命令将HBase数据目录复制到备份位置作为HDFS超级用户(如下所示,在启用安全性的群集上)

使用distcp备份HBase数据目录

[hpnewton@gateway_node.example.com ~]$ kinit -k -t hdfs.keytab hdfs@EXAMPLE.COM
 [hpnewton@gateway_node.example.com ~]$ hadoop distcp /hbase /hbase-pre-upgrade-
 backup
  1. Distcp将启动mapreduce作业以处理以分布式方式复制文件。 检查distcp命令的输出以确保此作业成功完成。

执行回滚

  1. 停止HBase
  2. 对HDFS执行降级并对ZooKeeper执行降级/回滚(HBase应保持停止)
  3. 将已安装的HBase版本更改为以前的版本
  4. 从升级之前恢复HBase数据目录作为HDFS超级用户(如下所示,在启用安全性的群集上)。 如果您在另一个HDFS集群而不是本地备份数据,则需要使用distcp命令将其复制回当前的HDFS集群。

恢复HBase数据目录

[hpnewton@gateway_node.example.com ~]$ kinit -k -t hdfs.keytab hdfs@EXAMPLE.COM
[hpnewton@gateway_node.example.com ~]$ hdfs dfs -mv /hbase /hbase-upgrade-rollback
[hpnewton@gateway_node.example.com ~]$ hdfs dfs -mv /hbase-pre-upgrade-backup
/hbase
  1. 清除与HBase相关的ZooKeeper信息。 警告:此步骤将永久销毁所有复制对等项。 有关更多信息,请参阅Caveat下的HBase Replication部分。

清除ZooKeeper中的HBase信息

[hpnewton@gateway_node.example.com ~]$ zookeeper-client -server
zookeeper1.example.com:2181,zookeeper2.example.com:2181,zookeeper3.example.com:2181
Welcome to ZooKeeper!
JLine support is disabled
rmr /hbase
quit
Quitting...
  1. 启动HBase
  2. 验证HBase内容 - 使用HBase shell列出表并扫描一些已知值。