編集:私の答えを見てください。問題はコードにありました。MR は正常に動作します。ステータス レポートに問題がある可能性がありますが、少なくとも入力リーダーは正常に動作します。
実験を数回実行したところ、mapreduce (または DatastoreInputReader) の動作がおかしいことがわかりました。これはキー範囲とそれらの分割に関係があるのではないかと思いますが、それは私の推測です。
とにかく、これが私たちが持っているセットアップです:
- このモデルの新しいエンティティを作成するときに、「AdGroup」と呼ばれる NDB モデルがあります。AdWords から返されたものと同じ ID (整数) を使用しますが、それを文字列として使用します。
AdGroup(id=str(adgroupId))
- データストアにはこれらのエンティティが 1,163,871 あります (「データストア管理者」ページに表示されているとおりです。完全に正確な数字ではないことは承知していますが、広告グループを頻繁に作成/削除するわけではないため、確実に言えるのは、数は 110 万以上)。
mapreduce は次のように (別のパイプラインから) 開始されます。
yield mapreduce_pipeline.MapreducePipeline( job_name='AdGroup-process', mapper_spec='process.adgroup_mapper', reducer_spec='process.adgroup_reducer', input_reader_spec='mapreduce.input_readers.DatastoreInputReader', mapper_params={ 'entity_kind': 'model.AdGroup', 'shard_count': 120, 'processing_rate': 500, 'batch_size': 20, }, )
そのため、コードを何も変更せず、データストアも変更せずに、今日この mapreduce を数回実行しようとしました。実行するたびに、mapper-calls カウンターの値が 450,000 から 550,000 の範囲で変化しました。
間違っている場合は訂正してください。ただし、非常に基本的な DatastoreInputReader を使用していることを考えると、mapper-calls はエンティティの数と同じにする必要があります。したがって、110 万以上になるはずです。
注: 最初にこの問題に気付いたのは、マーケティング担当者が「新しい広告グループを追加してから 4 日経ちましたが、まだアプリに表示されない!」と不平を言い始めたためです。
現時点で考えられる回避策は 1 つだけです。すべての広告グループのすべてのキーをブロブストア ファイル (1 行に 1 つ) に書き込んでから、BlobstoreLineInputReader を使用することです。もちろん、blob への書き込み部分は、DatastoreInputReader を使用しない方法で記述する必要があります。今のところこれで行くべきですか、それとももっと良いものを提案できますか?
注: 同じコードで DatastoreKeyInputReader を使用してみました。結果は同様でした。マッパー呼び出しは 450,000 から 550,000 の間でした。
では、最後に質問です。エンティティの ID を生成する方法は重要ですか? int
ID の代わりにIDを使用する方が良いstr
ですか? 一般に、mapreduce がそれらをマッピングしているすべてのエンティティを見つけやすくするにはどうすればよいでしょうか?
PS: 私はまだこれを試している最中です。後で詳細を追加する可能性があります。