java—在hadoop分布式缓存中创建和放置文件

rjee0c15  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(317)

我正在尝试动态地创建一个资源,并在我的作业运行之前将其放置在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上。
创建这些临时文件的正确方法是什么?在作业中访问它们的最佳方法是什么?

qvsjd97n

qvsjd97n1#

尝试将文件放入分布式缓存:

_job.addCacheFile(new URI(filePath+"#"+filename));

其中filename是文件在分布式缓存中的名称。
在mapper上,读取如下文件:

Path path = new Path (filename);
FileSystem fs = FileSystem.getLocal(context.getConfiguration());

BufferedReader br = new BufferedReader(new InputStreamReader(fs.open(path)));
vsdwdz23

vsdwdz232#

尝试将文件放入缓存,如:

job.addCacheFile(new Path(filename).toUri());

在mapper中,应该像这样获取它:

Path[] localPaths = context.getLocalCacheFiles();

理想情况下,将文件保存在hdfs中的最佳方法。这里有一个很好的例子。
我没有测试示例中的代码。

相关问题