hbase 报错gc wal.FSHLog: Error while AsyncSyncer sync, request close of hlog YouAr

博客内容涉及一个关于HBase运行过程中遇到的常见错误日志,该错误涉及到GC长时间运行导致ZooKeeper认为RegionServer已死,进而引发一系列Region恢复操作。博主分析了问题的根本原因,包括GC执行过慢和CPU资源限制,并提出了调整JVM参数以优化Survivor区大小和CMS触发阈值的解决方案,以减少Full GC的发生,从而避免类似问题的再次出现。

 

 

一个很常见的报错log

 

2015-03-05 03:10:35,461 FATAL [regionserver60020-WAL.AsyncSyncer0] wal.FSHLog: Error while AsyncSyncer sync, request close of hlog
org.apache.hadoop.ipc.RemoteException(java.io.IOException): BP-1540478979-192.168.5.117-1409220943611:blk_1098635649_24898817 does not exist or is not under Constructionblk_1098635649_24900382
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkUCBlock(FSNamesystem.java:5956)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.updateBlockForPipeline(FSNamesystem.java:6023)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.updateBlockForPipeline(NameNodeRpcServer.java:645)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.updateBlockForPipeline(ClientNamenodeProtocolServerSideTranslatorPB.java:874)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$
2015-03-05 03:10:35,460 FATAL [regionserver60020-WAL.AsyncSyncer2] wal.FSHLog: Error while AsyncSyncer sync, request close of hlog
org.apache.hadoop.ipc.RemoteException(java.io.IOException): BP-1540478979-192.168.5.117-1409220943611:blk_1098635649_24898817 does not exist or is not under Constructionblk_1098635649_24900382
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.checkUCBlock(FSNamesystem.java:5956)
        at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.updateBlockForPipeline(FSNamesystem.java:6023)
        at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.updateBlockForPipeline(NameNodeRpcServer.java:645)
        at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.updateBlockForPipeline(ClientNamenodeProtocolServerSideTranslatorPB.java:874)
        at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProt
### HBase RetriesExhaustedException Cannot Get the Locations 问题分析与解决方案 HBase 中的 `RetriesExhaustedException` 异常通常表示客户端在尝试多次重试后仍然无法完成请求。这种异常可能由多种原因引起,例如 ZooKeeper 连接问题、RegionServer 不可用或 HDFS 文件系统问题等。以下是针对该问题的详细分析和解决方法: #### 1. 检查 ZooKeeper 集群状态 ZooKeeper 在 HBase 中扮演了关键角色,用于协调分布式系统中的各个组件。如果 ZooKeeper 集群不可用或配置错误,可能会导致客户端无法获取 Region 的位置信息[^1]。 - 确保 ZooKeeper 服务正在运行,并且可以通过指定的端口访问。 - 使用以下命令检查 ZooKeeper 的状态: ```bash echo stat | nc <zookeeper_host> <zookeeper_port> ``` 如果返回 ZooKeeper 的统计信息,则说明服务正常。 #### 2. 验证 HBase 配置文件 HBase 的配置文件(如 `hbase-site.xml`)需要正确设置 ZooKeeper 的地址和端口。如果配置错误,客户端将无法连接到 HBase 集群[^1]。 - 检查 `hbase-site.xml` 文件中的以下配置项是否正确: ```xml <property> <name>hbase.zookeeper.quorum</name> <value><zookeeper_host_1>,<zookeeper_host_2>,<zookeeper_host_3></value> </property> <property> <name>hbase.zookeeper.property.clientPort</name> <value>2181</value> </property> ``` #### 3. 检查 RegionServer 状态 如果某些 RegionServer 不可用,客户端可能无法找到所需的 Region。这会导致 `RetriesExhaustedException` 异常。 - 使用以下命令检查 RegionServer 的状态: ```bash hbase shell status 'simple' ``` 确保所有 RegionServer 都处于活动状态。 #### 4. 增加重试次数和超时时间 默认情况下,HBase 客户端会进行有限次数的重试。如果网络延迟较高或集群负载较大,可以增加重试次数和超时时间。 - 修改 `hbase-site.xml` 文件中的以下参数: ```xml <property> <name>hbase.client.retries.number</name> <value>35</value> </property> <property> <name>hbase.rpc.timeout</name> <value>60000</value> </property> <property> <name>hbase.client.operation.timeout</name> <value>120000</value> </property> ``` #### 5. 检查 HDFS 文件系统 HBase 将数据存储在 HDFS 上。如果 HDFS 文件系统出现问题(如 NameNode 不可用或 DataNode 故障),可能会导致客户端无法访问数据。 - 使用以下命令检查 HDFS 的健康状态: ```bash hdfs fsck / ``` 确保没有丢失块或损坏文件。 #### 6. 日志分析 通过分析 HBase 和 ZooKeeper 的日志文件,可以进一步定位问题的根本原因。 - 查看 HBase 日志文件(通常位于 `/logs/hbase-*.log`)。 - 查看 ZooKeeper 日志文件(通常位于 `/logs/zookeeper-*.log`)。 --- ### 示例代码:调整 HBase 客户端配置 以下是一个 Java 示例代码,展示如何自定义 HBase 客户端的重试和超时配置: ```java Configuration config = HBaseConfiguration.create(); config.setInt("hbase.client.retries.number", 35); config.setInt("hbase.rpc.timeout", 60000); config.setInt("hbase.client.operation.timeout", 120000); Connection connection = ConnectionFactory.createConnection(config); Table table = connection.getTable(TableName.valueOf("my_table")); Result result = table.get(new Get(Bytes.toBytes("row_key"))); System.out.println("Value: " + Bytes.toString(result.getValue("cf".getBytes(), "col".getBytes()))); table.close(); connection.close(); ``` --- ### 总结 `RetriesExhaustedException` 通常是由连接问题或配置错误引起的。通过检查 ZooKeeper 状态、验证 HBase 配置、监控 RegionServer 和 HDFS 健康状况,可以有效解决该问题。此外,适当调整客户端的重试次数和超时时间也能提高系统的稳定性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值