如何强制执行 mapreduce 程序来执行组合器?
How to enforce a mapreduce program to execute combiner?
我正在开发一个 MapReduce 程序,我需要在其中将实体插入到数据库中。由于某些性能问题,将实体插入数据库应该在组合器中完成。我的程序没有reducer,所以只有mapper和combiner。由于 Hadoop 引擎可能不执行组合器(组合器是可选的),我如何将其强制执行到 运行 组合器?
MapReduce 框架不提供强制执行组合器的受支持方式。组合器可能被调用 0 次、1 次或多次。该框架可以自由做出自己的决定。
当前的实现决定 运行 组合器基于映射任务执行期间发生的溢出到磁盘。 mapred-default.xml 的 Apache Hadoop 文档记录了几个可能影响溢出的配置属性 activity。
<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 代码库的具体实现细节。内部算法可能会发生变化,这些变化可能会打破您的假设。实际上没有 pubic API 来强制组合器的 运行。
此外,请记住,与 reducer 不同,组合器可能无法全面了解与特定键关联的所有值。如果多个 map 任务处理具有相同键的记录,那么 reducer 是唯一可以保证看到所有这些值组合在一起的地方。即使在单个 map 任务中,组合器也可能使用从其处理的输入拆分中提取的不同 sub-sets 键值执行多次。
对于将数据从 Hadoop 导出到关系数据库的问题的更标准解决方案,请考虑 DBOutputFormat or Sqoop。
我正在开发一个 MapReduce 程序,我需要在其中将实体插入到数据库中。由于某些性能问题,将实体插入数据库应该在组合器中完成。我的程序没有reducer,所以只有mapper和combiner。由于 Hadoop 引擎可能不执行组合器(组合器是可选的),我如何将其强制执行到 运行 组合器?
MapReduce 框架不提供强制执行组合器的受支持方式。组合器可能被调用 0 次、1 次或多次。该框架可以自由做出自己的决定。
当前的实现决定 运行 组合器基于映射任务执行期间发生的溢出到磁盘。 mapred-default.xml 的 Apache Hadoop 文档记录了几个可能影响溢出的配置属性 activity。
<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 代码库的具体实现细节。内部算法可能会发生变化,这些变化可能会打破您的假设。实际上没有 pubic API 来强制组合器的 运行。
此外,请记住,与 reducer 不同,组合器可能无法全面了解与特定键关联的所有值。如果多个 map 任务处理具有相同键的记录,那么 reducer 是唯一可以保证看到所有这些值组合在一起的地方。即使在单个 map 任务中,组合器也可能使用从其处理的输入拆分中提取的不同 sub-sets 键值执行多次。
对于将数据从 Hadoop 导出到关系数据库的问题的更标准解决方案,请考虑 DBOutputFormat or Sqoop。