Google App Engine: используйте mapreduce для очистки хранилища данных - PullRequest
1 голос
/ 11 сентября 2010

Я пытаюсь использовать ранний экспериментальный выпуск реализации mapper для очистки хранилища данных. Это решение было предложено в аналогичном вопросе SO .

Это 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>
...

Когда я вхожу в панель управления mapreduce в mydomain / mapreduce / status, я могу запускать задачи, но они никогда не завершаются. Это скриншот, где вы можете увидеть поле "0/0 осколков":

mapreduce control panel

И я вижу, что некоторые задачи создаются в очереди задач по умолчанию appengine , с большим количеством попыток:

appengine task queue

Наконец, в журналах приложений GAE я вижу:

1. 09-11 03:23 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-Google; (+ 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-м-000002-1--0

2. Вт 09-11 03:23 18.638

  Request was aborted after waiting too long to attempt to service

ваш запрос. Это может случиться время от времени, когда App Engine обслуживающий кластер неожиданно высокая или неравномерная нагрузка. Если вы видите это сообщение часто, пожалуйста, свяжитесь с Команда App Engine.

Что может происходить? Я уверен, что выполнил шаги, описанные в руководстве по началу работы , и у меня в хранилище данных менее 1000 объектов ...

1 Ответ

1 голос
/ 13 сентября 2010

Ну, проблема не имеет ничего общего с appengine-mapreduce. Я защищал / mapreduce / ** URI, поэтому задача в очереди задач по умолчанию не имела доступа к / mapreduce / mapperCallback, / mapreduce / command / start_job и т. Д., Поскольку информация об имени пользователя / пароле не отправляется.

В любом случае, это интересная проблема, потому что я не хочу открывать / mapreduce / ** для всех ...

...