1

Ripple で Riak を使用するプロジェクトに取り組んでいますが、問題に遭遇しました。リンクの構造をリンク ウォークすると、何らかの理由で重複が発生します。curl を使用してリンク ウォークを実行すると、見た限りでは重複が表示されません。

私のカールベースのリンクウォークの違い

curl -v http://127.0.0.1:8098/riak/users/2306403e5177b4716da9df93b67300824aa2fd0e/_,projects,0/_,tasks,1

そして私のルビーリップル/リアククライアントベースのリンクウォーク

      result =   Riak::MapReduce.new(self.robject.bucket.client).
            add(self.robject.bucket,self.key).
            link(Riak::WalkSpec.new({:key => 'projects'})).
            link(Riak::WalkSpec.new({:key => 'tasks', :bucket=>'tasks'})).
            map("function(v){ if(!JSON.parse(v.values[0].data).completed) {return [v];} else { return [];} }", {:keep => true}).run

最後に地図でわかる限りです。

ただし、map/reduce の結果には複数の重複が含まれます。なぜか頭が回らない。キーに基づいて重複を削除することにしましたが、最後に重複を削除するのは無駄に思えるので、riak の結果に重複が含まれないようにしたいと思います。

私は次のことを試しました:

  • リップル オブジェクトのリンク セットに重複がないことを確認する
  • マップを削減せずにデータをロードすると、リンク ウォークに重複したキーが含まれます。

どんな助けでも大歓迎です。

4

1 に答える 1

2

ここで遭遇しているのは、Map/Reduceクエリの興味深い副作用/課題です。

M / Rクエリには読み取りクォーラム値の概念がなく、必然的にすべてのノードのすべてのオブジェクト(もちろん、入力フィルタリングの制限内)にヒットする必要があります。つまり、N> 1の場合、クエリはすべてのオブジェクトのすべてのコピーをヒットする必要があります。

たとえば、デフォルトでN=3としましょう。つまり、書き込まれたオブジェクトごとに、3つの異なるノードにそれぞれ1つずつ、合計3つのコピーがあります。オブジェクトの読み取りを発行すると(たとえば、デフォルトのクォーラム値R = 2の場合)、調整ノード(クライアントから読み取り要求を受信した)は3つのノードすべてに接続します(3つの異なる値、3つの異なるコピーを受信する可能性があります)オブジェクトの)。次に、それらのコピーの少なくとも2つが同じ値を持っていることを確認し(R = 2要件を満たすため)、その合意された値を要求元のクライアントに返し、他のコピーを破棄します。したがって、通常の操作(読み取り/書き込みだけでなく、リンクウォーキングも)では、調整ノードが重複を除外します。

Map/Reduceクエリにはそれほど贅沢はありません。それらには実際にはクォーラム値が関連付けられていません。すべてのノード上のすべての(関連する)キーとオブジェクトを反復処理するように作成されています。また、M / Rコードは、調整ノードだけでなく、個々のノード(データに近い)で実行されるため、重複を本質的に除外することはできません。たとえば、それらが設計されていることの1つは、すべてのノード上のオブジェクトのすべてのコピーを更新(または削除)することです。したがって、各マップフェーズ(上記の場合)はすべてのノードで実行され、各コピーに対して一致した「完了」値を返し、結果を調整ノードに返送してクライアントに返します。また、N> 1である可能性が非常に高いため、結果セットに重複が生じる可能性があります。

これで、Reduceフェーズでコードを記述して、重複を明示的に除外し、キーがすでに存在するかどうかを確認し、存在する場合は重複を拒否することができます。しかし、正直なところ、私があなたの状況にあった場合は、除外するだけです。リデュースコードを台無しにするのではなく、クライアント側のルビーの重複。

とにかく、この謎に光を当てることを願っています。

于 2012-10-21T18:48:58.947 に答える