我正在尝试动态创建一个资源,并在我的作业运行之前将其放在Hadoop分布式缓存中-也就是说,这将是一个自动化的作业,需要在映射器执行之前将几个东西收集在一起(通过HTTP)。
我面临的问题是,我不能把它放在设置阶段,由于我运行的映射器的数量-它把方式太高的服务器负载被调用。我希望能够检索我的资源,将它们写入文件,然后将其放在分布式缓存中,以便以后轻松访问。
大节点:我不不想把文件写入Hadoop,我宁愿把它放在节点的本地。
// The whitelist cache file
File resourceFile = new File("resources.json");
// Create an output stream
FileOutputStream outputStream = new FileOutputStream(resourceFile.getAbsoluteFile());
// Write the whitelist to the local file
// (this is using Jackson JSON, FYI)
mapper.writeValue(outputStream, myResources);
// Add the file to the job
job.addCacheFile(new URI("file://" + resourceFile.getAbsolutePath()));
这在我的工作的run()
方法中运行,即在映射器开始之前-但每当我尝试访问映射器中的new File("resources.json")
时,它都会给我一个FileNotFoundException。
创建这些临时文件的正确方法是什么?在作业中访问它们的最佳方法是什么?
尝试将文件放入分布式缓存:
_job.addCacheFile(new URI(filePath+"#"+filename));
其中filename是文件在分布式缓存中的名称。
on Mapper读取文件如下:
Path path = new Path (filename);
FileSystem fs = FileSystem.getLocal(context.getConfiguration());
BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path)));
尝试将文件放入缓存中,如:
job.addCacheFile(new Path(filename).toUri());
在映射器中,它应该像这样获取:
Path[] localPaths = context.getLocalCacheFiles();
理想情况下,将文件保存在hdfs中的最佳方式。这里有一个很好的例子。
我没有测试示例中的代码