根据this documentation,我正在尝试使用数据存储管理控制台将我的应用的数据存储区复制到另一个应用。由于我的应用程序使用Java运行时,因此按照说明安装了datastore admin Python sample。我将应用程序设置为将其他应用服务器的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数据存储区管理示例中注册了正确的应用程序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实体。
出了什么问题?我无法相信没有更多相关的日志数据或有关流程失败的信息。
更新 昨晚我一定很累,并且没想到在源应用程序ah-builtin-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版本。
答案 0 :(得分:0)
作为参考,这已经修复,很快就会出来。
https://code.google.com/p/googleappengine/issues/detail?id=9388