如何解决使用 Phoenix 运行 HBase 只读副本 Amazon EMR 集群时出现的“Cache of region boundaries are out of date”错误?
上次更新日期:2022 年 6 月 23 日
当我尝试使用 Apache Phoenix 连接到 Amazon EMR 读取副本集群上的 Apache HBase 时,我收到类似于如下的错误消息:
Error: ERROR 1108 (XCL08): 区域边界的缓存已过期。(state=XCL08,code=1108) org.apache.phoenix.schema.StaleRegionBoundaryCacheException: ERROR 1108 (XCL08): 区域边界的缓存已过期。 at org.apache.phoenix.exception.SQLExceptionCode$14.newException(SQLExceptionCode.java:365) at org.apache.phoenix.exception.SQLExceptionInfo.buildException(SQLExceptionInfo.java:150) at org.apache.phoenix.util.ServerUtil.parseRemoteException(ServerUtil.java:189) at org.apache.phoenix.util.ServerUtil.parseServerExceptionOrNull(ServerUtil.java:169) at org.apache.phoenix.util.ServerUtil.parseServerException(ServerUtil.java:140)
简短描述
默认情况下,Phoenix 会尝试连接到 hbase:meta 表。但是,由于 hbase:meta 表属于主集群,Phoenix 无法连接读取副本集群。要解决此问题,请修改 hbase-site.xml 以指向属于 HBase 读取副本集群的 hbase:meta_cluster-id 表。
解决方案
开始之前,请确认主集群和读取副本集群上已安装 Phoenix。如果主集群上未安装 Phoenix,则 Phoenix 无法从读取副本集群连接到 HBase。
正在运行的集群上
1. 将以下配置添加到主节点上的 HBase 配置文件 (/etc/phoenix/conf/hbase-site.xml)。将 cluster-id 替换为读取副本集群的 ID。
<property>
<name>hbase.balancer.tablesOnMaster</name>
<value>hbase:meta</value>
</property>
<property>
<name>hbase.meta.table.suffix</name>
<value>cluster-id</value>
</property>
2. 重新启动 Phoenix 服务:
对于 Amazon EMR 发行版本 5.29 及更低版本:
sudo stop phoenix-queryserver
sudo start phoenix-queryserver
对于 Amazon EMR 发行版 5.30 和更高版本:
sudo systemctl stop phoenix-queryserver.service
sudo systemctl start phoenix-queryserver.service
在 Amazon EMR 5.21.0 及更高版本中,您还可以通过覆盖主实例组的集群配置来进行这些配置更改:
1. 打开 Amazon EMR 控制台。
2. 在集群列表中,选择要重新配置的活动读取副本集群。
3. 打开集群的集群详细信息页面,然后转至配置选项卡。
4. 在筛选条件下拉列表中,选择主实例组。
5. 在重新配置下拉列表中,选择在表中编辑。
6. 选择添加配置,然后添加以下两个配置:
分类:phoenix-hbase-site
属性:hbase.balancer.tablesOnMaster
值:hbase:meta
分类:phoenix-hbase-site
属性:hbase.meta.table.suffix
值:${emr.clusterId}
7. 选择保存更改。
有关此流程的更多信息,请参见在控制台中重新配置实例组。
在新集群上
使用 Amazon EMR 4.6.0 或更高版本启动集群时,添加配置对象类似于以下内容:
[
{
"Classification": "phoenix-hbase-site",
"Configurations": [
],
"Properties": {
"hbase.balancer.tablesOnMaster" : "hbase:meta",
"hbase.meta.table.suffix" : "${emr.clusterId}"
}
},
{
"Classification": "hbase-site",
"Configurations": [
],
"Properties": {
"hbase.meta.table.suffix" : "${emr.clusterId}"
}
}
]