gpt4 book ai didi

python - 如何优化这个MapReduce函数,Python,mrjob

转载 作者:可可西里 更新时间:2023-11-01 15:03:09 24 4
gpt4 key购买 nike

我对 Map/Reduce 原理和 python mrjob 框架还很陌生,我写了这个示例代码,它工作正常,但我想知道我可以改变它什么以使其“完美”/更高效.

from mrjob.job import MRJob
import operator
import re

# append result from each reducer
output_words = []

class MRSudo(MRJob):

def init_mapper(self):
# move list of tuples across mapper
self.words = []

def mapper(self, _, line):
command = line.split()[-1]
self.words.append((command, 1))

def final_mapper(self):
for word_pair in self.words:
yield word_pair

def reducer(self, command, count):
# append tuples to the list
output_words.append((command, sum(count)))

def final_reducer(self):
# Sort tuples in the list by occurence
map(operator.itemgetter(1), output_words)
sorted_words = sorted(output_words, key=operator.itemgetter(1), reverse=True)
for result in sorted_words:
yield result

def steps(self):
return [self.mr(mapper_init=self.init_mapper,
mapper=self.mapper,
mapper_final=self.final_mapper,
reducer=self.reducer,
reducer_final=self.final_reducer)]

if __name__ == '__main__':
MRSudo.run()

最佳答案

有两种方法可以遵循。

<强>1。改进您的流程

您正在进行分布式字数统计。此操作是代数操作,但您没有利用此属性。

对于你输入的每一个词,你都会向 reducers 发送一条记录。这些字节必须被分区,通过网络发送,然后由 reducer 排序。它既不高效也不可扩展,映射器发送到缩减器的数据量通常是瓶颈。

你应该在你的工作中添加一个组合器。它将做与您当前的 reducer 完全相同的事情。组合器在同一地址空间中的映射器之后运行。这意味着您通过网络发送的数据量不再与输入的字数成线性关系,而是受唯一字数的限制。这通常要低几个数量级。

由于分布式字数统计示例被过度使用,您可以通过搜索“分布式字数统计组合器”轻松找到更多信息。所有代数运算都必须有一个组合器。

<强>2。使用更高效的工具

Mrjob 是快速编写 map reduce 作业的好工具。通常编写 python 作业比编写 Java 作业更快。但是它有运行时成本:

  1. Python 通常比 Java 慢
  2. MRJob 比大多数 python 框架慢,因为它还没有使用 typedbytes

您必须决定是否值得使用常规 API 用 Ja​​va 重写您的一些作业。如果您正在编写长期存在的批处理作业,那么投入一些开发时间以降低运行时成本可能是有意义的。

从长远来看,编写 Java 作业通常不会比用 Python 编写长多少。但是您必须进行一些前期投资:使用构建系统创建项目、打包、部署等。使用 MRJob,您只需执行 python 文本文件。

Cloudera 做了一个 benchmark of the Hadoop python frameworks几个月前。 MRJob 比他们的 Java 作业慢得多(5 到 7 倍)。当 typedbytes 可用时,MRJob 的性能应该会提高,但 Java 作业仍将快 2 到 3 倍。

关于python - 如何优化这个MapReduce函数,Python,mrjob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15842956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com