Riak MapReduce-map工作,reduce接收非常小的结果子集

Riak MapReduce-map工作,reduce接收非常小的结果子集,mapreduce,riak,Mapreduce,Riak,我正在Ubuntu 12.10上使用Riak 2.0.0b1(最新版本)。这是一个开发人员框,所以我只有一个Riak实例——没有集群,等等 我已经将大约100k个JSON文档(每个文档大约300字节)放入一个bucket中,现在我正在尝试使用mapreduce。数据是随机的,我在其中一个键上也有2i索引,基本上将数据集划分为10个几乎相等的部分,约10k个文档 此查询按预期工作: curl -XPOST -d'{ "inputs": {"bucket": "bucket", "index":

我正在Ubuntu 12.10上使用Riak 2.0.0b1(最新版本)。这是一个开发人员框,所以我只有一个Riak实例——没有集群,等等

我已经将大约100k个JSON文档(每个文档大约300字节)放入一个bucket中,现在我正在尝试使用mapreduce。数据是随机的,我在其中一个键上也有2i索引,基本上将数据集划分为10个几乎相等的部分,约10k个文档

此查询按预期工作:

curl -XPOST -d'{
  "inputs": {"bucket": "bucket", "index": "idx_bin", "key": "10"},
  "query": [
    {
      "map": {
        "language": "javascript",
        "source": "Riak.mapValuesJson"
      }
    }
  ]
}' http://localhost:8080/mapred -H 'Content-Type: application/json' | python -m json.tool | egrep '^ {4}\{' | wc -l

9974
获得了大约10公里的成绩。现在,如果我想在reduce步骤中做一些事情,我会得到一个毫无意义的答案:

curl -XPOST -d'{
  "inputs": {"bucket": "bucket", "index": "idx_bin", "key": "10"},
  "query": [
    {
      "map": {
        "language": "javascript",
        "source": "Riak.mapValuesJson"
      }
    },
    {
      "reduce": {
         "language": "javascript",
        "source": "function(o) { return [o.length] }"
      }
    }
  ]
}' http://localhost:8080/mapred -H 'Content-Type: application/json' | python -m json.tool

[
    15
]
如果我达到了一些(未记录的)限制或一个完整的对象列表,请不要超过15个,我想在这里看到一个错误。(这一数字在不同的运行中有所不同;有时会有更多的运行。)我转到configs并完成了以下操作:

javascript.map_pool_size = 64
javascript.reduce_pool_size = 64
javascript.maximum_stack_size = 32MB
javascript.maximum_heap_size = 64MB
根本没用


在reduce阶段发生了什么以及如何获取所有对象?

reduce函数被多次调用。map函数将在集群中大约1/3的VNode上运行(这在环大小为64的集群中是22倍),每次map函数的结果可用时都会调用reduce函数,它的第一个参数是一个列表,其中包含上次运行reduce函数的结果,以及映射函数的结果。在您的例子中,您计算了从第一个vnode返回的值,然后将其作为第二个vnode结果中包含的值传递,并且只计算为单个值

您需要做的是让reduce函数返回一个易于与其他值区分的值/对象,例如

function(o) {
  var prevCount = 0;
  var countObjects = 0;
  for each (e in o) {
    if (typeof e === 'object' && typeof e.reduce_running_total === 'number') {
       prevCount += e.reduce_running_total;
       countObjects += 1;
    }
  }
  return([{"reduce_running_total":o.length + prevCount - countObjects}]);
}
或者,您可以节省一些网络带宽,而不是让map阶段返回所有对象,而是让map函数为找到的每个键返回一个literal
[1]
,然后reduce函数简单地将输入列表中的所有数字相加并返回它们