Проблема: Мы видим следующую проблему после обновления библиотеки MapReduce до последней версии (у нас была версия с использованием API файла и мы переключились, когда это стало устаревшим):Часть MapReduce Lib (PipelineBase) спорадически недоступного в очереди задач, в конечном счете, становится недоступным глобально
При запуске MapReducer в запущенных задачах PipelineBase из библиотеки спорадически становится недоступным, заставляя задачу сбой. При повторной попытке он работает нормально. По прошествии некоторого периода времени указанная часть библиотеки MapReduce становится полностью и глобально недоступной. Это означает, что он недоступен в обычном приложении или в задачах.
Единственный способ вернуть приложение снова - сбросить все экземпляры и заставить их перезагрузить весь код приложения с нуля.
Ошибка:
File "/process/custom_mapper/views.py", line 23, in <module> from process.custom_mapper.pipeline import CustomMapperPipeline
File "/process/custom_mapper/pipeline.py", line 7, in <module> class CustomMapperPipeline(PipelineBase):
TypeError: Error when calling the metaclass bases cannot create 'NoneType’ instances
Что означает, что PipelineBase нет. Глядя внутри библиотеки MapReduce, в base_handler.py, откуда PipelineBase импортируется, мы можем увидеть этот код:
try:
from mapreduce import pipeline_base
except ImportError:
pipeline_base = None
И потом:
if pipeline_base:
# For backward compatiblity.
PipelineBase = pipeline_base.PipelineBase
else:
PipelineBase = None
Наше предположение заключается в том, что импорт из MapReduce импорта pipeline_base не работает.
Дополнительная информация: Приложение использует Flask, а MapReducer запускается удаленно через внешнюю конечную точку. Эта конечная точка определена внутри urls.py, загружая класс контроллера mapper. Этот класс импортирует модуль CustomMapperPipeline. Это означает, что каждый раз, когда URL-адрес доступен, создается экземпляр класса CustomMapperPipeline. Если PipelineBase - None, то все приложение выходит из строя.
В какой-то момент времени PipelineBase становится полностью недоступным.
В соответствии с инструкциями пакет mapreducer находится в корне приложения, рядом с файлом app.yaml.
В настоящее время на MapReducer отправлено всего 2 объекта.
Наша реализация: Редуктор карты проходит через список предметов. Каждый элемент создает набор очередей заданий X-номера для обработки данных. Каждая из очередей задач X будет создавать Y количество очередей задач для обработки данных.
Мы используем следующий триггер для карты уменьшить:
yield MapreducePipeline(
job_name,
'process.custom_mapper.mappers.map_items',
'process.custom_mapper.mappers.reduce_items',
'process.custom_mapper.readers.ItemInputReader',
'mapreduce.output_writers.GoogleCloudStorageOutputWriter',
mapper_params={
[...]
},
reducer_params={
'output_writer': {
'mime_type': 'text/plain',
'bucket_name': bucket_name
}
}
)
CustomInputReader гарантирует, что каждый элемент распределяется по индивидуальному осколка.
Это может быть ошибка в новой версии - не могли бы вы открыть отчет об ошибке в трекер проблемы, https: // code.google.com/p/googleappengine/issues/list? Мы (Google Cloud Support) отслеживаем этот трекер и имеем хороший процесс для согласования сортировки и повышения таких ошибок с нашими коллегами в области инженерии. Благодаря! –
На вашем месте я бы хотел исключить условие гонки, возможно, в вашем коде или, возможно, нет. Установка «threadsafe: False» была бы интересным экспериментом. –