4

(来自 Hadoop 新手)

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

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

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

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

4

1 回答 1

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);

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

于 2012-08-27T23:16:41.343 回答