Hadoop Map Reduce OutputFormat用于将结果分配给内存变量(而不是文件)?

Hadoop Map Reduce OutputFormat用于将结果分配给内存变量(而不是文件)?,hadoop,io,mapreduce,distributed-objects,Hadoop,Io,Mapreduce,Distributed Objects,(来自Hadoop新手) 我想在玩具Hadoop概念验证示例中尽可能避免使用文件。我能够从非基于文件的输入中读取数据(多亏了),这会生成随机数 我希望将结果存储在内存中,以便对其进行进一步的(非映射还原)业务逻辑处理。特别是: conf.setOutputFormat(InMemoryOutputFormat) JobClient.runJob(conf); Map result = conf.getJob().getResult(); // ? 我想要做的最接近的事情似乎是将结果存储为二进制

(来自Hadoop新手)

我想在玩具Hadoop概念验证示例中尽可能避免使用文件。我能够从非基于文件的输入中读取数据(多亏了),这会生成随机数

我希望将结果存储在内存中,以便对其进行进一步的(非映射还原)业务逻辑处理。特别是:

conf.setOutputFormat(InMemoryOutputFormat)
JobClient.runJob(conf);
Map result = conf.getJob().getResult(); // ?

我想要做的最接近的事情似乎是将结果存储为二进制文件输出格式,并使用等效的输入格式将其读回。这似乎是不必要的代码和不必要的计算(我是否误解了Map Reduce所依赖的前提?)。如果您希望结果“在内存中”,下一个问题必须是“哪台机器的内存?”如果您真的想这样访问它,您必须编写自己的自定义输出格式,然后还可以使用一些现有的框架跨机器共享内存,或者再次编写自己的

我的建议是,只需像平常一样写入HDFS,然后对于非MapReduce业务逻辑,只需通过文件系统API从HDFS读取数据即可,即:

FileSystem fs = new JobClient(conf).getFs();
Path outputPath = new Path("/foo/bar");
FSDataInputStream in = fs.open(outputPath);
// read data and store in memory
fs.delete(outputPath, true);

当然,它会执行一些不必要的磁盘读写操作,但是如果您的数据足够小,可以放入内存,那么您为什么还要担心呢?如果这是一个严重的瓶颈,我会感到惊讶。

这很有道理。谢谢我会在等待一段时间后将答案标记为正确,以防更多的人有任何意见。