0

Riak は初めてなので、誤解をお許しください。

新しいエントリを追加し、キーとインデックスでクエリを実行できます。ただし、より複雑なクエリを実装する必要があるため、使用しようとしていますMapReduce

私はVolume今のところプレーンフィールドしか持たないという名前のアプリケーションレベルのエンティティを持っています:

public class Volume implements Comparable<Volume>, Serializable {
    @RiakIndex(name = "id")
    @JsonProperty("id")
    private Integer id;

    @RiakIndex(name = "name")
    @RiakKey
    private String name;

    @RiakIndex(name = "created_at")
    @JsonProperty("created_at")
    private long createdAt;


    // setters, getters....
}

VolumeRiak DB にインスタンスを追加する方法は次のとおりです。

IRiakClient riakClient = RiakFactory.httpClient();
Bucket bucket = riakClient.fetchBucket(bucketName).execute();
for (int i = 0; i < n; i++) {
    int id = i;
    ManagedVolume volume = new ManagedVolume();
    volume.setCreatedAt(System.currentTimeMillis());
    volume.setId(id);
    volume.setName("volume" + i);
    bucket.store(volume).execute();
}

これで、次のように問題なくインスタンスを取得できます。

Collection<String> col = backet.fetchIndex(IntIndex.named("id")).from(3).to(5).execute();

しかし、使用しようとするすべての試みはMapReduce失敗します:

String str = riakClient.mapReduce(bucketName, "name: volume1")
    .addMapPhase(new NamedJSFunction("Riak.mapValuesJson")).
    execute().getResultRaw();

を追加せずに実行しようとしましたがRiak.mapValuesJson、クエリを変更してid代わりに使用し、 「name: \"volume\"" "name: \'volume\'" {"error":"map_reduce_error"}`nameをラップしようとしました」volume`` with quotes (,etc.) but nothing helps. I always get HTTP status 500 and the following error:

スタック トレースは次のとおりです。

Exception in thread "main" com.basho.riak.client.RiakException: java.io.IOException: {"error":"map_reduce_error"}
    at com.basho.riak.client.query.MapReduce.execute(MapReduce.java:81)
    at com.infinidat.riak.TryRiak.search(TryRiak.java:288)
    at com.infinidat.riak.TryRiak.main(TryRiak.java:66)
Caused by: java.io.IOException: {"error":"map_reduce_error"}
    at com.basho.riak.client.raw.http.ConversionUtil.convert(ConversionUtil.java:589)
    at com.basho.riak.client.raw.http.HTTPClientAdapter.mapReduce(HTTPClientAdapter.java:386)
    at com.basho.riak.client.query.MapReduce.execute(MapReduce.java:79)
    ... 2 more

Riak の次のレコードerror.logと の同様のレコードを見つけましたconsole.log

2013-07-23 19:14:12.451 [error] <0.194.0> Supervisor riak_pipe_builder_sup had child undefined started with {riak_pipe_builder,start_link,undefined} at <0.18058.4> exit with reason {{modfun,riak_search,mapred_search,[<<"VolumeBucket">>,<<"name: 1">>]},error,badarg,[{ets,lookup,[schema_table,<<"VolumeBucket">>],[]},{riak_search_config,get_schema,1,[{file,"src/riak_search_config.erl"},{line,69}]},{riak_search_client,parse_query,3,[{file,"src/riak_search_client.erl"},{line,40}]},{riak_search,parse_query,3,[{file,"src/riak_search.erl"},{line,59}]},{riak_search,mapred_search,3,[{file,"src/riak_search.erl"},{line,46}]},{riak_kv_mrc_pipe,send_inputs,3,[{file,"src/riak_kv_mrc..."},...]},...]} in context child_terminated

ここに欠けているものがあると信じています。おそらく設定の問題でしょうか?これは非常に単純なクエリです。これが機能したら、より複雑なクエリに進みたいと思っています。

4

1 に答える 1

1

mapreduce ジョブは Riak Search クエリを input として指定します。クラスターでRiak Search が有効になっていない場合、これは失敗します。Java クライアントのドキュメントには、さまざまなタイプの入力を指定する方法を示すいくつかの例があります。

そうは言っても、Riak MapReduce はリアルタイム クエリ ツールとして設計されたものではないため、あなたが達成しようとしていることに適したツールであるかどうかはわかりません。各リクエストに多数のノード/パーティションが参加する必要があるため、キーと値の直接ルックアップと比較して、システムの負荷が大幅に増加します。これは、より高いレイテンシーにつながり、また、直接的なキー アクセスと同様にスケーリングしない傾向があることも意味します。

Riak やその他のキー バリュー ストアのデータ モデリングでは、データ アクセス パターンとクエリ パターンをデータの構造と共に事前に考慮する必要があります。これは、リレーショナル モデルでの作業とは大きく異なります。Riak でのデータ モデリングに関連するいくつかのブログ投稿とプレゼンテーションは、次の場所から入手できます。

于 2013-07-24T15:35:48.350 に答える