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

Sri*_*bat 4 io hadoop 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(); // ?
Run Code Online (Sandbox Code Playgroud)

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

Joe*_*e K 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);
Run Code Online (Sandbox Code Playgroud)

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