Hive:每当它触发一个map时,它会给我这个错误"无法从一个空字符串创建一个路径",我该怎么调试?

时间:2014-07-03 22:45:57

标签: hadoop hive

我正在使用hive 0.10以及当我

hive -e "show tables", hive -e "desc table_name" it works!

但是当我执行hive -e "select count(*) table_name之类的操作时,我会收到以下异常。有没有办法可以调试这个?相同的代码在之前的群集中使用较旧版本的配置单元,新群集正在抛出此错误。什么应该是调试此类问题的正确方法,没有从谷歌找到解决问题的任何内容。

    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.hive.ql.exec.Utilities.getHiveJobID(Utilities.java:382)
    at org.apache.hadoop.hive.ql.exec.Utilities.clearMapRedWork(Utilities.java:195)
    at org.apache.hadoop.hive.ql.exec.ExecDriver.execute(ExecDriver.java:472)
    at org.apache.hadoop.hive.ql.exec.MapRedTask.execute(MapRedTask.java:138)
    at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:138)
    at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:57)
    at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1352)
    at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1138)
    at org.apache.hadoop.hive.ql.Driver.run(Driver.java:951)
    at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)
    at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:412)
    at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:347)
    at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:706)
    at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:613)
    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:208)

失败:执行错误,从org.apache.hadoop.hive.ql.exec.MapRedTask返回代码1

3 个答案:

答案 0 :(得分:4)

我已经解决了这个问题。

我查找了日志文件,在我的例子中,该表是一个外部表,指的是位于hdfs上的目录。该目录包含超过300000个文件。因此,在读取文件时,它会抛出一个内存不足的异常,可能是因为它得到一个空字符串并抛出“无法从空字符串创建路径”异常。

我尝试使用较小的文件子集,但它确实有效。

Bottomline,造成此异常的一个可能原因是内存不足。

答案 1 :(得分:1)

我是我的情况,有一个hive属性设置

set hive.input.format = org.apache.hadoop.hive.ql.io.HiveInputFormat;在.hiverc文件中抛出异常。

此任务的诊断消息: 错误:java.lang.IllegalArgumentException:无法从空字符串创建路径         在org.apache.hadoop.fs.Path.checkPathArg(Path.java:131)         在org.apache.hadoop.fs.Path。(Path.java:139)         at org.apache.hadoop.hive.ql.io.HiveInputFormat $ HiveInputSplit.getPath(HiveInputFormat.java:110)         在org.apache.hadoop.mapred.MapTask.updateJobWithSplit(MapTask.java:463)         在org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:411)         在org.apache.hadoop.mapred.MapTask.run(MapTask.java:347)         在org.apache.hadoop.mapred.YarnChild $ 2.run(YarnChild.java:168)         at java.security.AccessController.doPrivileged(Native Method)         在javax.security.auth.Subject.doAs(Subject.java:415)         在org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1566)         在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:163)

将其更改为以下后,它可以正常工作 set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

答案 2 :(得分:1)

我遇到了同样的错误。我的hive.log文件显示了原因 - 请参阅下面代码段中的第一行,其中一个jar文件URI包含file://,没有任何路径:

2018-05-03 04:37:43,706 INFO  [main]: mr.ExecDriver (ExecDriver.java:execute(309)) - adding libjars: file://,file:///opt/cloudera/parcels/CDH/lib/hive/lib/hive-contrib.jar
2018-05-03 04:38:07,568 WARN  [main]: mapreduce.JobResourceUploader (JobResourceUploader.java:uploadFiles(64)) - Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this.
2018-05-03 04:38:07,599 ERROR [main]: exec.Task (SessionState.java:printError(937)) - Job Submission failed with exception 'java.lang.IllegalArgumentException(Can not create a Path from an empty string)'

就我而言,问题是由配置错误的$HIVE_HOME/conf/hive-env.sh文件引起的,其中HIVE_AUX_JARS_PATH包含对未设置的环境变量的引用。

例如:

export HIVE_AUX_JARS_PATH=$EMPTY_ENV_VARIABLE,/opt/cloudera/parcels/CDH/lib/hive/lib/hive-contrib.jar