2012-06-02 22 views
1

我正在使用mongo-hadoop适配器来运行map/reduce作业。一切都很好,除了发布时间和工作所花费的时间。即使数据集非常小,地图时间为13秒,缩短时间为12秒。实际上,我已经更改了mapred-site.xml和core-site.xml中的设置。但映射/缩小所花费的时间似乎是不变的。有什么办法可以减少它吗? 我还探索了从hanborq优化的hadoop分布。他们使用工作人员池来加快作业启动/设置。在其他地方有没有其他的等价物,因为hanborq分布不是很活跃。它是在4个月前更新的,它建立在hadoop的旧版本上。是Hadoop Map减少 - 如何加快作业启动/设置

我的一些设置如下: mapred-site.xml中:

<property> 
    <name>mapred.child.java.opts</name> 
    <value>-Xms1g</value> 
</property> 
<property> 
    <name>mapred.sort.avoidance</name> 
    <value>true</value> 
</property> 
<property> 
     <name>mapred.job.reuse.jvm.num.tasks</name> 
      <value>-1</value> 
</property> 
<property> 
    <name>mapreduce.tasktracker.outofband.heartbeat</name> 
    <value>true</value> 
</property> 
    <property> 
     <name>mapred.compress.map.output</name> 
     <value>false</value> 
    </property> 

核心的site.xml:

<property> 
      <name>io.sort.mb</name> 
      <value>300</value> 
    </property> 
<property> 
    <name>io.sort.factor</name> 
    <value>100</value> 
</property> 

任何帮助将不胜感激。提前致谢。

+0

为什么不使用mongodbs内部mapreduce? Hadoop实际上不适用于这种实时的东西。 –

+0

我也认为没有办法减少hadoop工作延迟 –

+0

我读了很多关于mongodbs内部m/r的低效率,例如:“Mongo M/R只有在你需要简单分组和过滤时才有用,在map和reduce之间进行混洗Hadoop的M/R能够利用所有核心,而MongoDB是单线程的“等等。另外,我的代码需要处理非常大的数据集,而这些数据集大部分将通过hadoops M/R离线处理。然而,在运行时,每当有新用户登录时,我都需要在几秒钟内将他的数据与数百万其他用户的数据进行匹配。 (用例与约会网站类似)。任何关于解决方案的想法都会受到欢迎。 –

回答

1

由于心跳导致部分延迟。任务跟踪者心跳到工作跟踪器,让它知道他们还活着,但作为心跳的一部分,他们还会宣布他们拥有多少开放式地图和减少插槽。作为回应,JT为TT分配工作。这意味着当你提交一份工作时,TTs只能像心跳一样快速地完成任务(每2到4秒,给与或不带)。另外,JT(默认情况下)仅在每次心跳期间分配单个任务。这意味着如果你只有一个TT,即使TT有额外的容量,你也只能每2-4秒分配一个任务。

所以,你可以:

  1. 缩短两个心跳线之间的持续时间。

  2. 更改TaskTracker中每个心跳的任务调度程序的工作方式。 mapred.fairscheduler.assignmultiple

相关问题