我有一个“只图”(没有减少相)计划。 输入文件的大小足够大,以创建7个map任务,我已经验证通过查看产生的输出(部分000〜part006)。 现在,我的群有8个内核每8个节点和8 GB的内存,并在头节点托管共享文件系统。
我的问题是,我只能在1个节点运行的所有7个map任务或在7个不同的从节点(每个节点1个任务)运行7个map任务之间进行选择。 如果我能做到的话,那么需要什么样的变化在我的代码和配置文件。
我试着设置参数“mapred.tasktracker.map.tasks.maximum” 1和7只在我的代码,但我因此未发现任何明显的时间差。 在我的配置文件,它设置为1。
"mapred.tasktracker.map.tasks.maximum"
与应在每个节点上推出的地图任务数的交易,用于每个地图的任务不是节点的数量。 在Hadoop的架构中,有1周的TaskTracker为每个节点(从)和一个主节点(主机)上1个作业跟踪器。 所以,如果你设置的属性mapred.tasktracker.map.tasks.maximum
,只不过是改变每个节点要被执行的地图任务的数量。 的范围"mapred.tasktracker.map.tasks.maximum"
是从1/2*cores/node
到2*cores/node
那你想整体应该用设置地图的任务数量setNumMapTasks(int)
现在,我的群有8个内核每8个节点和8 GB的内存,并在头节点托管共享文件系统。
当你说一个共享文件系统托管的头节点,你的意思是数据在HDFS托管,或一些像NFS文件系统安装在每个节点上? 我猜你的意思是HDFS,但如果你使用NFS或类似的东西,然后你应该会看到与HDFS更高的吞吐量(你想要的处理代码移动到数据,而不是将数据移动到加工机)
你有多大的输入文件,什么是它的分割大小,文件格式(文字,序列等),复制因子和压缩methof?
根据回答上述问题,有了您的8×8的设置,你也许可以,如果您降低地图分割尺寸,以及多达复制因子,以获得更好的吞吐量。
如果可能的话,你一定要在7个不同的节点上运行的7个地图任务。 MapReduce的的整体优势是能够并行您的计算,使每个任务,高效的方式运行。 如果您运行在一个节点上7个map任务,每个任务将争夺该单个节点上相同的资源(内存,CPU,IO)。
对于标准制定mapred.tasktracker.map.tasks.maximum
是每个核心,因此您可以将您的设置更改为8之一。
此外,如果你有一个唯一的地图,工作,你会希望有一个很好的理由来设置映射器到一定数量的个数。 设置的地图任务的数量仅仅是一个“暗示”的JobTracker的多少映射到运行,但这最终由JobTracker的基础上DFS是如何存储你的输入数据决定。 这个wiki有更多的细节。
你想控制降低在某些情况下的任务数,但是。 例如,如果我想号码列表排序我想,以确保通过一个减速通过了所有的数据。