如何使数据存储键mapreduce友好(-er)?

Pau*_*ius 5 google-app-engine mapreduce python-2.7

编辑:看我的回答.我们的代码存在问题.MR工作正常,可能有状态报告问题,但至少输入阅读器工作正常.

我现在多次运行实验,现在我确定mapreduce(或DatastoreInputReader)有奇怪的行为.我怀疑这可能与关键范围和分裂它们有关,但这只是我的猜测.

无论如何,这是我们的设置:

  1. 我们有一个名为"AdGroup"的NDB模型,在创建此模型的新实体时 - 我们使用从AdWords返回的相同ID(它是一个整数),但我们将其用作字符串: AdGroup(id=str(adgroupId))
  2. 我们的数据存储区中有1,163,871个这样的实体(这就是"数据存储管理"页面告诉我们的内容 - 我知道它不是完全准确的数字,但我们不经常创建/删除广告组,所以我们可以肯定地说,数量是110万或更多).
  3. mapreduce从这个开始(从另一个管道):

    yield mapreduce_pipeline.MapreducePipeline(
        job_name='AdGroup-process',
        mapper_spec='process.adgroup_mapper',
        reducer_spec='process.adgroup_reducer',
        input_reader_spec='mapreduce.input_readers.DatastoreInputReader',
        mapper_params={
            'entity_kind': 'model.AdGroup',
            'shard_count': 120,
            'processing_rate': 500,
            'batch_size': 20,
        },
    )
    
    Run Code Online (Sandbox Code Playgroud)

所以,我今天尝试多次运行这个mapreduce而不改变代码中的任何内容而不更改数据存储区.每次运行它时,mapper-calls计数器都有不同的值,范围从450,000到550,000.

如果我错了,请纠正我,但考虑到我使用非常基本的DatastoreInputReader - mapper-calls应该等于实体数量.所以它应该是110万或更多.

注意:我之所以首先注意到这个问题的原因是因为我们的营销人员开始抱怨"我们添加了新的广告组并且他们仍然没有显示在您的应用中,这已经过了4天!".

现在,我只能想到一种解决方法 - 将所有广告组的所有密钥写入blobstore文件(每行一个),然后使用BlobstoreLineInputReader.当然,写入blob部分必须以不使用DatastoreInputReader的方式编写.我现在应该继续这样做,还是可以提出更好的建议?

注意:我也尝试使用具有相同代码的DatastoreKeyInputReader - 结果类似 - 映射器调用介于450,000和550,000之间.

所以,最后问题.如何为实体生成ID很重要?使用intid而不是strid 更好吗?一般来说,我可以做些什么来使mapreduce更容易找到映射它们的所有实体?

PS:我还在试验这个,我可能会在以后添加更多细节.

Pau*_*ius 0

经过进一步调查,我们发现错误实际上是在我们的代码中。因此,mapreduce 实际上按预期工作(为每个数据存储实体调用映射器)。

我们的代码调用了一些有时会失败的谷歌服务函数(奇妙的神秘应用程序错误消息)。由于这些失败,MR 任务正在重试。但是,我们对任务队列重试设置了限制。MR 没有以任何方式检测或报告这一点 - MR 仍然在所有分片的状态页面中显示“成功”。这就是为什么我们认为我们的代码一切正常,但输入读取器有问题。