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

时间:2012-08-27 21:54:30

标签: hadoop io mapreduce distributed-objects

(来自Hadoop新手)

我希望在玩具Hadoop概念验证示例中尽可能避免使用文件。我能够从非基于文件的输入中读取数据(感谢http://codedemigod.com/blog/?p=120) - 它会生成随机数。

我想将结果存储在内存中,以便我可以对其进行进一步的(非Map-Reduce)业务逻辑处理。 Essetially:

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

似乎最接近我想要的是将结果存储为二进制文件输出格式,并使用等效的输入格式将其读回。这似乎是不必要的代码和不必要的计算(我是否误解了Map Reduce所依赖的前提?)。

1 个答案:

答案 0 :(得分:7)

这个想法的问题是Hadoop没有“分布式内存”的概念。如果你想要结果“在内存中”,下一个问题必须是“哪台机器的内存?”如果你真的想这样访问它,你将不得不编写自己的自定义输出格式,然后使用一些现有的框架在机器之间共享内存,或者再次编写自己的。

我的建议是简单地写入HDFS,然后对于非MapReduce业务逻辑,首先通过FileSystem 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);

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