Skip to main content
 首页 » 编程设计

python之设置 App Engine mapreduce 分片大小

2025年05月04日22zhoujg

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

我正在使用 App Engine mapreduce API 并提供了 shard_size kwarg 设置我的 mapreduce 分片大小。

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

map 作业似乎很好地分片,但 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 具体给每个实体分配一个分片,分片是根据分片大小随机确定的。我很困惑为什么我的 reducer 的分片比 SHARD_SIZE 少,因为有很多实体,而且重复选择相同的整数的可能性极小。

请您参考如下方法:

我对你在这里做什么感到困惑。使用映射阶段将内容分组到一个小的分片键上,然后在减少时间处理这些键看起来很奇怪。您最终会为每个键完成太多工作,即使您确实聘用了与 mapper worker 一样多的 reduce worker。

正在处理的“批处理”是随机任意的,因此我假设 expensive_side_effect() 不依赖于批处理的内容。为什么不在 map time 进行这项工作,发出 reduced 可以传递给输出编写器的东西?