appengine-mapreduce对运营有限制吗?

时间:2012-05-15 19:59:38

标签: python xml google-app-engine mapreduce blobstore

我正在开发一个项目,需要根据文本中的单词共现来构建一个大的知识库。正如我所研究的那样,尚未尝试类似的方法。我想使用appengine的灵活性和可扩展性,以便能够为广大用户提供知识库并为其做推理。

到目前为止,我已经提出了基于管道演示应用程序的mapreduce实现。源文本作为包含一个xml文档的压缩文件存储在blobstore中,每个文档包含可变数量的文章(多达30000个)。

第一步是调整当前的BlobstoreZipLineInputReader,以便它解析xml文件,从中检索相关信息。 XMLParser类使用lxml iterparse方法从http://www.ibm.com/developerworks/xml/library/x-hiperfparse/检索要处理的xml元素,并返回迭代器。

修改后的班级BlobstoreXMLZipLineInputReader的{​​{1}}功能略有不同:

next

然后地图功能将接收这些文章中的每一篇,按句子分割,然后按单词分开:

def next(self):
  if not self._filestream:
    if not self._zip:
      self._zip = zipfile.ZipFile(self._reader(self._blob_key))
      self._entries = self._zip.infolist()[self._start_file_index:
                                           self._end_file_index]
      self._entries.reverse()
    if not self._entries:
      raise StopIteration()
    entry = self._entries.pop()

    parser = XMLParser()
    # the result here is an iterator with the individual articles
    self._filestream = parser.parseXML(self._zip.open(entry.filename))

  try:
      article = self._filestream.next()
      self._article_index += 1    
  except StopIteration:
      article = None

  if not article:
    self._filestream.close()
    self._filestream = None
    self._start_file_index += 1
    self._initial_offset = 0
    return self.next()

  return ((self._blob_key, self._start_file_index, self._article_index),
          article)

缩减器聚合单词,并为它们出现的文章加入id:

def map_function(data):
  """Word count map function."""
  (entry, article) = data
  for s in split_into_sentences(article.body):
    for w in split_into_words(s.lower()):
      if w not in STOPWORDS:
        yield (w, article.id)

这在开发服务器和实时设置上都可以很好地工作到大约10000个文本(它们上面没有那么多单词)。通常不超过10秒。问题是当它有点过时,mapreduce似乎不断处理这个工作。每个分片的已处理项目数量只会递增,我的写入操作限制很快就会达到。

Q1。在某种程度上,mapreduce管道在开始“表现不好”之前可以做多少地图操作? Q2。我的问题会有更好的解决方法吗? Q3。我知道之前已经问过这个问题,但是我可以绕过临时mapreduce数据存储区写入吗?他们杀了我......

P.S。:这是我的主要mapreduce电话:

def reduce_function(key, values):
  """Word count reduce function."""
  yield "%s: %s\n" % (key, list(set(values)))

编辑:在运行无休止的工作时,我在开发服务器中遇到了一些奇怪的错误:

class XMLArticlePipeline(base_handler.PipelineBase):
  def run(self, filekey, blobkey):
    output = yield mapreduce_pipeline.MapreducePipeline(
        "process_xml",
        "backend.build_knowledgebase.map_function",
        "backend.build_knowledgebase.reduce_function",
        "backend.build_knowledgebase.BlobstoreXMLZipLineInputReader",
        "mapreduce.output_writers.BlobstoreOutputWriter",
        mapper_params={
            "blob_keys": [blobkey],
        },
        reducer_params={
            "mime_type": "text/plain",
        },
        shards=12)
    yield StoreOutput(filekey, output)

0 个答案:

没有答案