玉女心经HBase——启动HBase报错“java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder”问题的解决

转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/86508330
本文出自【我是干勾鱼的博客

Ingredients:

Language

先说明一下,这个错误及后面的解决办法与HBase的版本有关,能够看出来,HBase对版本的要求还是非常苛刻的,这在HBase官网中对Hadoop版本的要求中就能够看出来。

1 问题1:java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder

1.1 错误

安装HBase官网Apache HBase ™ Reference Guide搭建HBase的时候,正常启动:

[root@shizhi002 hbase-2.1.2]# ./bin/start-hbase.sh 
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop/hadoop-2.9.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hbase/hbase-2.1.2/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
running master, logging to /opt/hbase/hbase-2.1.2/bin/../logs/hbase-root-master-shizhi002.out
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/opt/hadoop/hadoop-2.9.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/opt/hbase/hbase-2.1.2/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

没有任何启动成功的反应,查看日志:

tail -f logs/hbase-root-master-shizhi002.log

发现启动过程报错:

java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
	at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
	at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
	at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
	at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
	at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
	at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
	at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
	at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
	at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
	at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
	at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:697)
	at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:606)
	at org.apache.hadoop.hbase.master.HMaster.<init>(HMaster.java:489)
	at org.apache.hadoop.hbase.master.HMasterCommandLine$LocalHMaster.<init>(HMasterCommandLine.java:308)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.hadoop.hbase.util.JVMClusterUtil.createMasterThread(JVMClusterUtil.java:132)
	at org.apache.hadoop.hbase.LocalHBaseCluster.addMaster(LocalHBaseCluster.java:227)
	at org.apache.hadoop.hbase.LocalHBaseCluster.<init>(LocalHBaseCluster.java:174)
	at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:229)
	at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
	at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:3103)
Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 28 more
2019-01-16 15:06:08,129 ERROR [main] master.HMasterCommandLine: Master exiting
java.lang.RuntimeException: Failed construction of Master: class org.apache.hadoop.hbase.master.HMasterCommandLine$LocalHMasterorg.apache.htrace.SamplerBuilder
	at org.apache.hadoop.hbase.util.JVMClusterUtil.createMasterThread(JVMClusterUtil.java:137)
	at org.apache.hadoop.hbase.LocalHBaseCluster.addMaster(LocalHBaseCluster.java:227)
	at org.apache.hadoop.hbase.LocalHBaseCluster.<init>(LocalHBaseCluster.java:174)
	at org.apache.hadoop.hbase.master.HMasterCommandLine.startMaster(HMasterCommandLine.java:229)
	at org.apache.hadoop.hbase.master.HMasterCommandLine.run(HMasterCommandLine.java:140)
	at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
	at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
	at org.apache.hadoop.hbase.master.HMaster.main(HMaster.java:3103)
Caused by: java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
	at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
	at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
	at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
	at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
	at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
	at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
	at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
	at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
	at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
	at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
	at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
	at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
	at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:697)
	at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:606)
	at org.apache.hadoop.hbase.master.HMaster.<init>(HMaster.java:489)
	at org.apache.hadoop.hbase.master.HMasterCommandLine$LocalHMaster.<init>(HMasterCommandLine.java:308)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.apache.hadoop.hbase.util.JVMClusterUtil.createMasterThread(JVMClusterUtil.java:132)
	... 7 more
Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:338)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	... 28 more

1.2 解决

按照网上的一些办法,可以解决。

复制文件:

[root@shizhi002 hbase-2.1.2]# cp ./lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar ./lib/

原来的错误解决了,又遇到了新的错误:

2 错误2:java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper

2.1 错误

2019-01-16 15:26:44,501 ERROR [RS_OPEN_META-regionserver/shizhi002:16020-0] handler.OpenRegionHandler: Failed open of region=hbase:meta,,1.1588230740
java.lang.NoClassDefFoundError: Could not initialize class org.apache.hadoop.hbase.io.asyncfs.FanOutOneBlockAsyncDFSOutputHelper
	at org.apache.hadoop.hbase.io.asyncfs.AsyncFSOutputHelper.createOutput(AsyncFSOutputHelper.java:51)
	at org.apache.hadoop.hbase.regionserver.wal.AsyncProtobufLogWriter.initOutput(AsyncProtobufLogWriter.java:167)
	at org.apache.hadoop.hbase.regionserver.wal.AbstractProtobufLogWriter.init(AbstractProtobufLogWriter.java:166)
	at org.apache.hadoop.hbase.wal.AsyncFSWALProvider.createAsyncWriter(AsyncFSWALProvider.java:113)
	at org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.createWriterInstance(AsyncFSWAL.java:612)
	at org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.createWriterInstance(AsyncFSWAL.java:124)
	at org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.rollWriter(AbstractFSWAL.java:756)
	at org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.rollWriter(AbstractFSWAL.java:486)
	at org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.<init>(AsyncFSWAL.java:251)
	at org.apache.hadoop.hbase.wal.AsyncFSWALProvider.createWAL(AsyncFSWALProvider.java:73)
	at org.apache.hadoop.hbase.wal.AsyncFSWALProvider.createWAL(AsyncFSWALProvider.java:48)
	at org.apache.hadoop.hbase.wal.AbstractFSWALProvider.getWAL(AbstractFSWALProvider.java:152)
	at org.apache.hadoop.hbase.wal.AbstractFSWALProvider.getWAL(AbstractFSWALProvider.java:60)
	at org.apache.hadoop.hbase.wal.WALFactory.getWAL(WALFactory.java:284)
	at org.apache.hadoop.hbase.regionserver.HRegionServer.getWAL(HRegionServer.java:2104)
	at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.openRegion(OpenRegionHandler.java:284)
	at org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.process(OpenRegionHandler.java:108)
	at org.apache.hadoop.hbase.executor.EventHandler.run(EventHandler.java:104)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

2.2 解决

参考了:

RegionServer因无法初始化对HDFS的访问而中止

HBase 2.0.1 with Hadoop 2.8.4 causes NoSuchMethodException

第2篇文章就提到了:

<property> 
<name>hbase.wal.provider</name> 
<value>filesystem</value> 
</property> 

Seems to fix it, but would be nice to actually try the fanout wal with 
hadoop 2.8.4. 

按照说明修改一下,编辑配置文件:

vi conf/hbase-site.xml

加入内容:

<property>
                <name>hbase.wal.provider</name>
                <value>filesystem</value>
 </property>

再次启动log中就不报错了。

3 参考

HBase官网中对Hadoop版本的要求

启动hbase报java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder

启动HBase2.1.0报错Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder

RegionServer因无法初始化对HDFS的访问而中止

HBase 2.0.1 with Hadoop 2.8.4 causes NoSuchMethodException

### 回答1: 这个错误是因为Spark无法找到HBase的配置文件。可能是因为HBase的依赖库没有正确地添加到Spark的classpath中。您需要确保在Spark的classpath中包含了HBase的依赖库,或者将HBase的依赖库添加到Spark的lib目录中。 ### 回答2: 在使用Spark读取HBase的时候,如果出现“java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”的报错,一般是由于缺少了HBase依赖包或者版本不匹配导致的。 解决方法如下: 1. 确认HBase依赖包是否存在,以及是否与Spark版本兼容。 可以通过以下两种方式解决: ① 直接将HBase的依赖包复制到Spark的lib目录中。具体操作:将HBasehbase-client-xxx.jar和hbase-common-xxx.jar复制到Spark的安装目录下的lib目录即可。 ② 修改Spark的pom.xml文件,添加HBase的依赖。具体操作:在Spark源码根目录中的pom.xml文件中添加以下代码: <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>x.x.x</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-common</artifactId> <version>x.x.x</version> </dependency> 注意:x.x.x表示HBase的版本号,需要根据实际情况替换。 2. 确认HBase配置文件是否正确。 如果上述方法解决不了问题,可能是HBase的配置文件不正确导致的。请确认HBasehbase-site.xml文件中是否有以下配置项: <property> <name>hbase.client.keyvalue.maxsize</name> <value>2097152</value> </property> 如果没有,请手动添加并重启HBase服务。 3. 确认系统环境变量是否正确。 如果上述方法都没有解决问题,可以检查系统的环境变量是否正确。请确认系统的HADOOP_CLASSPATH、JAVA_HOME、HBASE_HOME和SPARK_HOME环境变量是否正确设置,以及是否包含了HBase和Spark的相关依赖。 综上所述,出现“java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration”报错,在排查的过程中需要关注HBase依赖包、配置文件和系统环境等多方面的原因。需要进行彻底的排查才能找到问题的症结并解决问题。 ### 回答3: 在 Spark 中读取 HBase 时,可能会出现“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”这个错误。这是因为在 Spark 中没有找到一些必需的 HBase 的类文件,导致无法成功读取 HBase 数据。 解决问题的步骤如下: 第一步:检查 Classpath 环境变量 请确保 Classpath 环境变量中包含 HBase 和 Hadoop 的 JAR 文件的路径。因为这两个框架的配置文件都被加载到这些 JAR 文件中,如果 Spark 找不到它们,就会导致错误。 如果 Classpath 设置正确,那么需要检查 Spark 主节点的 Spark 配置中是否包含 HBase 和 Hadoop 的 JAR 文件。 这可以通过将 HBase 和 Hadoop JAR 文件置于 Spark 的 lib 目录中来实现。可以使用以下命令检查 SPARK_HOME/lib 目录中是否存在 HBase 和 Hadoop 的 JAR 文件: $ ls $SPARK_HOME/lib | grep -i hbase $ ls $SPARK_HOME/lib | grep -i hadoop 第二步:检查 HBASE_CLASSPATH 环境变量 如果在环境变量中将 HBASE_CLASSPATH 设置为包含配置文件的路径,那么 Spark 可能不会找到它们。 要更正此错误,请确保在 Shell 中运行 HBase 脚本时也加载了这些配置文件。可以通过将 HBase 目录添加到 HBASE_CLASSPATH 环境变量中来实现,例如: $ export HBASE_CLASSPATH=$HBASE_HOME/conf 第三步:操作系统权限问题 还有可能出现因操作系统权限不足而导致无法读取 HBase 数据的情况。此时,可以修改文件的权限以解决问题。可以使用以下命令检查当前目录下的权限: $ ls -ld $PWD 如果权限不正确,可以使用以下命令更正: $ chmod 777 $PWD 总之,如果 Spark 在从 HBase 读取数据时遇到“ java.lang.noclassdeffounderror: org/apache/hadoop/hbase/hbaseconfiguration ”错误,需要按照上述步骤检查并修复问题,以确保 Spark 可以顺利地从 HBase 读取数据。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值