16

ここ数日、私はリアクと少し遊んでいました。初期設定は思ったより簡単でした。これで、テストのためにすべてのノードが同じ vm で実行されている 3 ノード クラスターができました。

確かに、私の仮想マシンのハードウェア設定は大幅にダウングレードされています (1 CPU、512 MB RAM) が、それでも riak のパフォーマンスが遅いことにかなり驚いています。

マップリデュース

map reduce で少し遊んでみると、1 つのバケットに約 2000 個のオブジェクトがあり、それぞれのサイズは json として約 1k ~ 2k でした。このマップ関数を使用しました:

function(value, keyData, arg) {
    var data = Riak.mapValuesJson(value)[0];

    if (data.displayname.indexOf("max") !== -1) return [data];
    return [];
}

また、結果を返す http 要求を実行するだけで 2 秒以上かかりました。クライアント コードで json からの結果を逆シリアル化するのにかかった時間は数えません。3 つのノードのうち 2 つを削除すると、パフォーマンスがわずかに 2 秒未満に改善されたように見えますが、それでも私には非常に遅いようです。

これは予想されることですか?オブジェクトのバイトサイズはそれほど大きくなく、1 つのバケットに 2000 個のオブジェクトもそれほど大きくありません。

入れる

上記と同じサイズの約 60.000 個のオブジェクトのバッチ挿入は、かなり時間がかかり、実際にはうまくいきませんでした。

オブジェクトを riak に挿入した私のスクリプトは約 40.000 で停止し、riak ノードに接続できなくなったと言いました。riak ログで、ノードがメモリ不足で停止したことを示すエラー メッセージを見つけました。

質問

これは本当に riak での最初のショットなので、何かを台無しにした可能性は間違いなくあります。

  • 微調整できる設定はありますか?
  • ハードウェア設定が制限されすぎていませんか?
  • riak とやり取りするために使用した PHP クライアント ライブラリが、ここでの制限要因ではないでしょうか?
  • すべてのノードを同じ物理マシンで実行するのはかなりばかげていますが、これが問題である場合、どうすればriak のパフォーマンスをよりよくテストできますか?
  • map reduce は本当に遅いですか? riak メーリング リストで map reduce によるパフォーマンス ヒットについて読みましたが、Map Reduce が遅い場合、ほぼリアルタイムで必要なデータの「クエリ」をどのように実行すればよいのでしょうか? riak が redis ほど速くないことはわかっています。

riak の経験が豊富な人がこれらの質問のいくつかを手伝ってくれれば、本当に助かります。

4

3 に答える 3

31

この回答は少し遅れていますが、Riak の mapreduce の実装は、バケット全体ではなく、主にリンクを操作するように設計されていることを指摘したいと思います。

実際、Riak の内部設計は、バケット全体の操作に対してかなり最適化されています。これは、バケットがシーケンシャル テーブルではなく、ノードのクラスター全体に分散されたキースペースと見なされるためです。これは、ランダム アクセスが非常に高速であることを意味します — おそらく O(log n) ですが、それについては引用しないでください — 一方、シリアル アクセスは非常に、非常に、非常に低速です。Riak が現在設計されている方法であるシリアル アクセスは、必然的にすべてのノードにデータを要求することを意味します。

ちなみに、Riak 用語の「バケット」は、紛らわしく、残念なことに、おそらくあなたが考えているようには実装されていません。Riak がバケットと呼ぶものは、実際には単なる名前空間です。内部的には、バケットは 1 つだけであり、キーはバケット名をプレフィックスとして保存されます。これは、バケットがどれほど小さくても大きくても、サイズnの 1 つのバケットでキーを列挙するにはm時間かかることを意味します。ここで、 mはすべてのバケット内のキーの総数です。

これらの制限は Basho による実装の選択であり、必ずしも設計上の欠陥ではありません。Cassandra は Riak とまったく同じパーティショニング モデルを実装していますが、効率的なシーケンシャル レンジ スキャンと大量のキーにわたる mapreduce をサポートしています。Cassandra は真のバケットも実装しています。

于 2011-10-01T20:51:35.213 に答える
4

しばらく経ち、Riak のいくつかの新しいバージョンが登場した今、私が推奨するのはこれです。完全なバケット map/reduce に依存しないでください。これは最適化された操作ではありません。マップ/reduce を最適化する他の方法がある可能性は非常に高いため、必要な一重項を引き出すためにそれほど多くのデータを調べる必要はありません。

この点に関しては、Riak の新しいバージョンで使用できるようになったセカンダリ インデックスが最適です。検索するオブジェクトにインデックスを付けます (おそらく、値が 0 または 1 の「ismax_int」という名前)。数十万のキーをマイクロ秒単位で使用してセカンダリ インデックスをマッピング/削減できます。これは、完全なバケット スキャンを検討するのに数秒かかります。

于 2012-02-23T12:34:58.883 に答える
2

私は Riak を直接使用した経験はありませんが、Cassandra で少し作業したことがあります。

まず、パフォーマンスは利用可能なコア数とメモリに大きく依存します。これらのシステムは通常、大量のパイプライン処理と並行処理が行われており、多くのコアの恩恵を受けています。4 つ以上のコアと 4GB 以上の RAM が出発点として適しています。

次に、MapReduce はリアルタイム クエリではなく、バッチ処理用に設計されています。

Riak およびすべての同様の Key-Value ストアは、単純なルックアップのための高い書き込みパフォーマンスと高い読み取りパフォーマンスを実現するように設計されており、複雑なクエリはまったく必要ありません。

比較のために、単一ノード (6 コア、6 GB) の Cassandra は、1 秒あたり 20,000 の個別の挿入を実行できます。

于 2011-05-15T21:45:26.380 に答える