我是hadoop的新手,我尝试使用不同数量的映射器和缩减器多次执行MapReduce,并比较执行时间。文件大小约为1GB,我没有指定分割大小,所以它应该是64MB。我正在使用4芯机器。
mapper和reducer是用python编写的。所以,我正在使用hadoop流媒体。我使用'-D mapred.map.tasks = 1 -D mapred.reduce.tasks = 1'
指定了地图任务的数量并减少了任务因为我指定使用1个map任务和1个reduce任务,所以我希望只看到一次尝试,但实际上我有38个map尝试,1个reduce任务。我阅读了类似于这个问题的教程和SO问题,有些人说默认的地图任务是2,但是我得到了38个地图任务。我还读到mapred.map.tasks只建议地图任务的数量和数量是分割大小的数量。但是,1GB除以64MB大约是17,所以我仍然不明白为什么创建了38个地图任务。
1)如果我只想使用1个map任务,我是否必须将输入分割大小设置为1GB ??
2)假设我成功指定我只想使用2个地图任务,它是否使用2个核心?并且每个核心都有1个映射任务??
答案 0 :(得分:1)
映射器的数量实际上由您正在使用的 InputFormat 控制。话虽如此,根据您正在处理的数据类型,InputFormat可能会有所不同。通常,对于存储为HDFS FileInputFormat或子类中的文件的数据,使用的工作原理是MR split = HDFS块。然而,这并非总是如此。假设您正在处理平面二进制文件。在这种情况下,没有分隔符(\ n或其他)来表示分割边界。在这种情况下你会做什么?因此,上述原则并不总是有效。
考虑另一种情况,即您正在处理存储在数据库中的数据,而不是处理HDFS中的数据。在我们谈论DB时,会出现什么情况,因为没有64MB块大小的概念?
框架尽力以尽可能高效的方式执行计算,这可能涉及创建您指定/期望的更少/更多数量的映射器。因此,为了了解如何创建精确的映射器,您需要查看您在工作中使用的InputFormat。 getSplits()方法准确无误。
如果我只想使用1个地图任务,我是否必须将输入分割大小设置为1GB ??
您可以覆盖InputFormat的 isSplitable(FileSystem,Path)方法,以确保输入文件不会被拆分并由单个映射器整体处理。
假设我成功指定我只想使用2个地图任务,它是否使用2个核心?并且每个核心都有1个映射任务??
这取决于可用性。映射器可以同时在多个核上运行。并且单个核心可以顺序运行多个映射器。
答案 1 :(得分:0)
问题2的一些附加组件:在节点上运行map / reduce任务的并行性是可控的。可以通过mapreduce.tasktracker.map.tasks.maximum
和mapreduce.tasktracker.reduce.tasks.maximum
设置任务跟踪器同时运行的map / reduce任务的最大数量。 Defaults for both parameters是2.对于4核节点mapreduce.tasktracker.map.tasks.maximum
应该增加到至少4,即使用每个核心。 2 for max-reduce-tasks预计可以。 顺便说一句,找出max map / reduce任务的最佳值是非常重要的,因为它取决于集群上的作业并行度,作业的映射器/缩减器(-s)是计算密集型还是计算密集型,等