编辑:请看我的答案。问题就在我们的代码里。MR工作正常,它可能存在状态报告问题,但至少输入读取器工作正常。
现在我做了几次实验,现在我确信mapreduce (或DatastoreInputReader)有着奇怪的行为。我怀疑这可能与密钥范围和分割它们有关,但这只是我的猜测。
总之,下面是我们的设置:
AdGroup(id=str(adgroupId))因此,我今天已经尝试运行了几次mapreduce,而没有更改代码中的任何内容,也没有对数据存储进行任何更改。每次我运行它,地图呼叫柜台有一个不同的价值从45万到55万。
如果我错了,请纠正我,但是考虑到我使用的是非常基本的DatastoreInputReader -mapper-调用应该等于实体的数量。所以应该是110万甚至更多。
注意:我之所以一开始就注意到这个问题,是因为我们的营销人员开始抱怨说:“在我们添加了新的广告群4天后,他们仍然没有出现在你的应用程序中!”
现在,我只能想到一个解决办法--将所有广告组的所有键写入blobstore文件(每行一个),然后使用BlobstoreLineInputReader。当然,对blob部分的编写必须以不使用DatastoreInputReader的方式编写。我现在应该这样做,或者你能提出更好的建议吗?
注意:我也尝试用相同的代码使用DatastoreKeyInputReader --结果相似--映射器--调用在45万到55万之间。
所以终于有问题了。如何为实体生成Is很重要吗?使用int ids比使用str ids更好吗?一般来说,我能做些什么来使mapreduce更容易地找到映射它们的所有实体?
PS:我还在试验这个过程,我以后可能会添加更多的细节。
发布于 2013-03-26 08:00:44
经过进一步的研究,我们发现错误实际上在我们的代码中。因此,mapreduce实际上按预期工作(为每个数据存储实体调用mapper)。
我们的代码调用了一些谷歌服务功能,这些功能有时会失败(奇妙的神秘的ApplicationError消息)。由于这些失败,任务先生被重新审判。但是,我们已经对任务队列重试设置了一个限制。先生没有发现也没有以任何方式报告这一点--先生仍然在所有碎片的状态页面上显示出“成功”。这就是为什么我们认为我们的代码一切都很好,并且输入读取器有问题。
https://stackoverflow.com/questions/15252616
复制相似问题