OpenTSDB报错求助:metrics'test'不存在及HBase类初始化失败
排查OpenTSDB自动创建Metric失败及HBase类加载错误的解决方案
首先,从你提供的错误栈来看,核心问题有两个:NoSuchUniqueName(明明开启了自动创建却找不到Metric的UID)和底层的HBase NoClassDefFoundError,后者才是导致前者的根本原因——因为自动创建Metric UID的逻辑需要和HBase交互,而HBase的类加载失败直接中断了这个流程,最终导致Metric UID创建失败,进而抛出找不到名称的错误。
下面是具体的排查和解决步骤:
1. 优先解决HBase的Protobuf类加载错误
错误里的java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.shaded.protobufotobufUtil$ClassLoaderHolder(看起来是拼写错误,应该是protobufUtil$ClassLoaderHolder),通常是以下原因导致:
- OpenTSDB与HBase版本不兼容:OpenTSDB 2.4.0官方适配的是HBase 1.x系列(比如1.2.x、1.4.x),如果你的集群用的是HBase 2.x,会出现严重的依赖冲突(HBase 2.x大量使用了shaded的Protobuf包,而OpenTSDB 2.4.0未适配)。
- 验证方式:执行
hbase version查看HBase版本,确认是否和OpenTSDB 2.4.0兼容。 - 解决:如果用的是HBase 2.x,建议降级到HBase 1.4.x,或者升级OpenTSDB到2.4.1+(部分版本对HBase 2.x做了有限适配)。
- 验证方式:执行
- Protobuf依赖包冲突/缺失:
- 检查OpenTSDB的
lib目录下的Protobuf版本(比如protobuf-java-*.jar),和HBase集群使用的Protobuf版本是否一致。如果不一致,会导致类加载冲突。 - 确认HBase的shaded Protobuf包(比如
hbase-shaded-protobuf-*.jar)是否被正确包含在OpenTSDB的类路径中。
- 检查OpenTSDB的
2. 确认启动方式的环境变量差异
你提到用build/tsdb tsd和service opentsdb start启动时行为不一致,这大概率是CLASSPATH环境变量不同导致的:
service opentsdb start可能使用系统默认的CLASSPATH,没有正确加载HBase的依赖包;而build/tsdb tsd可能加载了OpenTSDB自身lib目录的依赖,但仍可能存在缺失。- 验证方式:在两种启动方式下,分别执行
echo $CLASSPATH查看类路径,对比是否包含HBase的核心依赖(比如hbase-client.jar、hbase-common.jar、hbase-shaded-protobuf.jar等)。 - 解决:修改OpenTSDB的service启动脚本,确保CLASSPATH包含HBase的所有必要依赖包,或者在启动时通过
-cp参数指定完整的类路径。
3. 验证自动创建配置是否真的生效
即使你在配置文件中开启了三个自动创建参数,也需要确认配置是否被正确加载:
- 通过OpenTSDB的HTTP API查看当前生效配置:
检查返回结果中curl http://192.168.150.101:4243/api/configtsd.core.auto_create_metrics、tsd.core.auto_create_tagks、tsd.core.auto_create_tagvs是否均为true。 - 如果配置未生效,检查service启动时读取的配置文件路径是否正确(默认是
/etc/opentsdb/opentsdb.conf),确保你修改的是这个路径下的文件,或者在启动时通过--config参数指定配置文件路径。
4. 手动测试Metric UID创建
尝试手动创建Metric的UID,验证HBase交互是否正常:
# 进入OpenTSDB的build目录 cd /opt/opentsdb-2.4.0/build # 手动分配Metric UID ./tsdb uid assign metric test
- 如果这个命令报错,说明HBase交互确实存在问题,回到步骤1解决依赖/版本问题。
- 如果命令成功,再重新发送数据测试:
echo "put test 1548838714 1 tag1=1" | nc 192.168.150.101 4243
5. 检查HBase集群状态及表可用性
确保HBase集群正常运行,且OpenTSDB所需的表存在:
- 登录HBase Shell:
hbase shell - 查看表是否存在:
确认listtsdb和tsdb-uid表存在。 - 检查
tsdb-uid表是否正常:
如果表无法访问,说明HBase集群或ZooKeeper连接有问题,需要先解决HBase集群的可用性问题。count 'tsdb-uid'
总结来说,核心是先解决HBase的Protobuf类加载错误,这个是导致自动创建Metric失败的根源,后续再验证配置和启动环境的问题。
内容的提问来源于stack exchange,提问作者Veljko
相关产品推荐
相关产品推荐

