2

サイズが最大5GBのデータセットがあります。この大きなデータセットには、行ごとにキーと値のペアがあります。ここで、これをキーの値について数十億回読み取る必要があります。

私はすでにMapDBのディスクベースのアプローチを試しましたが、それはスローConcurrentModification Exceptionされ、実稼働環境で使用するにはまだ十分に成熟していません。

また、それをDBに入れて、何十億回も呼び出しを行いたくありません(ただし、ここで特定のレベルのメモリ内キャッシュを実行できます)。

基本的に、Hadoopのジョブステップのマッパー/リデューサーでこれらのKey-Valueデータセットにアクセスする必要があります。

4

4 に答える 4

3

いろいろ試した結果、現在は SQLite を使用しています。

以下は私たちがしたことです:

  1. すべてのキーと値のペアのデータを事前定義されたデータベース ファイルに読み込みます (キー列にインデックスを付けましたが、ファイル サイズは大きくなりましたが、それだけの価値がありました)。
  2. このファイル (key-value.db) を S3 に保存します。
  3. これは、分散キャッシュとして Hadoop ジョブに渡されます。
  4. Mapper/Reducer の Configure で db ファイルへの接続が開かれます (約 50 ms かかります)。
  5. map/reduce メソッドで、キーを使用してこのデータベースにクエリを実行します (ごくわずかな時間しかかからず、プロファイリングする必要さえありませんでした。それはごくわずかでした!)
  6. Mapper/Reducer の cleanup メソッドで接続を閉じました
于 2012-12-13T17:34:04.180 に答える
0

これにelastic-map-reduceのタグを付けていることに気づきました...AWSで実行している場合は、DynamoDBが適切かもしれません。

また、明確にしておきたいのは、このデータセットがMapReduceジョブへの入力になるのか、それともMapReduceジョブ中にランダムにアクセスされる補足データセットなのかということです。

于 2012-12-05T00:49:28.680 に答える
0

Redisを試してください。これはまさにあなたが必要としているもののようです。

于 2012-12-04T15:38:37.283 に答える
0

私はOracle Berkerley DB Java Editionを試してみます。これは Maps をサポートし、成熟しておりスケーラブルです。

于 2012-12-04T15:57:26.823 に答える