【问题标题】:Riak MapReduce: Group items by field + sum another fieldRiak MapReduce:按字段分组项目+对另一个字段求​​和
【发布时间】:2013-04-15 21:06:06
【问题描述】:

我读到的每一个地方,人们都说您不应该在整个存储桶上使用 Riak 的 MapReduce,并且还有其他方法可以实现您的目标。不过,我不确定如何。我也不清楚为什么使用整个存储桶很慢,如果您在整个系统中只有 一个存储桶,那么无论哪种方式,您都需要检查所有条目。

我有一个包含 500K+ 文档的列表,这些文档代表了销售数据。我需要以不同的方式查看这些数据:例如,企业运营每个月的收入是多少?每个产品增加了多少收入?在给定的一个月内,每种产品销售了多少?我一直认为 MapReduce 应该擅长解决这些类型的聚合问题,所以如果你已经拥有所有的键(你必须以某种方式搜索它们,对吗?),我很困惑 MapReduce 的用途。

我的文档都在名为“sales”的存储桶中,它们是具有以下字段的记录:{"id":1, "product_key": "cyber-pet-toy", "price": "10.00", "tax": "1.00", "created_at": 1365931758}

让我们举个例子,我需要报告过去 4 年中每个月每个产品的总收入(基本上是整个桶),如何使用 Riak 的 MapReduce 有效地做到这一点?即使只是尝试对数据使用身份映射操作,我也会在大约 30 秒后超时,MySQL 会以毫秒为单位处理。

我在 Erlang 中执行此操作(使用协议缓冲区客户端),但任何语言都可以解释。

等效的 SQL (MySQL) 将是:

  SELECT SUM(price)                         AS revenue,
         FROM_UNIXTIME(created_at, '%Y-%m') AS month,
         product_key
    FROM sales
GROUP BY month, product_key
ORDER BY month ASC;

(排序现在不重要)。

【问题讨论】:

  • 好的,我明白了,Riak 并不是为处理大量数据而生的。许多示例让您相信它是(遍历 facebook 朋友的图表、处理大量推文等),但实际上 Riak 只是一个关键值存储。它的 MapReduce 实际上毫无意义,因为要真正执行它,您正在处理的数据量如此之低,以至于您可以在客户端执行它。我会尝试其他 MapReduce 数据库进行比较,因为这可能是 MapReduce 的一般问题。

标签: erlang riak


【解决方案1】:

您是对的,任何 KV 存储中的 MapReduce 都不会使其表现得像 SQL 数据库。有几件事可能对您的用例有所帮助。使用多个桶。您可以按产品、地区或月份对它们进行细分,而不仅仅是一个销售桶,这样数据就已经按照您的常见报告标准之一进行了拆分。考虑为每个字段的每个文档添加二级索引。然后,您的月份查询可以是 created_at 索引的范围查询。如果您的 id 字段顺序增加并且您需要提取每月数据,请将每个月的开始和结束 id 存储在单独的键中(我知道,一旦写入数据就不容易做到)。你也可以考虑打破每个文档的一系列键。不只是存储一个带有 json 文档的 id 键作为值,而是为每个字段存储一个键,例如 id-productid、id-createdat、id-price。这将最大限度地减少必须从磁盘读取并存储在 RAM 中以处理 MapReduce 的数据量。

为了正确看待这一点,请考虑以下(非常讽刺的)假设:我在 MySQL 数据库中有 500K 文档,每个文档由一个 json 字符串组成。我的数据库由一个名为 Sales 的表组成,其中有一个名为 Data 的列,它将我的文档存储为二进制 blob。如何编写一个快速、高效的 SQL 语句,只选择包含日期的文档并按月份对它们进行分组?

我想说的是,您必须根据您选择使用的数据存储的优势来设计数据对象的结构。 Riak 在处理 JSON 方面并不是特别有效,除非您使用他们的类似 solr 的搜索,但可能有一些方法可以重组您可能能够处理的数据。或者这可能意味着另一个数据存储会更好地满足您的需求。

【讨论】:

    【解决方案2】:

    目前,我为需要经常搜索的文档属性创建二级索引,并使用这个小得多的键子集作为 MapReduce 作业的输入。

    http://docs.basho.com/riak/latest/tutorials/Secondary-Indexes---Examples/

    我同意,与我使用的其他系统相比,像这样运行大型 MapReduce 作业似乎非常昂贵。

    【讨论】:

    • 是的,我不认为二级索引对我的用例有帮助......我们总是需要完整的存储桶,因为我们正在尝试聚合它包含的数据。二级索引有助于查找文档,但一旦您需要整个存储桶,它们的价值就会丢失。无论哪种方式,拥有 500K 记录的 Riak 似乎很糟糕;) MapReduce 支持确实具有误导性……在它成为一个可行的选择之前,您可以在客户端处理数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2019-10-25
    • 2018-07-19
    • 2014-06-23
    相关资源
    最近更新 更多