升级HBase Client至2.5.8后Cassandra Driver 2.1.10.2报NoHostAvailableException
问题分析与解决方案
问题现象
当HBase Client版本升级至2.5.8,且搭配Cassandra Driver 2.1.10.2使用时,Cassandra抛出NoHostAvailableException异常,异常栈信息如下:
Caused by: com.google.common.util.concurrent.UncheckedExecutionException: com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (no host was tried) at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201) ~[guava-16.0.1.jar:?] at com.google.common.cache.LocalCache.get(LocalCache.java:3934) ~[guava-16.0.1.jar:?] at com.google.common.cache.LocalCache$LocalManualCache.get(LocalCache.java:4736) ~[guava-16.0.1.jar:?] at com.epsilon.cassandra.dao.AbstractCassandraDao.getCachedStatement(AbstractCassandraDao.java:484) ~[cassandraDataStore-0.0.2.50.jar:?] at com.epsilon.cassandra.dao.AbstractCassandraDao.doUpdateByCql(AbstractCassandraDao.java:120) ~[cassandraDataStore-0.0.2.50.jar:?] at com.epsilon.cassandra.dao.AbstractCassandraDao.doUpdateByNamedStatement(AbstractCassandraDao.java:107) ~[cassandraDataStore-0.0.2.50.jar:?]
将HBase Client降级至2.1.10.2后,异常不再出现。
根因分析
这是Guava版本冲突导致的问题:
- Cassandra Driver 2.1.10.2依赖Guava 16.0.1,而HBase Client 2.5.8依赖的Guava版本显著更高(如Guava 28+)。
- 项目构建时,高版本Guava会覆盖低版本,而Cassandra Driver 2.x系列对高版本Guava的API变更兼容性较差,导致其内部缓存逻辑(如
LocalCache相关操作)执行异常,最终触发NoHostAvailableException。
解决方案
1. 统一Guava版本
强制项目使用Cassandra Driver兼容的Guava 16.0.1版本,但需要先验证HBase Client 2.5.8是否能适配该低版本Guava。如果HBase Client出现功能异常,则此方案不可行。
2. 升级Cassandra Driver版本
将Cassandra Driver升级到3.x或4.x系列,这些版本对高版本Guava的兼容性更好,能匹配HBase Client 2.5.8的依赖。升级时需同步验证业务代码与新Driver版本的兼容性,避免引入新问题。
3. 暂用降级后的HBase Client版本
如果前两个方案无法快速落地,可以暂时保持HBase Client在2.1.10.2版本,确保Cassandra Driver正常运行,后续再逐步推进组件版本的兼容升级计划。
内容的提问来源于stack exchange,提问作者meghana manjunath
相关产品推荐
相关产品推荐

