5

編集:私の答えを見てください。問題はコードにありました。MR は正常に動作します。ステータス レポートに問題がある可能性がありますが、少なくとも入力リーダーは正常に動作します。

実験を数回実行したところ、mapreduce (または DatastoreInputReader) の動作がおかしいことがわかりました。これはキー範囲とそれらの分割に関係があるのではないかと思いますが、それは私の推測です。

とにかく、これが私たちが持っているセットアップです:

  1. このモデルの新しいエンティティを作成するときに、「AdGroup」と呼ばれる NDB モデルがあります。AdWords から返されたものと同じ ID (整数) を使用しますが、それを文字列として使用します。AdGroup(id=str(adgroupId))
  2. データストアにはこれらのエンティティが 1,163,871 あります (「データストア管理者」ページに表示されているとおりです。完全に正確な数字ではないことは承知していますが、広告グループを頻繁に作成/削除するわけではないため、確実に言えるのは、数は 110 万以上)。
  3. 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 を生成する方法は重要ですか? intID の代わりにIDを使用する方が良いstrですか? 一般に、mapreduce がそれらをマッピングしているすべてのエンティティを見つけやすくするにはどうすればよいでしょうか?

PS: 私はまだこれを試している最中です。後で詳細を追加する可能性があります。

4

1 に答える 1

0

さらに調査した結果、エラーは実際にはコードにあることがわかりました。そのため、mapreduce は実際には期待どおりに機能します (すべてのデータストア エンティティに対してマッパーが呼び出されます)。

私たちのコードは、時々失敗していたいくつかの Google サービス関数を呼び出していました (すばらしい不可解な ApplicationError メッセージ)。これらの失敗により、MR タスクが再試行されていました。ただし、タスクキューの再試行には制限を設けています。MR はこれを検出したり報告したりしませんでした。MR はすべてのシャードのステータス ページで「成功」を表示していました。そのため、コードはすべて問題なく、入力リーダーに何か問題があると考えました。

于 2013-03-26T08:00:44.407 に答える