我有一个连接到HBASE的map reduce作业,我无法弄清楚我遇到这个错误的位置:
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.hadoop.util.RunJar.main(RunJar.java:212)
Caused by: java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: rsrc:hbase-common-0.98.1-hadoop2.jar
at org.apache.hadoop.fs.Path.initialize(Path.java:206)
at org.apache.hadoop.fs.Path.<init>(Path.java:172)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.findOrCreateJar(TableMapReduceUtil.java:703)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addDependencyJars(TableMapReduceUtil.java:656)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addHBaseDependencyJars(TableMapReduceUtil.java:573)
at org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.addDependencyJars(TableMapReduceUtil.java:617)
at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:398)
at org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.configureIncrementalLoad(HFileOutputFormat2.java:356)
at com.ancestry.bigtree.hfile.JsonToHFileDriver.run(JsonToHFileDriver.java:117)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
at com.ancestry.bigtree.hfile.JsonToHFileDriver.main(JsonToHFileDriver.java:69)
... 10 more
Caused by: java.net.URISyntaxException: Relative path in absolute URI: rsrc:hbase-common-0.98.1-hadoop2.jar
at java.net.URI.checkPath(URI.java:1804)
at java.net.URI.<init>(URI.java:752)
at org.apache.hadoop.fs.Path.initialize(Path.java:203)
如果我没有Hbase库,那么该作业运行正常。生成的相对路径在哪里?如何强制生成的路径是绝对的?
在我的代码中,我有以下两行:
TableMapReduceUtil.addHBaseDependencyJars(CONF); HFileOutputFormat2.configureIncrementalLoad(job,htable);
如果我删除它们我很好但是这项工作没有按照我的需要去做。我最终尝试创建HFILE以与hbase bulkloader一起使用。
环境: HBase 0.96.1.2.0.10.0-1-hadoop2 Hadoop 2.2.0.2.0.10.0-1
提前感谢您的任何帮助或指示。
答案 0 :(得分:18)
例外有点误导;没有真正的相对路径被解析,这里的问题是Hadoop&#34; Path&#34;不支持&#39;:&#39;在文件名中。在你的情况下,&#34; rsrc:hbase-common-0.98.1-hadoop2.jar&#34;被解释为&#34; rsrc&#34;作为&#34;方案&#34;,而我怀疑你真的打算添加资源文件:/// path / to / your / jarfile / rsrc:hbase-common-0.98.1-hadoop2.jar&#34; 。这是一个讨论非法角色的旧JIRA:
https://issues.apache.org/jira/browse/HADOOP-3257
请注意,您可能无法使用该绝对路径,因为它仍然具有&#39;:&#39;在文件名中。您可以尝试转义文件名,例如&#34; rsrc%3Ahbase-common-0.98.1-hadoop2.jar&#34;,但是在使用它的另一端可能无法正确找到它。
解决这个问题的最佳方法是解决&rs; hbase-common-0.98.1-hadoop2.jar&#34;正在介绍 - 使用Eclipse构建可运行的jar是问题的一个可能原因。如果可能的话,尝试使用Eclipse之外的其他东西来构建你的jar,看看是否出现同样的问题;您也可以尝试选择&#34;将所需的包打包到生成的jar&#34;在Eclipse中创建jar时。
如果uber-jar结尾太大,您还可以尝试将原始依赖项jar(如hbase-common-0.98.1-hadoop2.jar)放入所有节点的类路径以及您可能需要的任何其他依赖项,然后跳过调用&#34; TableMapReduceUtil.addHBaseDependencyJars(conf);&#34;。
这是另一个用户遇到类似问题的旧帖子: