Является ли 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
, учитывая, что существует много объектов, и очень маловероятно, что одни и те же целые числа были выбраны повторно.