2012-06-19 2 views
2

Является ли API-интерфейс API App Engine вычислять размер осколков в соответствии с его собственной логикой в ​​конечном сокращении задания?Настройка App Engine mapreduce shard size

Я использую API-интерфейс API-интерфейса App Engine и предоставил shard_size kwarg, чтобы установить размер моего края карты.

Размер осколка особенно важен в моей задаче mapreduce, потому что я не хочу выставлять слишком много результатов в любое заданное выполнение заключительного этапа моей функции уменьшения. Другими словами, я жестко кодирую размер осколка, чтобы равномерно разделить пользователей по внешнему ограничению в системе.

Работа с картой, похоже, очень сложная, но редуктор использует только часть осколков, которые я обозначил.

Вот грубый набросок своего рода код, который я имею дело с:

SHARD_SIZE = 42 

def map_fun(entity): 
    shard_key = random.randint(1, SHARD_SIZE) 
    yield (
    shard_key, 
    db.model_to_protobuf(entity).SerializeToString().encode('base64') 
) 

def reduce_fun(key, entities): 
    batch = [] 
    for entity in entities: 
    #check for stuff 
    batch.append(entity) 
    expensive_side_effect(batch) 


class MyGreatPipeline(base_handler.PipelineBase): 
    def run(self, *args, **kw): 
    yield mapreduce_pipeline.MapreducePipeline(
     'label' 
     'path.to.map_fun', 
     'path.to.reduce_fun', 
     'mapreduce.input_readers.DatastoreInputReader', 
     'mapreduce.output_writers.BlobstoreOutputWriter', 
     mapper_params={ 
     'entity_kind': 'path.to.entity', 
     'queue_name': 'coolQueue' 
     }, 
     reducer_params={}, 
     shard_size = SHARD_SIZE 
    ) 

map_fun специально присваивает каждый объект осколок, который определяется случайным образом в зависимости от размера шарда. Я смущен тем, почему мой редуктор будет иметь меньше осколков, чем SHARD_SIZE, учитывая, что существует много объектов, и очень маловероятно, что одни и те же целые числа были выбраны повторно.

ответ

0

Я озадачен тем, что вы здесь делаете. Использование фазы карты для группировки на небольшой, оштукатуренный ключ, более поздняя обработка этих ключей при сокращении времени выглядит странно. У вас будет слишком много работы, чтобы сделать за ключ, даже если вы занимаетесь тем, что сокращаете количество работников, как и работники-карперы.

Обработка «партия» случайна произвольно, поэтому я предполагаю, что expensive_side_effect() не зависит от содержимого партии. Почему бы не сделать эту работу вместо времени карты, испустив что-то, что уменьшилось, могло бы пройти к выходному писателю?

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