我正在尝试动态地创建一个资源,并在我的作业运行之前将其放置在hadoop分布式缓存中-也就是说,这将是一个自动化的作业,需要在Map程序执行之前收集一些东西(通过http)。
我面临的问题是,由于运行的Map程序太多,我无法将其置于安装阶段—这会给正在调用的服务器带来太大的负载。我希望能够检索我的资源,将它们写入一个文件,然后将其放置在分布式缓存中以便于以后访问。
大节点:我不想把文件写到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()
方法,即在Map程序开始之前-但每当我尝试访问时,它都会给我一个filenotfoundexception new File("resources.json")
在我的Map上。
创建这些临时文件的正确方法是什么?在作业中访问它们的最佳方法是什么?
2条答案
按热度按时间qvsjd97n1#
尝试将文件放入分布式缓存:
其中filename是文件在分布式缓存中的名称。
在mapper上,读取如下文件:
vsdwdz232#
尝试将文件放入缓存,如:
在mapper中,应该像这样获取它:
理想情况下,将文件保存在hdfs中的最佳方法。这里有一个很好的例子。
我没有测试示例中的代码。