約200万件のレコードがあり、それぞれに重複がないかチェックする必要のある文字列フィールドが約4つあります。具体的には、フィールドとして名前、電話番号、住所、父親名があり、残りのデータとともにこれらすべてのフィールドを使用して重複排除を確認する必要があります。結果の一意のレコードをdbに記録する必要があります。
すべてのレコードのmapreduce、iterateを実装することができました。タスクレートは100/sに設定され、バケットサイズは100に設定されています。請求が有効になっています。
現在、すべてが機能していますが、パフォーマンスは非常に遅いです。10,000レコードのテストデータセットの中で、6時間で1000レコードの重複排除処理しか完了できませんでした。
Javaの現在の設計は次のとおりです。
- マップの反復ごとに、現在のレコードを前のレコードと比較します
- 前のレコードはdb内の単一のレコードであり、マップの反復ごとに別の前のレコードで上書きするグローバル変数のように機能します
- 比較はアルゴリズムを使用して行われ、結果は新しいエンティティとしてdbに書き込まれます
- 1つのMapreduceジョブの最後に、プログラムで別のジョブを作成します
- 前のレコード変数は、ジョブが残りのデータを含む次の候補レコードと比較するのに役立ちます
これを最短時間で達成するために、GAEリソースをいくらでも増やす準備ができています。
私の質問は次のとおりです。
- 重複排除(重複のチェック)の精度は、並列ジョブ/タスクによって影響を受けますか?
- この設計をどのように改善できますか?
- これは2000万レコードに拡大しますか
- 1つのmapreduceジョブ全体で使用できる、マップの反復中に変数(カウンターだけでなく)を読み書きするための最速の方法は何ですか。
フリーランサーはこれを支援することを大いに歓迎します。
ご協力いただきありがとうございます。