Hive的--auxpath使用相对路径遇到的一个奇怪的异常
2015-10-04 08:55
666 查看
在使用Hive的--auxpath过程中,如果我使用的是相对路径(例如,--auxpath=abc.jar),会产生下面的一个异常:
java.lang.IllegalArgumentException: Can not create a Path from an empty string
at org.apache.hadoop.fs.Path.checkPathArg(Path.java:91)
at org.apache.hadoop.fs.Path.<init>(Path.java:99)
at org.apache.hadoop.fs.Path.<init>(Path.java:58)
at org.apache.hadoop.mapred.JobClient.copyRemoteFiles(JobClient.java:619)
at org.apache.hadoop.mapred.JobClient.copyAndConfigureFiles(JobClient.java:724)
at org.apache.hadoop.mapred.JobClient.copyAndConfigureFiles(JobClient.java:648)
从异常的内容来看,是由于使用了一个空字符串来创建一个Path对象。
经过分析发现,使用"--auxpath=abc.jar"来启动Hive时,Hive会自动在abc.jar前面补上"file://"。也就是说Hive最后使用的路径是"file://abc.jar"。
当我们使用"file://abc.jar"来生成一个Path时,调用这个Path的getName将会返回""(空字符串)。而Hive在提交MapReduce的Job时,会使用getName来获取文件名,并创建一个新的Path对象。下面的示例代码演示了一下这个过程,会抛出上文提到的异常(Hadoop的代码本身比较复杂,有兴趣看源码的可以点这里)。
上文的代码输出
path name:
authority:abc.jar
并抛出了异常"Can not create a Path from an empty string"
那么为什么"file://abc.jar"生成的Path的getName返回的是""而不是"abc.jar"呢,而且"abc.jar"却成了authority?在Path中的处理代码如下:
pathString就是传进去的"file://abc.jar",由于我们只有两个"/"因此,从第二个"/"到结尾的字符串("abc.jar")都被当成了authority,path(内部的成员)则设置成了""而getName返回的就是path,因此也就为""了。
因此,如果使用Hive的--auxpath来设置jar,必须使用绝对路径,或者使用"file:///.abc.jar"这样的表示法。这个才是Hadoop的Path支持的方式。事实上,hadoop许多相关的Path的设置,都存在这个问题,所以在无法确定的情况下,就不要使用相对路径了。
java.lang.IllegalArgumentException: Can not create a Path from an empty string
at org.apache.hadoop.fs.Path.checkPathArg(Path.java:91)
at org.apache.hadoop.fs.Path.<init>(Path.java:99)
at org.apache.hadoop.fs.Path.<init>(Path.java:58)
at org.apache.hadoop.mapred.JobClient.copyRemoteFiles(JobClient.java:619)
at org.apache.hadoop.mapred.JobClient.copyAndConfigureFiles(JobClient.java:724)
at org.apache.hadoop.mapred.JobClient.copyAndConfigureFiles(JobClient.java:648)
从异常的内容来看,是由于使用了一个空字符串来创建一个Path对象。
经过分析发现,使用"--auxpath=abc.jar"来启动Hive时,Hive会自动在abc.jar前面补上"file://"。也就是说Hive最后使用的路径是"file://abc.jar"。
当我们使用"file://abc.jar"来生成一个Path时,调用这个Path的getName将会返回""(空字符串)。而Hive在提交MapReduce的Job时,会使用getName来获取文件名,并创建一个新的Path对象。下面的示例代码演示了一下这个过程,会抛出上文提到的异常(Hadoop的代码本身比较复杂,有兴趣看源码的可以点这里)。
1 | Path path = new Path( "file://abc.jar" ); |
2 | System.out.println( "path name:" + path.getName()); |
3 | System.out.println( "authority:" + path.toUri().getAuthority()); |
4 | Path newPath = new Path(path.getName()); |
path name:
authority:abc.jar
并抛出了异常"Can not create a Path from an empty string"
那么为什么"file://abc.jar"生成的Path的getName返回的是""而不是"abc.jar"呢,而且"abc.jar"却成了authority?在Path中的处理代码如下:
01 | if (pathString.startsWith( "//" , start) && |
02 | (pathString.length()-start > 2 )) // has authority |
03 | int nextSlash = pathString.indexOf( '/' , start+ 2 ); |
04 | int authEnd = nextSlash > 0 ? nextSlash : pathString.length(); |
05 | authority = pathString.substring(start+ 2 , authEnd); |
06 | start = authEnd; |
07 | } |
08 |
09 | // uri path is the rest of the string -- query & fragment not supported |
10 | String path = pathString.substring(start, pathString.length()); |
因此,如果使用Hive的--auxpath来设置jar,必须使用绝对路径,或者使用"file:///.abc.jar"这样的表示法。这个才是Hadoop的Path支持的方式。事实上,hadoop许多相关的Path的设置,都存在这个问题,所以在无法确定的情况下,就不要使用相对路径了。
相关文章推荐
- Hive出现异常 FAILED: Error In Metadata: Java.Lang.RuntimeException: Unable To Instantiate Org.Apache.Had
- 闪讯利用openwrt路由器拨号教程(一)
- java多态的理解
- Hive安装配置详解
- Hadoop常见问题及解决办法
- HDU 5495 LCS
- Hadoop 报错be replicated to 0 nodes, instead of 1
- Hadoop name -format后Incompatible namespaceIDS 错误解决办法
- 【PA2015】【BZOJ4291】Kieszonkowe
- Hadoop Failed to set permissions of path
- HMaster启动后自动关闭
- Failed to set permissions of path:\tmp\hadoop-yth\mapred\staging\yth-2036315919\.staging to 0700
- Failed to list databases
- 【bzoj1801】【AHOI2009】【chess中国象棋】【组合数学】
- FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.解决办法
- FAILED: Error in metadata: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.
- Error loading: \Java\jdk1.6.0_35\jre\bin\server\jvm.dll
- Could not buffer record
- CentOS Linux解决Device eth0 does not seem to be present
- Caused by: java.lang.IllegalArgumentException: java.net.UnknownHostException: testcluster