0

プロジェクトでMapReduceを多用しようとしています。現在、この問題が発生しています。ログには「DeadlineExceededError」エラーが多数あります...

その一例(トレースバックは毎回少し異なります):

Traceback (most recent call last):
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/runtime/wsgi.py", line 207, in Handle
    result = handler(dict(self._environ), self._StartResponse)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1505, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 1077, in __call__
    return handler.dispatch()
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.3/webapp2.py", line 545, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~sba/1.362471299468574812/mapreduce/base_handler.py", line 65, in post
    self.handle()
  File "/base/data/home/apps/s~sba/1.362471299468574812/mapreduce/handlers.py", line 208, in handle
    ctx.flush()
  File "/base/data/home/apps/s~sba/1.362471299468574812/mapreduce/context.py", line 333, in flush
    pool.flush()
  File "/base/data/home/apps/s~sba/1.362471299468574812/mapreduce/context.py", line 221, in flush
    self.__flush_ndb_puts()
  File "/base/data/home/apps/s~sba/1.362471299468574812/mapreduce/context.py", line 239, in __flush_ndb_puts
    ndb.put_multi(self.ndb_puts.items, config=self.__create_config())
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3625, in put_multi
    for future in put_multi_async(entities, **ctx_options)]
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 323, in get_result
    self.check_success()
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 318, in check_success
    self.wait()
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 302, in wait
    if not ev.run1():
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/eventloop.py", line 219, in run1
    delay = self.run0()
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/eventloop.py", line 181, in run0
    callback(*args, **kwds)
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 365, in _help_tasklet_along
    value = gen.send(val)
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/ndb/context.py", line 274, in _put_tasklet
    keys = yield self._conn.async_put(options, datastore_entities)
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1560, in async_put
    for pbs, indexes in pbsgen:
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1350, in __generate_pb_lists
    incr_size = pb.lengthString(pb.ByteSize()) + 1
DeadlineExceededError

私の質問は次のとおりです。

  • このエラーを回避するにはどうすればよいですか?
  • ジョブはどうなりますか、再試行されますか (再試行される場合、どのように制御できますか?)
  • 最終的にデータの不整合が発生しますか?
4

2 に答える 2

3

どうやら、1 回のデータストア呼び出しで挿入できるよりも多くのプットを実行しているようです。ここには複数のオプションがあります。

  1. これが比較的まれなイベントである場合は、無視してください。Mapreduce はスライスを再試行し、プット プール サイズを小さくします。マップがべき等であることを確認してください。
  2. http://code.google.com/p/appengine-mapreduce/source/browse/trunk/python/src/mapreduce/context.pyをご覧ください- main.py で を下げるかDATASTORE_DEADLINE、サイズを下げることができますmapreduce 全体のプールの。MAX_ENTITY_COUNTMAX_POOL_SIZE
于 2012-10-18T18:21:57.013 に答える
2

InputReader を使用している場合は、デフォルトの batch_size を調整して、各タスクで処理されるエンティティの数を減らすことができる場合があります。

タスク キューはタスクを再試行すると思いますが、同じ DeadlineExceededError が発生する可能性が高いため、おそらく再試行したくないでしょう。

データの不整合が発生する可能性があります。

この質問も参照してください。 App Engine - Mapper API を使用したタスク キューの再試行回数

于 2012-10-16T15:13:31.907 に答える