提问者:小点点

GAE数据存储管理拷贝在MapReduce模型到JSON转换时失败


根据本文档,我正在尝试使用数据存储管理控制台将我的应用程序的数据存储复制到另一个应用程序。由于我的应用程序使用Java运行时,我按照指示安装了数据存储管理Python示例。我将应用程序设置为将其他应用程序服务器的ID列入白名单,并按照指示进行安装。几个月前,我用同样的方法复制了数据存储,虽然过程并不顺利,但最终还是成功了。

数据存储管理复制操作创建的任务未完成。默认队列中有 9 个任务(我尝试复制的每个实体类型一个)。任务的方法/URL是POST /_ah/mapreduce/kickoffjob_callback。他们不断尝试重试其操作,但不断失败。每个任务的标头如下所示:

X-AppEngine-Current-Namespace   
content-type    application/x-www-form-urlencoded
Referer         https://ah-builtin-python-bundle-dot-mysourceappid.appspot.com/_ah/datastore_admin/copy.do
Content-Length  970
Host            ah-builtin-python-bundle-dot-mysourceappid.appspot.com
User-Agent      AppEngine-Google; (+http://code.google.com/appengine)

任务以前的运行结果如下所示:

Dispatched time (UTC)       2013/05/26 08:02:47
Seconds late                0.00
Seconds to process task     0.50
Last http response code     500
Reason to retry             App Error

在目标应用程序下,我得到的任何传入拷贝操作的唯一指示是日志:

2013-05-26 01:55:37.798 /_ah/remote_api?rtok=66767762443
200 1832ms 0kb AppEngine-Google; (+http://code.google.com/appengine; appid: s~mysourceappid)
0.1.0.40 - - [26/May/2013:00:55:37 -0700] "GET /_ah/remote_api?rtok=66767762443 HTTP/1.1" 200 137 - "AppEngine-Google;
(+http://code.google.com/appengine; appid: s~mysourceappid)" "datastore-admin.mydestinationappid.appspot.com" ms=1833
cpu_ms=1120 cpm_usd=0.000015 loading_request=1 app_engine_release=1.8.0 instance=00c61b117c9beacd101ff92c542598f549f755cc
I 2013-05-26 01:55:37.797
This request caused a new process to be started for your application, and thus caused your application code to be loaded
for the first time. This request may thus take longer and use more CPU than a typical request for your application.

因此,这些请求至少会导致应用程序实例被启动,但除此之外,什么都没有发生,源应用程序只收到500个服务器错误。

我已经尝试在源和目标数据存储区上启用和禁用写入。我进行了两次、三次和四次检查,以确保在Python datastore admin示例中注册了正确的应用程序ID,并将代码上传到了两个应用程序服务器,即使它只在目的服务器上是必要的(它们都将对方的ID列入了白名单)。我试过HTTPS和HTTP网址。

ah-builtin-python-bundle-dot-mysourceappid.appspot.com/_ah/mapreduce/status不提供任何相关信息,只是说明任何任务没有任何进度或活动。如果我尝试从这里中止作业,它们也无法中止。为了停止作业,我必须直接从队列中删除任务。然后,我必须手动清理遗留的实体,包括_AE_DatastoreAdmin_Operation实体,这导致数据存储管理员仍然显示复制作业为活动,以及一堆_GAE_MR_MapreduceControl、_GAE_MR_MapreduceState和_GAE_MR_ShardState的实体。

出了什么问题?我真不敢相信,没有更多相关的日志数据或流程失败的信息。

更新:我昨晚一定很累,没有想到查看源应用程序啊内置python-bundle实例版本下的日志,因为这是数据存储管理操作发生的地方。这是我到达那里的日志输出:

2013-05-27 00:49:11.967 /_ah/mapreduce/kickoffjob_callback 500 320ms 1kb AppEngine-Google; (+http://code.google.com/appengine)
0.1.0.2 - - [26/May/2013:23:49:11 -0700] "POST /_ah/mapreduce/kickoffjob_callback HTTP/1.1" 500 1608 "https://ah-builtin-
python-bundle-dot-mysourceappid.appspot.com/_ah/datastore_admin/copy.do" "AppEngine-Google;
(+http://code.google.com/appengine)" "ah-builtin-python-bundle-dot-mysourceappid.appspot.com" ms=320 cpu_ms=80
cpm_usd=0.000180 queue_name=default task_name=706762757133111420 app_engine_release=1.8.0
instance=00c61b117c5825670de2531f27693bdc2ffb71
E 2013-05-27 00:49:11.966
super(type, obj): obj must be an instance or subtype of type
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/_webapp25.py", line 716, in __call__
    handler.post(*groups)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/base_handler.py", line 83, in post
    self.handle()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/handlers.py", line 1087, in handle
    spec, input_readers, queue_name, self.base_path(), state)
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/handlers.py", line 1159, in _schedule_shards
    output_writer=output_writer))
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/handlers.py", line 718, in _state_to_task
    params=tstate.to_dict(),
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/model.py", line 805, in to_dict
    "input_reader_state": self.input_reader.to_json_str(),
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/model.py", line 165, in to_json_str
    json = self.to_json()
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/mapreduce/input_readers.py", line 2148, in to_json
    json_dict = super(DatastoreKeyInputReader, self).to_json()
TypeError: super(type, obj): obj must be an instance or subtype of type

看起来复制任务在尝试将MapReduce数据模型转换为JSON时崩溃,因为输入读取器不是DatastoreKeyInputReader的子类型。这一定是版本 1.8.0 或自 1.7.5 以来的其他版本中引入的错误,这是上次运行数据存储复制操作时的当前 SDK 版本。


共1个答案

匿名用户

作为参考,这个问题已经解决,很快就会发布。

https://code.google.com/p/googleappengine/issues/detail?id=9388