我正在研究MapReduce程序,我需要将实体插入到数据库中。由于某些性能问题,将实体插入数据库应该在组合器中完成。我的程序没有减速器,所以只有映射器和组合器。由于Hadoop引擎可能不会执行组合器(组合器是可选的),我如何执行它来运行组合器?如何执行一个mapreduce程序来执行组合器?
1
A
回答
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导出到关系数据库的问题的更标准解决方案,请考虑DBOutputFormat或Sqoop。
相关问题
- 1. MapReduce与组合器的执行时间
- 2. hadoop mapreduce只执行一个映射器
- 3. Hadoop - 执行一个终端,在mapreduce中执行命令
- 4. 执行一个JFrame程序
- 5. MapReduce连续执行
- 6. 并行执行mapreduce作业
- 7. 当Hadoop MapReduce运行一个组合器时的确切来源
- 8. 如何编写一个C程序来执行另一个程序?
- 9. 如何添加$ q来执行执行?
- 10. 这是一个可执行的应用程序吗? /执行一个javascript程序
- 11. 使用MapReduce执行组操作
- 12. 如何创建一个脚本来执行Python中的执行管理器?
- 13. 如何执行程序?
- 14. shebang如何执行程序?
- 15. 该程序如何执行?
- 16. R中设置一个计时器来执行程序
- 17. 如何写一个C程序来执行一定数量的处理器秒?
- 18. 如何在MATLAB R2014a上执行MapReduce?
- 19. 如何在另一个线程组中执行线程组?
- 20. 执行来自tidesdk程序的另一个程序的命令
- 21. Hadoop MapReduce,Java执行问题
- 22. PySpark执行MapReduce工作
- 23. 如何使用数组来执行此程序?
- 24. 如何从另一个Qt程序执行分离的C++可执行文件?
- 25. apache nifi - 如何执行一个接一个的进程组
- 26. 如何从java服务器远程执行一个windows可执行文件?
- 27. 如何使JavaScript执行键盘组合
- 28. C Linux的 - 如何从另一个程序执行程序
- 29. Java:执行Hadoop MapReduce有一些问题
- 30. 如何并行执行子程序?
答案应该是显而易见的:在减速器中执行(添加一个)。 –
我不想在Reducer中执行这个操作的原因是我不希望我的应用程序经历洗牌/排序的昂贵阶段。 –