用eclipse打包mapreduce程序 运行出现解析路径错误的诡异问题
mapreduce 打包成jar文件 在控制台运行 出现下面的错误并且指定的输入路径下的文件,运行程序之后,会自动没了
该程序在eclipse下可以正常运行
控制台命令: ./hadoop jar ~/kmean.jar com.xiaoming.mapreduce.Kmean hdfs://ubuntu:8020/user/hadoop/kmean/ out
12/02/23 10:24:19 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist:hdfs://ubuntu/user/hadoop/com.xiaoming.mapreduce.Kmean
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:224)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:241)
at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:885)
at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:779)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:432)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447)
at com.xiaoming.mapreduce.Kmean.main(Kmean.java:103)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
思考:1、一开始的时候就是怎么也想不通输入路径会被解析成那样,后来还以为自己的运行命令记错了,上网查了之后发现绝对没问题。
2、后来通过测试不同的路径也尝试了很多次,发现解析路径错位了,本来还以为是我的hadoop 下的bin目录里面的sh文件出问题了,
然后也拷贝了师姐的bin目录,发现还是那样,所以确定自己的hadoop没问题。
3、再后来我就在hadoop台湾论坛上留言了,jazz晚上就给我回了,叫我检查程序,后来也还是没有发现问题。
后来发现问题的根本原因:
在用eclipse 打jar包的过程中,其中有一步需要你选择自己的主类,切记这个一定不能选。因为在运行mapreduce程序的终端用
命令:./hadoop jar jar包的路径 主类名 输入路径目录 输出结果目录
运行上面命令的时候,在jar包后面指定了主类名,如果你在打包的时候设置了主类,那么这个时候它就会把终端你输入的主类解析名,
因而出现上面的错误。
我建议大家在打mapreduce程序jar包的时候,还是不要设置默认的主类,因为使用hadoop jar运行的时候会指定主类名。