2015-12-29 41 views
1

我正在研究MapReduce程序,我需要将实体插入到数据库中。由于某些性能问题,将实体插入数据库应该在组合器中完成。我的程序没有减速器,所以只有映射器和组合器。由于Hadoop引擎可能不会执行组合器(组合器是可选的),我如何执行它来运行组合器?如何执行一个mapreduce程序来执行组合器?

+0

答案应该是显而易见的:在减速器中执行(添加一个)。 –

+0

我不想在Reducer中执行这个操作的原因是我不希望我的应用程序经历洗牌/排序的昂贵阶段。 –

回答

2

MapReduce框架没有提供强制执行组合器的支持方式。组合器可以被称为0,1或多次。该框架可以自由地对此做出自己的决定。

当前实现决定在映射任务执行期间基于溢出发生的磁盘运行组合器。 mapred-default.xml的Apache Hadoop文档记录了几个可能影响溢出活动的配置属性。

<property> 
    <name>mapreduce.map.sort.spill.percent</name> 
    <value>0.80</value> 
    <description>The soft limit in the serialization buffer. Once reached, a 
    thread will begin to spill the contents to disk in the background. Note that 
    collection will not block if this threshold is exceeded while a spill is 
    already in progress, so spills may be larger than this threshold when it is 
    set to less than .5</description> 
</property> 

<property> 
    <name>mapreduce.task.io.sort.factor</name> 
    <value>10</value> 
    <description>The number of streams to merge at once while sorting 
    files. This determines the number of open file handles.</description> 
</property> 

<property> 
    <name>mapreduce.task.io.sort.mb</name> 
    <value>100</value> 
    <description>The total amount of buffer memory to use while sorting 
    files, in megabytes. By default, gives each merge stream 1MB, which 
    should minimize seeks.</description> 
</property> 

此外,还有一个未记录的配置属性,mapreduce.map.combine.minspills,它定义在运行组合器之前所需溢出的最小数目。如果未指定,则默认值为3

有人可能会调整这些配置属性,恰好设置触发足够溢出的条件超过mapreduce.map.combine.minspills,因此保证至少有一次对组合器的调用。不过,我不能推荐,因为它会非常脆弱。逻辑对外部因素非常敏感,例如输入数据的大小。另外,它将依赖当前MapReduce代码库的具体实现细节。内部算法可能会发生变化,这些变化可能会破坏您的假设。实际上没有用于强制组合器运行的公开API。

此外,请记住,与缩减器不同,组合器可能无法获取与特定键相关的所有值的完整图片。如果多个地图任务使用相同的密钥处理记录,则减速机是唯一可以保证将所有这些值组合在一起的地方。即使在单个地图任务中,组合器也可以使用从处理的输入分割中拉出的不同密钥值的子集执行多次。

有关将数据从Hadoop导出到关系数据库的问题的更标准解决方案,请考虑DBOutputFormatSqoop