後世のために、Xueling が Hadoop メーリング リストで受け取った回答を次に示します。
まず、Xueling からの詳細:
データセットは頻繁に更新されません。ただし、データ セットに対するクエリは頻繁に行われます。クエリは速ければ速いほどよい。たとえば、Mysql データベース (24 のテーブルにランダムに分散された 50 億のレコード) でテストを行ったところ、最大のテーブル (4 億レコード) に対する最も遅いクエリは約 12 分です。したがって、Hadoop 製品を使用することで検索を高速化できる場合、その製品は私たちが探しているものです。
Cloudera の Todd Lipcon からの応答:
その場合、次のことをお勧めします。
- すべてのデータを HDFS に置く
- 一致した位置でデータを並べ替える MapReduce ジョブを作成する
このジョブの 2 番目の出力として、「スパース インデックス」を作成できます。基本的には、次のようなエントリのセットです。
基本的に、10K レコードごとにオフセットを与えているところです。10,000 レコードごとにインデックスを作成する場合、合計 50 億は 100,000 のインデックス エントリを意味します。各インデックス エントリは 20 バイトを超えてはならないため、100,000 エントリは 2MB になります。これは非常に簡単にメモリに収まります。(おそらく、代わりに 100 レコードごとにインデックスを作成し、最終的に 200MB になる可能性がありますが、それでもメモリに簡単に収まります)
次に、カウント範囲クエリを満たすために、メモリ内のスパース インデックスをスキャンするだけです。索引付けされたブロックの一部は範囲に完全に含まれます。その場合は、「次のエントリ数」列を合計するだけです。開始ブロックと終了ブロックは部分的にカバーされるため、ファイル オフセット情報を使用してそのファイルを HDFS からロードし、そのオフセットで読み取りを開始し、カウントを終了できます。
クエリあたりの合計時間は 100 ミリ秒未満で問題ありません。
その後のいくつかの返信では、HBase が提案されました。