本地Hive执行Group By/Join查询报错:提示Jar文件不存在(文件实际存在)
我之前也碰到过一模一样的情况——简单查询都正常,一涉及聚合或关联就报文件不存在,但实际文件明明在。这类问题基本都和MapReduce任务的临时目录配置/权限有关,毕竟普通SELECT/INSERT可能直接走本地读取或轻量执行,而GROUP BY、JOIN这类操作会触发完整的MapReduce作业,对路径的要求完全不同。下面是一步步的排查和解决方法:
1. 先确认Hive的执行模式
首先看看你的Hive是不是开启了本地模式:在Hive CLI里执行
set hive.exec.mode.local.auto;
如果返回true,说明本地模式下MapReduce会在你的主机上运行,但临时目录配置可能有问题;如果是false,则是分布式模式,要重点检查HDFS上的临时目录。
2. 检查HDFS临时目录的存在与权限
Hive默认会把MapReduce的临时文件存在HDFS的/tmp/hive目录下,先确认这个目录是否存在:
hdfs dfs -ls /tmp
如果找不到hive目录,先创建它:
hdfs dfs -mkdir /tmp/hive
然后给它设置足够的权限(确保当前用户有读写权限,一般设置粘滞位防止误删):
hdfs dfs -chmod 1777 /tmp/hive
3. 检查Hive临时目录的配置
重点看你的bashrc或者Hive-site.xml里的临时目录配置:
- 如果bashrc里有
export HIVE_TMP_DIR,看看是不是指向了本地路径(比如/home/xxx/hive_tmp)。如果是,那问题就出在这!MapReduce任务会去集群节点的本地找这个目录,但你的文件只在localhost的本地,自然找不到。 - 把这个配置改成HDFS路径,比如:
export HIVE_TMP_DIR=/tmp/hive
修改后记得执行source ~/.bashrc让配置生效,然后重启Hive CLI。
4. 检查MapReduce的临时目录
MapReduce自身的临时目录默认是/tmp/hadoop-yarn,同样检查它的存在和权限:
hdfs dfs -ls /tmp/hadoop-yarn
如果不存在就创建,权限同样设置为1777。
5. 查看详细日志定位问题
如果上面的步骤都没解决,就去看Hive的日志或者MapReduce的任务日志,找到报错里具体缺失的文件路径——如果是本地路径,那肯定是临时目录配置成了本地;如果是HDFS路径,就检查该路径的权限和是否真的存在。
按照这个流程排查下来,基本都能解决问题,我当时就是把本地临时目录改成HDFS路径后就正常了。
内容的提问来源于stack exchange,提问作者Kumar Harsh

