Я пытаюсь использовать job.addCacheFile
для добавления файла в распределенный кеш в MapReduce для соединения на стороне карты, однако это выдает ошибку FileNotFound. Я просмотрел несколько похожих вопросов, но ни один из них не подходит для моего случая. Вот что я сделал, с oop 2.6.5
В классе драйверов
Configuration conf = super.getConf();
// absolute path on HDFS
// not sure if relative path or absolute path matters here
Path fileToBeCached = new Path("/test-data/cacheFiles");
d
Job job = Job.getInstance(conf);
output.getFileSystem(conf).delete(output, true);
FileSystem fs = fileToBeCached.getFileSystem(conf);
FileStatus filesStatus = fs.getFileStatus(fileToBeCached);
if (filesStatus.isDirectory()) {
for (FileStatus f : fs.listStatus(fileToBeCached)) {
if (f.getPath().getName().startsWith("part")) {
job.addCacheFile(f.getPath().toUri());
}
}
} else {
job.addCacheFile(fileToBeCached.toUri());
}
В классе Mapper:
public static class Map extends Mapper<Text, Text, Text, Text> {
private Set<String> recordSet = new HashSet<String>();
@Override
protected void setup(Context context) throws IOException, InterruptedException {
URI[] files = context.getCacheFiles();
if (files.length > 0) {
for (URI uri : files) {
System.out.println("Cached file: " + uri);
File path = new File(uri.getPath());
loadCache(path);
}
}
}
private void loadCache(File file) throws IOException {
recordSet.addAll(FileUtils.readLines(file));
}
}