0

私が読んだどこでも、Riak の MapReduce をバケツ全体に使用するべきではなく、目標を達成する他の方法があると言う人がいます。方法はわかりませんが。また、システム全体でバケットが 1 つしかない場合、バケット全体を使用すると遅い理由も明確ではないため、いずれにせよ、すべてのエントリを確認する必要があります。

売上データを表す 50 万以上のドキュメントのリストがあります。このデータをさまざまな方法で表示する必要があります。たとえば、事業が運営されていた各月の収益はいくらですか? 各製品の収益はいくらですか? 特定の月に各製品が何個売れたか? MapReduce はこの種の集約問題を解決するのに適しているはずだといつも思っていたので、すでにすべてのキーを持っている場合に MapReduce がどのように使用されるのか混乱しています (何らかの方法でそれらを検索する必要がありますよね?)。

私のドキュメントはすべて「sales」という名前のバケットにあり、次のフィールドを持つレコードです: {"id":1, "product_key": "cyber-pet-toy", "price": "10.00", "tax": "1.00", "created_at": 1365931758}.

過去 4 年間の各月の各製品の総収益 (基本的にはバケット全体) を報告する必要がある例を見てみましょう。Riak の MapReduce を使用してそれを効率的に行うにはどうすればよいでしょうか? データに対して ID マップ操作を使用しようとしても、約 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;

(注文は今のところ重要ではありません)。

4

2 に答える 2

2

その通りです。KV ストアの MapReduce は、SQL データベースのように動作しません。ユースケースに役立つことがいくつかあります。複数のバケットを使用します。単なる売上バケットの代わりに、製品、地域、または月ごとに分類できるため、データはすでに共通のレポート基準の 1 つによって分割されています。各フィールドの各ドキュメントにセカンダリ インデックスを追加することを検討してください。月のクエリは、created_at インデックスの範囲クエリになる可能性があります。id フィールドが連続して増加し、毎月のデータを取得する必要がある場合は、各月の開始 ID と終了 ID を別のキーに保存します (データが書き込まれると、これを行うのは簡単ではありません)。各ドキュメントを一連のキーに分割することも検討してください。値の json ドキュメントを使用して id キーを保存するだけでなく、id-productid、id-createdat、ID価格。これにより、MapReduce を処理するためにディスクから読み取って RAM に保存する必要があるデータの量が最小限に抑えられます。

これを概観するために、次の (非常に皮肉な) 仮説を考えてみましょう: MySQL データベースに 500K のドキュメントがあり、各ドキュメントは json 文字列で構成されています。私のデータベースは、Sales という名前の 1 つのテーブルと、ドキュメントをバイナリ BLOB として格納する Data という名前の 1 つの列で構成されています。日付を含むドキュメントのみを選択し、それらを月ごとにグループ化する、高速で効率的な SQL ステートメントを作成するにはどうすればよいでしょうか?

ここで強調したいのは、使用するデータ ストアの強度に応じて、データ オブジェクトの構造を設計する必要があるということです。Riak は、solr のような検索を使用しない限り、JSON の処理に特に効率的ではありませんが、処理できるデータを再構築する方法はおそらくあるでしょう。あるいは、別のデータ ストアの方がニーズに適していることを意味する場合もあります。

于 2013-04-15T13:06:06.167 に答える
1

現在、頻繁に検索する必要があるドキュメント属性のセカンダリ インデックスを作成し、この非常に小さなキーのサブセットを MapReduce ジョブへの入力として使用しています。

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

私が使用した他のシステムと比較して、このような大きな MapReduce ジョブを実行するには非常にコストがかかるように思われることに同意します。

于 2013-04-15T00:02:59.530 に答える