3

私はRiak DBでeLevelDBバックエンドを実行しており、このmap reduceを使用してクエリを実行すると、すべてのデータがJSON文字列として返されます(予想どおり):

{
"inputs":"TWEETS_BY_ID",
"query":[
    {"map":
        {"language":"javascript",
         "name":"Riak.mapValuesJson"
        }
    }]
}

このクエリは遅いので、バケット全体の小さなサブセットのみをクエリしたいだけです。タイムスタンプ付きのセカンダリ インデックスがあるので、この mapreduce を実行してみます。

{
"inputs":
    {
        "bucket":"TWEETS_BY_ID",
        "index":"timestamp_int",
        "start":"1375736484000",
        "end":"1375736485000"
    },
"query":[
    {"map":
        {"language":"javascript",
         "name":"Riak.mapValuesJson",
         "keep":true
        }
    }
]
}

次のエラーが表示されます。

{error,{exit,{json_encode,{bad_term,{1375736484000,<<"364491348659142656">>}}},
             [{mochijson2,json_encode,2,
                          [{file,"src/mochijson2.erl"},{line,149}]},
              {mochijson2,'-json_encode_proplist/2-fun-0-',3,
                          [{file,"src/mochijson2.erl"},{line,167}]},
              {lists,foldl,3,[{file,"lists.erl"},{line,1197}]},
              {mochijson2,json_encode_proplist,2,
                          [{file,"src/mochijson2.erl"},{line,170}]},
              {mochijson2,'-json_encode_proplist/2-fun-0-',3,
                          [{file,"src/mochijson2.erl"},{line,167}]},
              {lists,foldl,3,[{file,"lists.erl"},{line,1197}]},
              {mochijson2,json_encode_proplist,2,
                          [{file,"src/mochijson2.erl"},{line,170}]},
              {mochijson2,'-json_encode_array/2-fun-0-',3,
                          [{file,"src/mochijson2.erl"},{line,157}]}]}}

今日リリースされた 1.4.1 にアップグレードしましたが、セカンダリ インデックスと Javascript mapreduces に関するバグ レポートが含まれていましたが、それによってエラーが変わったようには見えません。これをデバッグする方法がよくわかりません。助言がありますか?

4

1 に答える 1

2

バグが見つかりました。現在 mapreduce と互換性がないインデックスに対して範囲クエリを実行すると、一致した用語を返す新しい動作があります。回避策として、ソース tarをまだ取得していない場合は、最初に取得します。ファイルを解凍し、 でファイルを編集しriak_kv_index.hrlriak-1.4.1/deps/riak_kv/include行を変更します

          return_terms=true :: boolean(), %% Note, should be false for an equals query

          return_terms=false :: boolean(), %% Note, should be false for an equals query

index モジュールだけをコンパイルするには、次を実行します。

 /usr/lib/riak/erts-5.9.1/bin/erlc -I riak-1.4.1/deps/riak_kv/include riak-1.4.1/deps/riak_kv/src/riak_index.erl

これにより、新しいriak_index.beamファイルが作成されます。

古い を見つけてriak_index.beamバックアップを作成し、新しいものに置き換え、停止してから riak を開始します。すべてのノードでこれを繰り返すと、ビジネスに戻るはずです。

于 2013-08-08T05:43:58.477 に答える