在Hadoop映射器和还原器之间拆分任务
我已经在伪分布式模式下配置了Hadoop设置。简言之,问题是: 如何决定将哪些子任务分配给映射器,哪些子任务分配给还原器 详情: 关于这门课程:问题是: 数据来自世界各地属于同一家商店公司的多个分支机构。每个数据记录在任何商店中存储销售(收据)。数据的形式为:(日期、时间、门店名称、成本)。例如(2012-01-01,12:01,纽约商店,12.99美元)。任务是获得每家商店的销售额 Udacity的解决方案是:在Hadoop映射器和还原器之间拆分任务,hadoop,mapreduce,Hadoop,Mapreduce,我已经在伪分布式模式下配置了Hadoop设置。简言之,问题是: 如何决定将哪些子任务分配给映射器,哪些子任务分配给还原器 详情: 关于这门课程:问题是: 数据来自世界各地属于同一家商店公司的多个分支机构。每个数据记录在任何商店中存储销售(收据)。数据的形式为:(日期、时间、门店名称、成本)。例如(2012-01-01,12:01,纽约商店,12.99美元)。任务是获得每家商店的销售额 Udacity的解决方案是: 映射器(仅限)逐行读取文件,并将其传递给还原器(相当于读取和传递文件行) 还原程序
MapReduce编程范例的核心思想是,数据被描述为许多
键值
对,其中键
表示特定的识别类型(例如,如果我们想为每个用户编写一个关于计算某些内容的程序,则需要一个用户ID;如果我们想计算每个单词出现的次数,则需要一个单词,如Hadoop项目本身所示)
为了从输入数据的形式获得我们想要的输出结果,必须进行某种类型的操作,以便:
键值集
集(因此我们映射数据),并键值对)
(date, time, store_name, cost)
我们需要找到每家商店的销售额。因此,首先我们将输入数据映射成一个键值对的形式,每个输入记录的商店名称将被放入键值对的键值中。该函数的输出将实际读取每一行和构造一个键值
对,其中所需的信息存储在其中,如下所示(其中store\u name
是键值
,而成本
是值
):
对输入的每一行这样做可能会导致key-value
对具有与key
相同的store\u name
,在此基础上,我们可以通过按键分组并收集这些对来减少这些对,以便将它们全部相加并得到每个商店的总销售额该函数的ut如下所示(其中store\u name
是键
,而total\u sales
是用户在函数内部编程计算的值
):
至于映射器和还原器之间的任务划分,这几乎完全取决于您,因为您必须记住,映射器是针对所有输入数据执行的(例如,在您的示例中逐行读取所有记录)和还原程序正在为从映射器创建的键值对的每个键值对执行。好消息是,像Hadoop这样的项目确实可以为您实现这一点,所以您需要配置的就是如何在映射
函数中映射数据,以及如何在eReduce
功能
至于默认的单减速机,您可能知道您确实可以将减速机的数量设置为您想要的数量,但它们只是针对不同数据在不同线程/CPU/机器上执行的Reduce
函数的实例(这就是Hadoop被用于大数据应用程序的原因,因为通过计算机集群的并行处理可以更好地处理这些巨大的输入数据)
您对MapReduce的机制的迷惑是可以理解的,因为在实际中,<代码>图和<代码> Reduce <代码>函数是从函数的编程分支派生出来的,很多人都不习惯它。考虑研究更多简单的MapReduce应用程序的例子来获得更好的ID。他们的技巧,如WordCount示例或我们计算每个运动员的奥运金牌总数)
至于可能有更多的任务,这实际上取决于您决定在何处剪切和共享映射器的输入数据片段(您可以从问题的答案中找到更多信息),或者需要初始化多少个还原器来并行处理您的数据(当然,要比默认的1个还原器多)
(store_name, cost)
(store_name, total_sales)