Python AppEngine MapReduce NDB,死线超出错误

Python AppEngine MapReduce NDB,死线超出错误,python,google-app-engine,mapreduce,app-engine-ndb,Python,Google App Engine,Mapreduce,App Engine Ndb,我们试图在项目中大量使用MapReduce。 现在我们遇到了这个问题,日志中有很多“死线超出derror”错误 其中一个示例(回溯每次略有不同): 我的问题是: 我们如何避免这个错误 作业会发生什么情况,是否会重试(如果是,我们如何控制它?) 最终是否会导致数据不一致 如果您使用的是InputReader,则可以调整默认的批处理大小,以减少每个任务处理的实体数 我相信任务队列将重试任务,但您可能不希望它重试,因为它可能会遇到相同的死线ExceederRor 数据不一致是可能的 请看这个问题。

我们试图在项目中大量使用MapReduce。 现在我们遇到了这个问题,日志中有很多“死线超出derror”错误

其中一个示例(回溯每次略有不同):

我的问题是:

  • 我们如何避免这个错误
  • 作业会发生什么情况,是否会重试(如果是,我们如何控制它?)
  • 最终是否会导致数据不一致

如果您使用的是InputReader,则可以调整默认的批处理大小,以减少每个任务处理的实体数

我相信任务队列将重试任务,但您可能不希望它重试,因为它可能会遇到相同的死线ExceederRor

数据不一致是可能的

请看这个问题。

如果您使用的是InputReader,则可以调整默认的批处理大小,以减少每个任务处理的实体数

我相信任务队列将重试任务,但您可能不希望它重试,因为它可能会遇到相同的死线ExceederRor

数据不一致是可能的

请看这个问题。

显然,您执行的PUT太多,无法在一个数据存储调用中插入。这里有多个选项:

  • 如果这是一个相对罕见的事件-忽略它。Mapreduce将重试该切片并降低put池大小。确保你的地图是幂等的
  • 看一看-在main.py中,您可以降低
    DATASTORE\u DEADLINE
    MAX\u ENTITY\u COUNT
    MAX\u POOL\u SIZE
    以降低整个mapreduce的池大小

  • 显然,您所做的put太多,无法在一个数据存储调用中插入。这里有多个选项:

  • 如果这是一个相对罕见的事件-忽略它。Mapreduce将重试该切片并降低put池大小。确保你的地图是幂等的
  • 看一看-在main.py中,您可以降低
    DATASTORE\u DEADLINE
    MAX\u ENTITY\u COUNT
    MAX\u POOL\u SIZE
    以降低整个mapreduce的池大小

  • 你一步做的工作太多了吗?似乎是这样;)现在我们正在测试批量大小,这似乎有帮助。需要更多的测试,我可能会接受dragonx的答案。您一步做的工作是否太多?似乎是这样;)现在我们正在测试批量大小,这似乎有帮助。需要更多的测试,我可能会接受dragonx的答案。
    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