运行 ExportSnapshot 时抛出 ClassNotFoundException
ClassNotFoundException is thrown when running ExportSnapshot
当我尝试从我的 HBase 主节点 运行 ExportSnapshot 时,我遇到了令人困惑的 ClassNotFoundException。 hbase shell
和其他命令工作正常,我的集群完全正常运行。
这感觉像是类路径问题,但我不知道我遗漏了什么。
$ /usr/bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ambarismoketest-snapshot -copy-to hdfs://10.0.1.90/apps/hbase/data -mappers 16
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/zookeeper/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2015-10-13 20:05:02,339 INFO [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
2015-10-13 20:05:04,351 INFO [main] util.FSVisitor: No logs under directory:hdfs://cinco-de-nameservice/apps/hbase/data/.hbase-snapshot/impression_event_production_hbase-transfer-to-staging-20151013/WALs
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/Job
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.runCopyJob(ExportSnapshot.java:529)
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.run(ExportSnapshot.java:646)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.innerMain(ExportSnapshot.java:697)
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.main(ExportSnapshot.java:701)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.Job
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 5 more
问题
事实证明这是因为 mapreduce2 JAR 在类路径中不可用。类路径已正确设置,但我没有在该节点上安装 mapreduce2 客户端。 HBase 的 ExportSnapshot 在将快照导出到另一个集群时显然依赖于那些客户端 JAR,因为它写入 HDFS。
修复
如果你使用 Ambari:
- 加载 Ambari UI
- 拉起你所在的节点运行 ExportSnapshot 来自并得到上述错误
- 在 "components" 下,单击 "Add"
- 点击"Mapreduce 2 client"
背景
这里有一张票 https://issues.apache.org/jira/browse/HBASE-9687,标题是 ClassNotFoundException is thrown when ExportSnapshot runs against hadoop cluster where HBase is not installed on the same node as resourcemanager
。标题暗示安装资源管理器是解决方法,这可能有效;然而,关键是你需要类路径中的 hadoop mapreduce2 jar,你可以通过简单地安装 mapreduce2 客户端来做到这一点。
对于我们来说,具体来说,我们的快照导出有一天工作正常而第二天就坏了的原因是我们的 HBase master 打开了我们 b/c 我们遇到的另一个问题。我们的备份 HBase 主机没有 mapreduce2 客户端 JAR,但原始主主机有。
当我尝试从我的 HBase 主节点 运行 ExportSnapshot 时,我遇到了令人困惑的 ClassNotFoundException。 hbase shell
和其他命令工作正常,我的集群完全正常运行。
这感觉像是类路径问题,但我不知道我遗漏了什么。
$ /usr/bin/hbase org.apache.hadoop.hbase.snapshot.ExportSnapshot -snapshot ambarismoketest-snapshot -copy-to hdfs://10.0.1.90/apps/hbase/data -mappers 16
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/lib/hadoop/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/zookeeper/lib/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
2015-10-13 20:05:02,339 INFO [main] Configuration.deprecation: hadoop.native.lib is deprecated. Instead, use io.native.lib.available
2015-10-13 20:05:04,351 INFO [main] util.FSVisitor: No logs under directory:hdfs://cinco-de-nameservice/apps/hbase/data/.hbase-snapshot/impression_event_production_hbase-transfer-to-staging-20151013/WALs
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/mapreduce/Job
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.runCopyJob(ExportSnapshot.java:529)
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.run(ExportSnapshot.java:646)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.innerMain(ExportSnapshot.java:697)
at org.apache.hadoop.hbase.snapshot.ExportSnapshot.main(ExportSnapshot.java:701)
Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.mapreduce.Job
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
... 5 more
问题
事实证明这是因为 mapreduce2 JAR 在类路径中不可用。类路径已正确设置,但我没有在该节点上安装 mapreduce2 客户端。 HBase 的 ExportSnapshot 在将快照导出到另一个集群时显然依赖于那些客户端 JAR,因为它写入 HDFS。
修复
如果你使用 Ambari:
- 加载 Ambari UI
- 拉起你所在的节点运行 ExportSnapshot 来自并得到上述错误
- 在 "components" 下,单击 "Add"
- 点击"Mapreduce 2 client"
背景
这里有一张票 https://issues.apache.org/jira/browse/HBASE-9687,标题是 ClassNotFoundException is thrown when ExportSnapshot runs against hadoop cluster where HBase is not installed on the same node as resourcemanager
。标题暗示安装资源管理器是解决方法,这可能有效;然而,关键是你需要类路径中的 hadoop mapreduce2 jar,你可以通过简单地安装 mapreduce2 客户端来做到这一点。
对于我们来说,具体来说,我们的快照导出有一天工作正常而第二天就坏了的原因是我们的 HBase master 打开了我们 b/c 我们遇到的另一个问题。我们的备份 HBase 主机没有 mapreduce2 客户端 JAR,但原始主主机有。