在app引擎的java实例中,我使用mapreduce进行迭代 一组实体进行一些总结。
当我使用10个分片运行时,我得到了很多这些:
/mapreduce/workerCallback
com.google.apphosting.api.ApiProxy$RequestTooLargeException:
The request to API call datastore_v3.Put() was too large.
我的映射器正在尝试处理大约70,000个实体,每个实体大约750个字节。 对于每次调用我的映射器,我可能会进行几十次数据存储读取,也许两次 数据存储更新。
我确定我的个人实体远不及1MB的数据存储限制。 运行更多分片并没有多大帮助。
我注意到mapreduce添加了一些实体类型,其中一个是MR-IncrementalTask。 当出现这些错误时,MR-IncrementalTask实体变大,如800k或900k。 我怀疑这些错误与这些错误有关。
那么,那么,为什么这些变得如此之大,我可能会做些什么 那有助于此吗?
感谢所有人。
答案 0 :(得分:0)
您是正确的,mapper类被序列化并在任务队列执行任务之间写入数据存储区。这为映射器的任何成员变量提供了连续性,这些变量在运行时进行了更新。
减少与此数据相关的问题变大,并降低开销或读取和写入数据。较新版本的MapReduce会压缩此状态。