2015-11-15 1 views
0

Проблема: Мы видим следующую проблему после обновления библиотеки 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 гарантирует, что каждый элемент распределяется по индивидуальному осколка.

+0

Это может быть ошибка в новой версии - не могли бы вы открыть отчет об ошибке в трекер проблемы, https: // code.google.com/p/googleappengine/issues/list? Мы (Google Cloud Support) отслеживаем этот трекер и имеем хороший процесс для согласования сортировки и повышения таких ошибок с нашими коллегами в области инженерии. Благодаря! –

+0

На вашем месте я бы хотел исключить условие гонки, возможно, в вашем коде или, возможно, нет. Установка «threadsafe: False» была бы интересным экспериментом. –

ответ

0

Похоже, что он не мог загрузить зависимость pipeline, используемую библиотекой MapReduce для управления конвейерами при работе с картой и сокращении рабочих мест. Библиотека конвейера была добавлена ​​как зависимость в файле requirements.txt, поэтому она находилась в другой папке, чем библиотека MapReduce, которая находилась в корне приложения.

Решение было вручную скопировать библиотеку pipeline в корень приложения.

Это такая легкая проблема, но это было сделано намного сложнее, так как был обработан импорт base_pipeline. Я открыл запрос на перенос, чтобы исправить это, и я жду ответа: https://github.com/GoogleCloudPlatform/appengine-mapreduce/pull/82

Смежные вопросы