Python 设置应用程序引擎mapreduce碎片大小

Python 设置应用程序引擎mapreduce碎片大小,python,google-app-engine,mapreduce,Python,Google App Engine,Mapreduce,App Engine Mapreduce API是否在最终的reduce作业中根据自己的逻辑决定计算碎片大小 我正在使用应用程序引擎mapreduce API,并提供了碎片大小 kwarg设置我的mapreduce碎片大小 碎片大小在我的mapreduce作业中特别重要,因为我不想在执行reduce函数的最后一步时将太多的结果批处理到任何一个结果中。换句话说,我正在对碎片大小进行硬编码,以便根据系统上的外部约束将用户平均分配 映射工作似乎可以很好地进行切分,但是reducer只使用了我指定的切分

App Engine Mapreduce API是否在最终的reduce作业中根据自己的逻辑决定计算碎片大小

我正在使用应用程序引擎mapreduce API,并提供了碎片大小 kwarg设置我的mapreduce碎片大小

碎片大小在我的mapreduce作业中特别重要,因为我不想在执行reduce函数的最后一步时将太多的结果批处理到任何一个结果中。换句话说,我正在对碎片大小进行硬编码,以便根据系统上的外部约束将用户平均分配

映射工作似乎可以很好地进行切分,但是reducer只使用了我指定的切分的一小部分

下面是我正在处理的代码类型的大致概述:

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专门为每个实体分配一个根据碎片大小随机确定的碎片。我不明白为什么我的减缩器的碎片会比碎片大小少,因为有很多实体,而且重复拾取相同的整数的可能性非常小。

我不明白你在这里做什么。使用映射阶段将内容分组到一个小的切分键上,稍后在缩短时间时处理这些键看起来很奇怪。每个关键点都会有太多的工作要做,即使您使用的reduce workers和mapper workers一样多


正在处理的“批处理”是随机的,因此我假设昂贵的副作用不依赖于批处理的内容。为什么不在映射时执行该操作,发出一些reduced可以传递给输出编写器的信息呢?

我对您在这里所做的工作感到困惑。使用映射阶段将内容分组到一个小的切分键上,稍后在缩短时间时处理这些键看起来很奇怪。每个关键点都会有太多的工作要做,即使您使用的reduce workers和mapper workers一样多

正在处理的“批处理”是随机的,因此我假设昂贵的副作用不依赖于批处理的内容。为什么不改为在映射时工作,发出一些reduced可以传递给输出编写器的东西呢