mapreduce执行程序HDFS路径找不到

因为mapreduce执行程序的数据输入路径是在HDFS路径下,而这个路径下的数据是我shell远程执行hive查询语句获得,但是mapreduce程序读取不到,可是我java端的DFS location就是连接HDFS里面有这个文件夹和数据,请问怎么办? mapreduce中文件路径是这样设置的:  FileInputFormat.addInputPath(job, new Path("hdfs://192.168.100.223:9000/home/hadoop/test/000000_0"));     运行报错信息如下: 17/07/27 09:49:05 INFO Configuration.deprecation: session.id is deprecated. Instead, use dfs.metrics.session-id 17/07/27 09:49:05 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 17/07/27 09:49:06 WARN mapreduce.JobResourceUploader: Hadoop command-line option parsing not performed. Implement the Tool interface and execute your application with ToolRunner to remedy this. 17/07/27 09:49:06 INFO mapreduce.JobSubmitter: Cleaning up the staging area file:/home/hadoop/temp/mapred/staging/hadoop1319276731/.staging/job_local1319276731_0001 Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://192.168.100.223:9000/home/hadoop/test/000000_0     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:323)     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:265)     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:387)     at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:301)     at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:318)     at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:196)     at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290)     at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287)     at java.security.AccessController.doPrivileged(Native Method)     at javax.security.auth.Subject.doAs(Subject.java:415)     at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)     at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287)     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308)     at com.easeye.adtarget.cloud.trafficStatis.hadoop.Test.main(Test.java:48)   可是我用hadoop用户查看HDFS目录文件,有这个test文件,但是却不能获取或者打开;我直接用root用户在hive里面输入导出命令导出的数据也是root用户的权限,却可以在hadoop中找到并查看!很奇怪,唯一的不同只是我远程使用shell脚本执行了hive查询和导出数据而已!不明白为什么一个可以找到,一个不能找到,查询和导出命令是一样的。 shell脚本代码为:
#!/bin/bash

storedir=$1
tablename=$2
date_name=$3
date_startval=$4
date_endval=$5
zoneid_name=$6
zoneid_val=$7


cd /usr/local/hadoop/hive-2.1.1-bin/bin

echo "insert overwrite directory '${storedir}' row format delimited fields terminated by '\t' select * from ${tablename} where ${date_name}>='${date_startval}' and ${date_name}<='${date_endval}' and ${zoneid_name} in (${zoneid_val});"




echo " insert overwrite directory '${storedir}' row format delimited fields terminated by '\t' select * from ${tablename} where ${date_name}>='${date_startval}' and ${date_name}<='${date_endval}' and ${zoneid_name}  in (${zoneid_val});" | /usr/local/hadoop/hive-2.1.1-bin/bin/hive 
 
1cc.jpg 3cc.jpg

fish - Hadooper

赞同来自:

在你提交任务的环境中,执行hadoop fs -ls /home/hadoop/test/000000_0,能看到你的文件么? 或者,在代码中,执行下conf.get("fs.defaultFS"),看下获取到的是什么?

fish - Hadooper

赞同来自:

在main方法中执行conf.get("fs.defaultFS")看下配置是否正确,你的eclipse环境中的hadoop配置文件(hdfs-site.xml、mapred-site.xml、core-site.xml)是不是都配好了?

fish - Hadooper

赞同来自:

如果是远程执行脚本时出错,可以在脚本中,加上hadoop classpath命令,确认下在脚本执行时,classpath是否是正确的(即,这个classpath中需要包含正确的core-site.xml等文件所在的目录)。   为了验证是否是配置的问题,可以main中做个简单测试,提交job之前,conf.set("fs.defaultFS", "xxx") 把这个配置项硬编码成正确的串。

fish - Hadooper

赞同来自:

你在自己的Linux机器上,su到root账号,然后 hdfs dfs -ls /home/hadoop/test能看到东西么?  
1.png
shell为linux的root账户执行,因为你的Hadoop应该使用的simple方式的安全机制,所以生成的路径为root所有权。而在Linux的hadoop账号下,试图访问root创建的hdfs目录,不知是否会有问题?

jane3von

赞同来自:

Linux的hadoop用户,不能访问root创建的hdfs目录;但是,root用户下也不能访问root创建的hdfs目录? 如何修改HDFS目录的权限,是的hadoop用户可以访问别的用户的hdfs目录?

fish - Hadooper

赞同来自:

hdfs的默认配置中dfs.permissions.superusergroup,配置了超级用户组的名字,默认配置为supergroup。凡是属于该组内的用户,都被hadoop视为超级用户。这跟Linux视root为超级用户是不一样的。   当hadoop的认证方式定义为simple的时候,一个用户具体属于哪个组,由namenode所在的Linux系统决定。所以在namenode所在linux机器上,执行下命令 id root,能看到root用户属于什么组。默认情况下,root属于root组,Hadoop不会将root组中的用户看做超级用户(因为dfs.permissions.superusergroup配的不是root)。

fish - Hadooper

赞同来自:

root不是supergroup。Hadoop 的dfs.permissions.superusergroup默认为“supergroup”,所以,你可以在namenode的Linux机器中,创建hadoop用户,然后创建一个叫supergroup的组(就是Linux中的“组”),将hadoop用户归到这个supergroup下。   具体原理可以参考: https://ymgd.github.io/codereader/2016/10/15/Hadoop%E8%AE%A4%E8%AF%81%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/  

要回复问题请先登录注册