代码之家  ›  专栏  ›  技术社区  ›  Brad

GAE映射程序生成“无配额,正在中止”错误

  •  0
  • Brad  · 技术社区  · 14 年前

    我正在尝试使用此处的映射程序框架(java版本)在Google应用程序引擎上设置映射程序作业: http://code.google.com/p/appengine-mapreduce/

    我通过这样的代码开始工作:

    Configuration conf = new Configuration(false);
    conf.setClass("mapreduce.map.class", MyMapper.class, Mapper.class);
    conf.setClass("mapreduce.inputformat.class", DatastoreInputFormat.class, InputFormat.class);
    conf.set(DatastoreInputFormat.ENTITY_KIND_KEY, "Organization");
    
    // Queue up the mapper request.
    String configString = ConfigurationXmlUtil.convertConfigurationToXml(conf);
    Queue queue = GaeQueueFactory.getQueue(QUEUE_NAME);
    queue.add(
            Builder.url("/mapreduce/start")
            .param("configuration", configString));
    

    我在dev服务器和prod服务器上的日志中发现以下错误:

    com.google.appengine.tools.mapreduce.MapReduceServlet processMapper: No quota. Aborting!
    

    没有额外的堆栈跟踪。每次我试着开始一项工作时,这种情况会出现十几次。

    2 回复  |  直到 14 年前
        1
  •  0
  •   systempuntoout    14 年前

    我认为您没有足够的配额来处理具有预定义默认值的映射器作业。

    试着降低这些 configuration 参数:

    mapreduce.mapper.inputprocessingrate
    所有映射程序每秒处理的实体总数。
    用于防止在短时间内用完大量配额。
    默认1000

    mapreduce.mapper.shardcount
    要使用的并发工作线程数。
    这也决定了要将输入分成的碎片的数量
    默认值=8

        2
  •  0
  •   Brad    14 年前

    我已经解决了这个问题,并在这里为其他有这个问题的人录制。最让我困惑的是,它几周前还在工作,最近好像停了下来。因为应用程序没有在生产环境中使用,所以没有人注意到。

    改变的是,我向自定义的“映射器”任务队列发送映射请求;而不是默认的任务队列。因为我有多个映射器作业,所以为所有要使用的映射器作业设置了不同的队列:

    <queue>
        <name>mapper</name>
        <rate>5/s</rate>
        <bucket-size>10</bucket-size>
    </queue>
    

    当我将代码切换回使用默认队列时,一切都按预期工作。我在这里向地图绘制团队提交了一个错误: http://code.google.com/p/appengine-mapreduce/issues/detail?id=73