所以我在2个Riak
服务器上运行EC2
,使用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}]
这没有任何意义
答案 0 :(得分:3)
为了避免在运行reduce阶段之前必须将前一阶段的所有数据加载到协调节点上的内存中(这对于大型mapreduce作业会有问题),reduce函数会多次运行。每次迭代都会从前一阶段获得一批结果以及早期减少阶段迭代的任何输出。默认批处理大小为20,但这是configurable。由于一个reduce阶段迭代的结果将作为输入提供给下一个迭代,因此需要设计减少阶段函数来处理这个问题,and some strategies are described here。
也可以通过指定'reduce_phase_only_1'参数强制Riak仅对整个输入集运行一次reduce阶段,但通常不建议这样做,特别是对于大型作业。