簡體   English   中英

AppEngine MapReduce NDB,DeadlineExceededError

[英]AppEngine MapReduce NDB, DeadlineExceededError

我們正在嘗試在我們的項目中大量使用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

我的問題是:

  • 我們如何避免這個錯誤?
  • 這項工作會發生什么,是否會對其進行重試(如果可以,我們如何控制它?)?
  • 到底會導致數據不一致嗎?

顯然,您進行的看跌期權太多,無法插入一個數據存儲區調用中。 您在這里有多種選擇:

  1. 如果這是相對罕見的事件,請忽略它。 Mapreduce將重試切片,並降低放置池的大小。 確保您的地圖是冪等的。
  2. 看看http://code.google.com/p/appengine-mapreduce/source/browse/trunk/python/src/mapreduce/context.py-在main.py中,您可以將DATASTORE_DEADLINEMAX_ENTITY_COUNTMAX_POOL_SIZE到降低整個mapreduce池的大小。

如果您使用的是InputReader,則可以調整默認的batch_size來減少每個任務處理的實體數。

我相信任務隊列會重試任務,但您可能不希望這樣做,因為它很可能會擊中相同的DeadlineExceededError。

數據不一致是可能的。

也請參閱此問題。 App Engine-使用Mapper API的任務隊列重試計數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM