Hadoop运行Grep示例报错:输入路径不存在问题求助
解决Hadoop Grep作业提示临时输入路径不存在的问题
嘿,我帮你捋捋这个奇怪的问题——你明明指定了正确的输入路径/user/hadoop/input,结果作业却在找/user/root/grep-temp-xxxx这个临时路径,这明显是跑偏了嘛。我整理了几个可能的原因和对应的解决办法,你可以试试:
为啥会出现这问题?
- 临时目录未初始化:Hadoop运行MapReduce作业时会自动创建临时目录,默认会使用当前执行命令的用户(你现在是root)的HDFS个人目录。如果
/user/root这个目录根本不存在,或者root没有权限在HDFS上创建目录,自然就会报错。 - 用户身份不匹配:你检查的是
/user/hadoop/input的状态,但当前用root用户执行作业,Hadoop会默认以root身份操作HDFS,可root的HDFS个人目录可能压根没创建过。
怎么解决?
1. 给root用户创建HDFS个人目录
先执行这两条命令,创建并设置好root的HDFS主目录权限:
./bin/hdfs dfs -mkdir -p /user/root ./bin/hdfs dfs -chown root:root /user/root
完成后再重新运行你的Grep作业试试。
2. 手动指定作业临时目录
要是不想用root的默认目录,你可以在运行作业时直接指定临时目录到hadoop用户的目录下,比如:
./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep -Dmapreduce.job.temp.dir=/user/hadoop/temp /user/hadoop/input /user/hadoop/output 'dfs[a-z.]+'
记得提前建好这个临时目录并开放权限:
./bin/hdfs dfs -mkdir -p /user/hadoop/temp ./bin/hdfs dfs -chmod 777 /user/hadoop/temp
3. 切换到hadoop用户执行作业
既然你的输入目录是/user/hadoop/input,干脆切换到hadoop用户去执行命令,这样用户身份和HDFS目录匹配,就不会有乱七八糟的权限问题了:
su - hadoop # 然后再运行你的Grep命令 ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep /user/hadoop/input /user/hadoop/output 'dfs[a-z.]+'
小提醒哦
每次运行作业前,最好先检查下输出目录/user/hadoop/output是否存在,如果存在的话Hadoop会直接报错,所以可以先删掉:
./bin/hdfs dfs -rm -r /user/hadoop/output
内容的提问来源于stack exchange,提问作者Achan Zhong
相关产品推荐
相关产品推荐

