Hive的--auxpath使用相对路径遇到的一个奇怪的异常
来源:互联网 发布:217淘宝站外平台哪个好 编辑:程序博客网 时间:2024/06/05 19:39
在使用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)
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
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());
pathString就是传进去的"file://abc.jar",由于我们只有两个"/"因此,从第二个"/"到结尾的字符串("abc.jar")都被当成了authority,path(内部的成员)则设置成了""而getName返回的就是path,因此也就为""了。
因此,如果使用Hive的--auxpath来设置jar,必须使用绝对路径,或者使用"file:///.abc.jar"这样的表示法。这个才是Hadoop的Path支持的方式。事实上,hadoop许多相关的Path的设置,都存在这个问题,所以在无法确定的情况下,就不要使用相对路径了。
0 0
- Hive的--auxpath使用相对路径遇到的一个奇怪的异常
- hive 使用lzo遇到的一个奇怪的问题
- hive --auxpath路径问题
- 遇到一个奇怪的现像
- 相对路径的使用
- 使用Android Killer时遇到的一个奇怪的问题
- 得到一个路径相对另一个路径的相对路径
- log4j 相对路径的使用
- 11.22 今天遇到一个奇怪的Warning
- 分析Hydrax遇到一个奇怪的问题
- 一个有点奇怪的异常处理问题
- hive使用遇到的问题
- 使用Hive遇到的错误
- 奇怪的ODBC异常
- Delphi的MDI编程中遇到的一个奇怪问题
- 我遇到的一个SQLITE的奇怪问题
- android gzip之后遇到的一个奇怪的问题
- SingleTask的Activity启动模式遇到的一个奇怪现象
- java多态的理解
- Hadoop常见问题及解决办法
- Hive安装配置详解
- cf 582A GCD Table
- Hive出现异常 FAILED: Error In Metadata: Java.Lang.RuntimeException: Unable To Instantiate Org.Apache.Had
- Hive的--auxpath使用相对路径遇到的一个奇怪的异常
- LoadRunner时提示“安装程序已确定挂起重新启动”解决方案
- LoadRunner小技巧集锦
- Loadrunner自带的网站WebTours打不开
- 软件工程之面向过程的软件设计方法(一)
- Mahout:DataModel doesn't have preference values
- MyEclipse Alt+/ 快捷键不可用设置
- 【bzoj4291】【PA2015】【Kieszonkowe】【贪心】
- No Java compiler available