0

在应用程序引擎的 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。我怀疑这些错误与这些变得太大有关。

那么,为什么这些会变得如此之大,我会做什么样的事情来促成呢?

谢谢大家。

4

1 回答 1

0

您是正确的,映射器类在任务队列中的任务执行之间被序列化并写入数据存储区。这为在运行时更新的映射器的任何成员变量提供了连续性。

减少与此数据变大相关的问题,并降低开销或读写它。较新版本的 MapReduce 会压缩此状态。

于 2014-04-15T20:04:22.353 回答