Fatias MapReduce mais longas no AppEngine

A nova versão da estrutura MapReduce do AppEngine depende do blobstore para armazenar os resultados intermediários dos mapeadores. No início de cada fatia, o arquivo de resultado intermediário do fragmento no blobstore é aberto e mantido aberto durante a fatia, acrescentando pares de chave / valor conforme são emitidos pelo mapeador.

O problema com isso é que a API Files permite que você mantenha um arquivo aberto por cerca de 30 segundos – por mais tempo e você receberá uma exceção “ApplicationError: 10” de som opaco.

Às vezes, você deseja ou precisa que as fatias sejam executadas por mais de 30 segundos padrão – talvez demore mais de 30 segundos para substituir um elemento de entrada ou talvez seu mapeador carregue algum estado no início de cada fatia que você prefere não faça duas vezes por minuto.

Podemos corrigir isso armazenando em buffer a saída dos mapeadores e abrindo o arquivo blobstore apenas quando liberamos os resultados para o blobstore. (Consulte http://code.google.com/p/appengine-mapreduce/issues/detail?id=144#c3 ) Desde que os itens de trabalho individuais possam ser gravados no blobstore em menos de 30 segundos, podemos definir nossas fatias para ser tão longo quanto necessário, especialmente se você executar o trabalho em um back-end do AppEngine em vez de instâncias de front-end.

Por exemplo, defina um back-end dinâmico com até 10 instâncias em seu arquivo backends.xml:

<backends>
<backend name="mapreduce-backend">
<class>B2</class>
<instances>10</instances>
<options>
<public>false</public>
<dynamic>true</dynamic>
</options>
</backend>
</backends>

Agora você pode configurar seu trabalho mapreduce para ser executado neste back-end, com fatias mais longas:

MapReduceSettings settings = new MapReduceSettings()
.setBackend("mapreduce-backend")
.setWorkerQueueName("mapreduce-workers")
.setControllerQueueName("default")
.setMillisPerSlice(5 * 60 * 1000);

Você pode obter a versão corrigida do repositório maven do bedatadriven:

 <dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-mapreduce</artifactId>
<version>r351-bedatadriven1</version>
</dependency>

<repository>
<id>bedatadriven-public</id>
<name>Bedatadriven Public Repository</name>
<url>http://nexus.bedatadriven.com/content/groups/public</url>
</repository>