Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何强制mapreduce程序执行合并器?_Hadoop_Mapreduce_Hadoop2 - Fatal编程技术网

Hadoop 如何强制mapreduce程序执行合并器?

Hadoop 如何强制mapreduce程序执行合并器?,hadoop,mapreduce,hadoop2,Hadoop,Mapreduce,Hadoop2,我正在开发一个MapReduce程序,在该程序中,我需要将实体插入数据库。由于某些性能问题,将实体插入数据库应该在组合器中完成。我的程序没有减速器,所以只有映射器和合并器。由于Hadoop引擎可能不执行合并器(合并器是可选的),我如何强制它运行合并器?MapReduce框架没有提供支持的强制执行合并器的方法。组合器可以被调用0次、1次或多次。框架可以自由地对此做出自己的决定 当前实现根据映射任务执行期间发生的磁盘溢出情况决定运行合并器。Apache Hadoop文档记录了可能对溢出活动产生影响的

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

MapReduce框架没有提供支持的强制执行合并器的方法。组合器可以被调用0次、1次或多次。框架可以自由地对此做出自己的决定

当前实现根据映射任务执行期间发生的磁盘溢出情况决定运行合并器。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.sort.spill.percent
0.80
序列化缓冲区中的软限制。一旦到达,一个
线程将开始在后台将内容溢出到磁盘。注意
当溢出发生时,如果超过此阈值,收集将不会被阻止
已经在进行中,因此泄漏可能会大于该阈值
设置为小于0.5
mapreduce.task.io.sort.factor
10
排序时一次要合并的流数
文件夹。这将确定打开的文件句柄数。
mapreduce.task.io.sort.mb
100
排序时要使用的缓冲区内存总量
文件,以兆字节为单位。默认情况下,为每个合并流提供1MB,这
应该尽量减少寻找。
此外,还有一个未记录的配置属性,
mapreduce.map.combine.mins
,它定义了运行组合器之前所需的最小溢出次数。如果未指定,默认值为
3

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

此外,请记住,与reducer不同,组合器可能无法获得与特定键关联的所有值的完整图片。如果多个映射任务使用相同的键处理记录,那么reducer是唯一保证看到所有这些值分组在一起的地方。即使在单个映射任务中,组合器也可以使用从其处理的输入拆分中提取的不同密钥值子集执行多次


<>对于从Hadoop导出数据到关系数据库的一个更标准的解决方案,考虑或../P>答案应该是显而易见的:在减速机中添加一个(添加一个)。我不想在减速机中这样做的原因是,我不希望我的应用程序经过洗牌/分拣的昂贵阶段。