MapReduce介绍

MapReduce是Google流行的一种并行编程技术。 它用于处理大量数据。 仅通过将工作并行分配给多台机器,就可以在合理的时间内完成这种处理。 每台机器都处理一小部分数据。

MapReduce是一种编程模型,使开发人员可以专注于编写处理数据的代码,而不必担心并行执行的细节。

MapReduce需要将要处理的数据建模为键值对。 开发人员编写了map函数和reduce函数的代码。

MapReduce运行时为每个键/值对调用map函数。 映射功能将键值对作为输入,并产生另一个键值对的输出。

MapReduce运行时通过键对映射函数的输出进行排序和分组。 然后,它调用将其传递给键的reduce函数以及与该键关联的值的列表。 为每个键调用reduce函数。 reduce函数的输出是键值对。 该值通常是聚合值或通过处理为输入键传递的值列表而计算出的值。 对于由map函数生成的每个中间键,调用reduce函数。 reduce函数的输出是必需的结果。

例如,假设您有大量的日志文件,其中包含某些事件(例如访问帐户)的审核日志。 您需要找出过去10年中每个帐户被访问了多少次。
假定日志文件中的每一行都是审核记录。 我们正在逐行处理日志文件,map和reduce函数如下所示:

  1.  
    map(key , value) {
  2.  
    // key = byte offset in log file
  3.  
    // value = a line in the log file
  4.  
    if ( value is an account access audit log) {
  5.  
    account number = parse account from value
  6.  
    output key = account number, value = 1
  7.  
    }
  8.  
    }
  9.  
     
  10.  
    reduce(key, list of values) {
  11.  
    // key = account number
  12.  
    // list of values {1,1,1,1.....}
  13.  
    for each value
  14.  
    count = count + value
  15.  
    output key , count
  16.  
    }

每个日志文件中的每一行都会调用map函数。 不相关的行将被忽略。 从相关行中解析出帐号,并输出一个值1。MapReduce运行时按帐号对输出进行排序和分组。 为每个帐户调用reduce函数。 reduce函数汇总每个帐户的值,这是必需的结果。

MapReduce作业通常在计算机集群上执行。 每台机器执行一个任务,该任务可以是映射任务,也可以是归约任务。 每个任务都在处理数据的子集。 在上面的示例中,假设我们从一组大型输入文件开始。 MapReduce运行时将输入数据分为称为分割或碎片的分区。 每个拆分或碎片均由计算机上的映射任务处理。 每个映射任务的输出均按键排序和分区。 来自所有映射的输出被合并以创建输入到reduce任务的分区。

可以有多台计算机,每台计算机都运行简化任务。 每个reduce任务都有一个要处理的分区。 该分区可以具有多个键。 但是每个键的所有数据都在1个分区中。 换句话说,每个键只能处理1个缩减任务。

机器数量,映射任务数量,reduce任务数量以及其他几项都是可配置的。

对于需要对大数据集进行某些处理的问题,MapReduce非常有用。 该算法可以分解为map和reduce函数。 MapReduce运行时负责将处理分配到多台计算机并汇总结果。

Apache Hadoop是mapreduce的开源Java实现。 请继续关注有关使用hadoop的有关mapreduce的未来博客/教程。

posted @ 2021-10-03 23:32  Zwyooo  阅读(356)  评论(0编辑  收藏  举报