我正在一个由我们的几个应用程序共享的集群上运行Hadoop作业。我们有大约40个节点和4个映射器插槽/节点。每当我的工作(它只是映射器)运行时,它会占用所有160个插槽并阻止其他工作运行。我尝试使用任务代码将作业中的属性“mapred.tasktracker.map.tasks.maximum = 1”和“mapred.map.tasks”设置为30(仅限于30个节点)。
conf.setInt ( "mapred.tasktracker.map.tasks.maximum", 1 );
conf.setInt ( "mapred.map.tasks", 30 );
conf.setBoolean ( "mapred.map.tasks.speculative.execution", false );
我有两个问题:
一个。作业运行时,job.xml反映“mapred.tasktracker.map.tasks.maximum = 1”,但作业仍然最终占用160个插槽。
湾job.xml中的mapred.map.tasks不是30.它仍然是一个很大的数字(如800)。
任何帮助都将不胜感激。
答案 0 :(得分:0)
我发现最好通过在将数据移入HDFS时设置输入文件的块大小来控制映射器的最大数量。例如,如果将块大小设置为总大小的1/30,则最终会有30个块,因此最多可以有30个映射任务。
hadoop fs -D fs.local.block.size = 134217728 -put local_name remote_location
答案 1 :(得分:0)
我们可以为作业指定最大和最小地图任务,但是hadoop dosent保证它的执行就像对减速器一样。 Hadoop使用最小和最大映射任务值来估计并尽力保持任务数量接近它。您应该在集群中使用类似公平调度程序的调度程序来解决您的问题。公平调度是一种为工作分配资源的方法,使得所有工作平均在一段时间内获得相等的资源份额。
答案 2 :(得分:0)
您不能限制映射器编号。
映射器编号按数据大小和块大小计算。如果数据非常大,则只能增加块大小以减少映射器编号。
因为如果限制数量,映射器将阻止等待所有其他映射器的结束。