在Hadoop分布式缓存中创建和放置文件



我正在尝试动态创建一个资源,并在我的作业运行之前将其放在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中的最佳方式。这里有一个很好的例子。

我没有测试示例中的代码

相关内容

  • 没有找到相关文章

最新更新