gpt4 book ai didi

hadoop - 如何读取 HDFS 上的文件以在 Hadoop 上进行分布式缓存

转载 作者:可可西里 更新时间:2023-11-01 16:12:56 27 4
gpt4 key购买 nike

我正在尝试从 HDFS 加载 hadoop 分布式缓存中的文件,但它不起作用。我正在使用 hadoop 版本 2.5.1 。这是关于我如何在映射器中使用缓存文件的代码:

@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)

如果有人能阐明为什么会出现这些异常,我将不胜感激。

最佳答案

我遇到了同样的问题。如果文件位于 Pro Apache Hadoop 第二版的 hdfs 中,则会引用不同的方法。您只能通过下载本书的源代码来访问示例代码。它在第 6 章文件夹 (MapSideJoinMRJob3.java) 中,我将发布不同的片段。希望这会有所帮助::

    private FileSystem hdfs = null;

public List<String> readLinesFromJobFS(Path p) throws Exception {
List<String> ls = new ArrayList<String>();

BufferedReader br = new BufferedReader(new InputStreamReader(
this.hdfs.open(p)));
String line;
line = br.readLine();
while (line != null) {
line = br.readLine();
if(line!=null)
ls.add(line);
}
return ls;
}

public void setup(Context context) {

try {
this.hdfs = FileSystem.get(context.getConfiguration());
URI[] uris = context.getCacheFiles();
for (URI uri : uris) {
if (uri.toString().endsWith("airports.csv")) {
this.readAirports(uri);
}
if (uri.toString().endsWith("carriers.csv")) {
this.readCarriers(uri);
}
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex);
}

}

关于hadoop - 如何读取 HDFS 上的文件以在 Hadoop 上进行分布式缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27410726/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com