Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化MapReduce函数、Python、mrjob_Python_Hadoop_Mapreduce_Mrjob - Fatal编程技术网

如何优化MapReduce函数、Python、mrjob

如何优化MapReduce函数、Python、mrjob,python,hadoop,mapreduce,mrjob,Python,Hadoop,Mapreduce,Mrjob,我对Map/Reduce原则和pythonmrjob框架非常陌生,我编写了这个示例代码,它工作得很好,但我想知道我可以在其中做些什么来使它“完美”/更高效 from mrjob.job import MRJob import operator import re # append result from each reducer output_words = [] class MRSudo(MRJob): def init_mapper(self): # move

我对Map/Reduce原则和pythonmrjob框架非常陌生,我编写了这个示例代码,它工作得很好,但我想知道我可以在其中做些什么来使它“完美”/更高效

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。改进您的流程

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

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

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

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

2。使用更高效的工具

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

  • Python通常比Java慢
  • MRJob比大多数python框架都慢,因为它还没有使用
    typedbytes
  • 您必须决定是否值得使用常规API在Java中重写某些作业。如果您正在编写长寿命的批处理作业,那么投资一些开发时间来降低运行时成本是有意义的

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


    Cloudera几个月前就做了。MRJob比他们的Java作业慢很多(5到7倍)。mr当typedbytes可用时,作业性能应该会提高,但Java作业仍然会快2到3倍。

    有两种方法可以遵循

    1。改进您的流程

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

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

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

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

    2。使用更高效的工具

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

  • Python通常比Java慢
  • MRJob比大多数python框架都慢,因为它还没有使用
    typedbytes
  • 您必须决定是否值得使用常规API在Java中重写某些作业。如果您正在编写长寿命的批处理作业,那么投资一些开发时间来降低运行时成本是有意义的

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


    Cloudera几个月前就做了。MRJob比他们的Java作业慢很多(5到7倍)。mrTypedBytes可用时,作业性能应该会提高,但Java作业仍然会快2到3倍。

    这听起来更像是一个问题。感谢您指出这一点,但我想问的是如何提高此代码的性能。是的,这正是问题所在。此代码存在许多问题。在实际情况中,您将进行数据缩减。你在这里什么都没做。但一般来说,如果您进行数据缩减,则可以在分区器中进行。python代码可以被清理。将reducer\u final()称为final\u reducer()会产生误导,因为它不是另一个reducer,而是在reducer之后运行的代码。因为需要全局排序,所以希望所有对都指向同一个映射器,但在您的示例中不会。你到底想做什么?这听起来更像是一个问题。谢谢你指出这一点,但我想问的是如何提高这段代码的性能。是的,这正是你想要做的。这段代码有很多问题。在实际情况中,您将进行数据缩减。你在这里什么都没做。但一般来说,如果您进行数据缩减,则可以在分区器中进行。python代码可以被清理。将reducer\u final()称为final\u reducer()会产生误导,因为它不是另一个reducer,而是在reducer之后运行的代码。因为需要全局排序,所以希望所有对都指向同一个映射器,但在您的示例中不会。你到底想做什么?