我必须访问hadoop文件系统中的几个文件,例如/user//data/somefile.txt我不知道如何访问这些文件。我有一个如下所示的代码,但这不起作用。所以我尝试了"hdfs://user/....","hdfs://localhost:50070/user/..."或者以某种方式使用URI(尽管我真的不知道这是怎么回事)
为我提供了用于此任务的hadoop 1.2.1版本,我正在虚拟机和eclipse中使用ubuntu(没有hadoop插件)。我以前从未使用过hadoop,所以如果你能帮助我就太好了。
JobConf conf = new JobConf(TotalWordCount.class);
conf.setJobName("wordcount");
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
conf.setMapperClass(Map.class);
conf.setCombinerClass(Reduce.class);
conf.setReducerClass(Reduce.class);
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
FileInputFormat.setInputPaths(conf, new Path("/user/.../data/textfile.txt"));
FileOutputFormat.setOutputPath(conf, new Path("/user/.../output"));
LineProcessor.initializeStopWords();
JobClient.runJob(conf);
运行上面的代码,我得到一个类似这样的错误:
ERROR security.UserGroupInformation: PriviledgedActionException as:ds2013 cause:org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/user/.../data/textfile.txt
Exception in thread "main" org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: file:/user/.../data/textfile.txt
我也试过类似的东西
DistributedCache.addCacheFile((new Path("/user/.../data/textfile.txt")).toUri(), conf);
Path[] paths = DistributedCache.getLocalCacheFiles(conf);
Path cachePath = paths[0];
BufferedReader stopListReader = new BufferedReader(new FileReader(cachePath.toString()));
但它找不到文件。
Exception in thread "main" java.io.FileNotFoundException: File /user/.../data/textfile.txt does not exist.
感谢大家的帮助。问题是,您根本无法像我那样在eclipse中运行该程序。当我使用终端运行jar时,它会找到路径。
原因:当您直接在eclipse中运行作业时,实际上,它以本地模式工作,这意味着应用程序将尝试在您的客户端机器中查找文件。
解决方案:为了确保应用程序能够很好地远程工作,您需要扩展java类:Configured.java并实现Tool如下:
public class SimpleMapperMain extends Configured implements Tool {
public int run(String[] args) throws Exception {
//your code here
}
public static void main(String[] args) throws Exception {
int res = ToolRunner.run(new Configuration(), new SimpleMapperMain(),args);
System.exit(res);
}
}
注意:
1.确保您的配置xml文件,如hdfs-site.xml、core-site.xml等都包含在类路径中,在您的情况下,它们应该放在maven项目的src/main/resources中
2.如果涉及到权限问题,请将您当前的用户更改为user:hdfs,然后再次运行应用程序,问题应该会消失
如果还有任何其他问题,请随时问我。