从Riak桶中获取任意对象

时间:2015-05-04 20:36:41

标签: mapreduce riak

有没有办法通过使用Riak的HTTP API从特定存储桶中获取随机对象?让我们说你不知道桶的内容,你唯一知道的是桶中的所有对象共享一个共同的数据结构。从桶中获取任何对象以显示其数据结构的好方法是什么?最好使用MapReduce而非搜索,因为搜索会使响应变平。

2 个答案:

答案 0 :(得分:1)

最好的选择是使用可预测的密钥,这样您就不必找到它们。由于这并非总是可行,因此二级索引是次佳的。

如果您使用的是eLevelDB,则可以查询$BUCKET隐式索引,并将max_results设置为1,这将返回单个密钥。然后,您将发出该密钥的获取请求。

如果您使用Bitcask,则有2个选项:

  • 列出铲斗中的所有钥匙
    Bitcask中的密钥列表需要折叠所有桶中的每个值,以便在单个存储桶中返回密钥列表。实际上,这意味着从磁盘读取整个数据集,因此系统非常繁重,可能会使生产集群陷入困境。
  • 的MapReduce
    整个存储桶上的MapReduce使用类似的关键列表查询,因此它在系统上也非常高。由于映射阶段函数是针对每个对象单独执行的,因此如果映射阶段返回一个对象,则存储桶中的每个对象将通过网络传递到运行reduce阶段的节点。因此,使地图阶段函数仅返回没有数据的密钥会更有效(读取:更少灾难性),然后让您的reduce阶段返回列表中的第一个项目,这样您就需要发出get请求对象一旦有了密钥名称。

虽然在没有关于密钥或内容的信息时在技术上可以在给定存储桶中找到密钥,但如果您将系统设计为创建名为<<" schema" >>或<<<&#;"样本">>在每个存储桶中包含一个示例对象,您只需发出该键的get请求,而不是搜索,折叠或映射。

答案 1 :(得分:0)

如果您使用的是Riak 2.X,那么在大多数用例中建议使用Map Reduce或2i查询进行搜索(http://docs.basho.com/riak/latest/dev/using/search/),并且可以通过HTTP API使用。