Google App Engine:使用mapreduce清空数据存储区

时间:2010-09-11 10:38:07

标签: google-app-engine google-cloud-datastore mapreduce

我正在尝试使用early experimental release of mapper implementation清空数据存储区。该解决方案是在similar SO question中提出的。

这是我目前正在使用的 AppEngineMapper 。它只是删除实体。

public class EmptyFixesMapper extends AppEngineMapper<Key, Entity, NullWritable, NullWritable> {

    public EmptyFixesMapper() {
    }

    @Override
    public void taskSetup(Context context) {
    }

    @Override
    public void taskCleanup(Context context) {
    }

    @Override
    public void setup(Context context) throws IOException, InterruptedException {
        super.setup(context);
    }

    @Override
    public void cleanup(Context context) {
        getAppEngineContext(context).flush();
    }

    @Override
    public void map(Key key, Entity value, Context context) {
        log.warning("Mapping key: " + key);

        DatastoreMutationPool mutationPool = 
                    this.getAppEngineContext(context).getMutationPool();
        mutationPool.delete(value.getKey());
    }
}

这是我的 mapreduce.xml 配置文件:

<configurations>
    <configuration name="Empty Entities">
        <property>
            <name>mapreduce.map.class</name>
            <value>com.google.appengine.demos.mapreduce.EmptyFixesMapper</value>
        </property>
        <property>
            <name>mapreduce.inputformat.class</name>
            <value>com.google.appengine.tools.mapreduce.DatastoreInputFormat</value>
        </property>
        <property>
            <name human="Entity Kind to Map Over">mapreduce.mapper.inputformat.datastoreinputformat.entitykind</name>
            <value template="optional">Fix</value>
        </property>
    </configuration>
...

当我在mydomain / mapreduce / status中进入 mapreduce控制面板时,我可以启动任务,但它们永远不会完成。这是截图,您可以在其中看到字段“0/0分片”:

mapreduce control panel

我可以看到在 appengine默认任务队列中创建了一些任务,并进行了大量重试:

appengine task queue

最后,在我的GAE应用程序日志中,我看到:

  

1。         09-11 03:23 AM 08.556 / mapreduce / mapperCallback 500 10081ms   0cpu_ms 0kb AppEngine-Google;   (+ http://code.google.com/appengine

  0.1.0.2 - - [11/Sep/2010:03:23:18 -0700] "POST
     

/ mapreduce / mapperCallback HTTP / 1.1“   500 0   “http://xxx.appspot.com/mapreduce/command/start_job”   “AppEngine上,谷歌;   (+ http://code.google.com/appengine)”   xxx.appspot.com“ms = 10081 cpu_ms = 0   api_cpu_ms = 0 cpm_usd = 0.000057   queue_name =默认   TASK_NAME =工人试图-1284198892815-0001-M-000002-1--0

     

2。         W 09-11 03:23 AM 18.638

  Request was aborted after waiting too long to attempt to service
     

你的要求。这可能发生   偶尔在App Engine时   服务集群意外   高负荷或不均匀负荷。如果你看到这个   留言频繁,请联系   App Engine团队。

可能会发生什么?我确信我已按照getting started guide中描述的步骤进行操作,数据存储区中的实体数量少于1000个......

1 个答案:

答案 0 :(得分:1)

嗯,问题与appengine-mapreduce无关。我正在保护/ mapreduce / ** URI,因此默认任务队列中的任务无法访问/ mapreduce / mapperCallback,/ mapreduce / command / start_job等,因为没有发送用户名/密码信息。

无论如何这是一个有趣的问题,因为我真的不想向所有人开放/ mapreduce / ** ......