我正试图从hdfs在hadoop的分布式缓存中加载一个文件,但它不起作用。我使用的是hadoop版本2.5.1。这是关于如何在Map器中使用缓存文件的代码:
@Override
protected void setup(Context context) throws IOException, InterruptedException {
URI[] uris = context.getCacheFiles();
for (URI uri : uris) {
File usersFile = new File(uri);
BufferedReader reader = null;
reader = new BufferedReader(new FileReader(usersFile));
String line = reader.readLine();
...
reader.close();
}
}
下面是我尝试在驱动程序中加载缓存的三种不同方式:1)如果我像这样将文件放入缓存,它可以工作,但它将从本地fs加载文件(我在mac上运行代码)。
job.addCacheFile(new URI("file:///input/users.txt"));
2) 如果我将hdfs用作如下方案(文件存在于hdfs上的“/input/”下):
job.addCacheFile(new URI("hdfs:///input/users.txt"));
我有个例外:
java.lang.Exception: java.lang.IllegalArgumentException: URI scheme is not "file"
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.IllegalArgumentException: URI scheme is not "file"
at java.io.File.<init>(File.java:395)
3) 这是我尝试加载文件的第三种方法:
job.addCacheFile(new URI("hdfs://localhost:9000/input/users.txt"));
我得到以下例外:
java.lang.Exception: java.lang.IllegalArgumentException: URI scheme is not "file"
at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:462)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:522)
Caused by: java.lang.IllegalArgumentException: URI scheme is not "file"
at java.io.File.<init>(File.java:395)
如果有人能解释为什么会出现这些例外,我将不胜感激。
1条答案
按热度按时间jexiocij1#
我也有同样的问题。在proapachehadoop第2版中,如果文件在hdfs中,则会引用其他方法。您只能通过下载本书的源代码来访问示例代码。在第6章的文件夹(mapsidejoinmrjob3.java)中,我将发布不同的代码片段。希望这有帮助: