在Hadoop映射器和还原器之间拆分任务

在Hadoop映射器和还原器之间拆分任务,hadoop,mapreduce,Hadoop,Mapreduce,我已经在伪分布式模式下配置了Hadoop设置。简言之,问题是: 如何决定将哪些子任务分配给映射器,哪些子任务分配给还原器 详情: 关于这门课程:问题是: 数据来自世界各地属于同一家商店公司的多个分支机构。每个数据记录在任何商店中存储销售(收据)。数据的形式为:(日期、时间、门店名称、成本)。例如(2012-01-01,12:01,纽约商店,12.99美元)。任务是获得每家商店的销售额 Udacity的解决方案是: 映射器(仅限)逐行读取文件,并将其传递给还原器(相当于读取和传递文件行) 还原程序

我已经在伪分布式模式下配置了Hadoop设置。简言之,问题是: 如何决定将哪些子任务分配给映射器,哪些子任务分配给还原器

详情: 关于这门课程:问题是:

数据来自世界各地属于同一家商店公司的多个分支机构。每个数据记录在任何商店中存储销售(收据)。数据的形式为:(日期、时间、门店名称、成本)。例如(2012-01-01,12:01,纽约商店,12.99美元)。任务是获得每家商店的销售额

Udacity的解决方案是:

  • 映射器(仅限)逐行读取文件,并将其传递给还原器(相当于读取和传递文件行)
  • 还原程序收集已排序的键(即存储名称)并添加它们 这种在映射器和还原器之间拆分任务的选择让我感到困惑。看起来reducer仍然在完成读取和添加的全部工作,而实际上,它默认只有一个reducer,这个解决方案听起来在reducer中造成了一个瓶颈

    我预期的解决方案是:

  • 映射程序读取该文件,每个映射程序读取一组销售额,将每个相同门店的销售额相加,并将哈希列表(键:门店,值:销售额总和)传递给还原程序
  • reducer(默认为1 reducer)得到了简化版本,现在它们的任务更简单了
  • 我的问题是:

  • 他们为什么这样实施?对吗??我对MapReduce的理解是错误的吗?如果是,您可以给我一些可以解决这个冲突的书籍、视频或教程的链接吗
  • 在一个有更多任务的项目中,我如何才能决定哪些去映射器,哪些去还原器?是否有任何参考或度量

  • MapReduce编程范例的核心思想是,数据被描述为许多
    键值
    对,其中
    表示特定的识别类型(例如,如果我们想为每个用户编写一个关于计算某些内容的程序,则需要一个用户ID;如果我们想计算每个单词出现的次数,则需要一个单词,如Hadoop项目本身所示)

    为了从输入数据的形式获得我们想要的输出结果,必须进行某种类型的操作,以便:

  • 将输入数据转换为一对或多对
    键值集
    集(因此我们映射数据),并
  • 以我们想要的方式实际处理这些数据集,以获得我们的输出(因此我们根据程序的目的减少
    键值对)
  • 根据您在问题上给出的Udacity示例,我们知道输入数据的形式:

    (date, time, store_name, cost)
    
    我们需要找到每家商店的销售额。因此,首先我们将输入数据映射成一个
    键值
    对的形式,每个输入记录的
    商店名称将被放入
    键值
    对的
    键值
    中。该函数的输出将实际读取每一行和构造一个
    键值
    对,其中所需的信息存储在其中,如下所示(其中
    store\u name
    键值
    ,而
    成本
    ):

    对输入的每一行这样做可能会导致
    key-value
    对具有与
    key
    相同的
    store\u name
    ,在此基础上,我们可以通过按键分组并收集这些对来减少这些对,以便将它们全部相加并得到每个商店的总销售额该函数的ut如下所示(其中
    store\u name
    ,而
    total\u sales
    是用户在函数内部编程计算的
    ):

    至于映射器和还原器之间的任务划分,这几乎完全取决于您,因为您必须记住,映射器是针对所有输入数据执行的(例如,在您的示例中逐行读取所有记录)和还原程序正在为从映射器创建的
    键值对的每个
    键值对执行。好消息是,像Hadoop这样的项目确实可以为您实现这一点,所以您需要配置的就是如何在
    映射
    函数中映射数据,以及如何在e
    Reduce
    功能

    至于默认的单减速机,您可能知道您确实可以将减速机的数量设置为您想要的数量,但它们只是针对不同数据在不同线程/CPU/机器上执行的
    Reduce
    函数的实例(这就是Hadoop被用于大数据应用程序的原因,因为通过计算机集群的并行处理可以更好地处理这些巨大的输入数据)

    您对MapReduce的机制的迷惑是可以理解的,因为在实际中,<代码>图和<代码> Reduce <代码>函数是从函数的编程分支派生出来的,很多人都不习惯它。考虑研究更多简单的MapReduce应用程序的例子来获得更好的ID。他们的技巧,如WordCount示例或我们计算每个运动员的奥运金牌总数)

    至于可能有更多的任务,这实际上取决于您决定在何处剪切和共享映射器的输入数据片段(您可以从问题的答案中找到更多信息),或者需要初始化多少个还原器来并行处理您的数据(当然,要比默认的1个还原器多)

    (store_name, cost)
    
    (store_name, total_sales)