2

所以我Riak在 2EC2台服务器上运行,使用 python 运行 javascript Mapreduce。它们已经聚集在一起。主要用于“概念证明”。

桶中有 50 个键,map/reduce 函数所做的只是重新格式化数据。这仅用于测试 Riak 中的 map/reduce 功能。

问题:输出只显示 [{u'e': 2, u'undefined': 2, u'w': 2}]。那是完全错误的。日志显示所有密钥都已“处理”但只有 2 个被返回。所以我的问题是为什么会发生这种情况,我是否错过了一些重要的事情。

代码:

import riak
client = riak.RiakClient()
query = riak.RiakMapReduce(client).add('raw_hits10')
query.map("""function(v) {
      var data = JSON.parse(v.values[0].data);
      return [[data, 1]];
}""")
query.reduce("""function(vk) {
         var res = {};
         for (var indx in vk) {
            var key_t = vk[indx][0];
            var val_t = vk[indx][1];
            ejsLog('/tmp/map_reduce.log', key_t + "--- " + val_t);

            res[key_t] = 2;
         }
         return [res]
    }
      """)


for res in query.run():
    print res

打印结果:

[{u'e': 2, u'undefined': 2, u'w': 2}]

这没有任何意义

4

1 回答 1

3

为了避免在运行 reduce 阶段之前必须将前一个阶段的所有数据加载到协调节点的内存中(这对于大型 mapreduce 作业会出现问题),reduce 函数会运行多次。每次迭代都会从前一个阶段获得一批结果,以及来自早期减少阶段迭代的任何输出。默认批量大小为 20,但这是可配置的。由于一个reduce阶段迭代的结果将作为下一次迭代的输入,因此需要设计reduce阶段函数来处理这个问题,这里描述了一些策略

也可以通过指定 'reduce_phase_only_1' 参数强制 Riak 只为整个输入集运行一次 reduce 阶段,但通常不建议这样做,尤其是对于大型作业。

于 2013-05-04T14:29:07.840 回答