如何强制mapreduce程序执行combiner?

yqkkidmi  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(287)

我正在开发一个mapreduce程序,在这个程序中我需要将实体插入数据库。由于某些性能问题,将实体插入数据库应该在合并器中完成。我的程序没有缩减器,所以只有Map器和合并器。由于hadoop引擎可能不会执行combiner(combiner是可选的),如何强制它来运行combiner?

brtdzjyr

brtdzjyr1#

mapreduce框架没有提供受支持的强制执行合并器的方法。组合器可以被称为0、1或多次。框架可以自由地对此做出自己的决定。
当前实现决定基于map任务执行期间发生的磁盘溢出来运行合并器。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。
此外,请记住,与reducer不同,组合器可能无法获得与特定键相关联的所有值的完整图像。如果多个map任务使用同一个键处理记录,那么reducer是唯一可以确保看到所有这些值组合在一起的地方。即使在单个map任务中,组合器也可以使用从其处理的输入分割中提取的键值的不同子集执行多次。
要获得将数据从hadoop导出到关系数据库的更标准的解决方案,请考虑dboutputformat或sqoop。

相关问题