我正在使用hadoop来更新mysql db中的一些记录...我看到的问题是,在某些情况下,为同一键集启动了多个化简器。我已经看到多达 2 个减速器在不同的从服务器上为同一键运行。这会导致两个化简器更新数据库中的同一记录的问题。
我正在考虑关闭自动提交模式以缓解此问题....但是并且作为化简器中"清理"操作的一部分进行提交,但想知道如何处理落后的化简器......是否还需要为此进行清理行动...㞖。。。。有没有办法判断化简器是否正常完成,因为我想对未完全完成数据处理的化简器调用"回滚"?
您可以添加以下"地图化简作业"属性:
mapred.map.tasks.speculative.execution
值为假。这将关闭推测执行。
两件事:
- 我真的怀疑reduce中的两个(EQUAL)键被分区到不同的从属服务器上。由于使用了哈希分区程序。您应该覆盖密钥类上的哈希代码。
- 您可以选择设置减少任务的数量。这可以通过对
Job.setNumReduceTasks(X)
的 API 调用来完成。显然,您可以将其设置为 1。
一般来说(不知道你的用例),通常最好避免Hadoop的"副作用"。这基本上依赖于Hadoop之外的第三方系统,因为它可能会成为性能瓶颈,并可能由于线程而使系统倒塌。我建议您在map-reduce作业完成后从Cloudera调查Sqoop以进行批量加载。我使用它作为散装装载机取得了很好的成功。
Sqoop 文档
如果您仍然想直接从 Hadoop 进行索引,您可以使用公平调度程序来限制可以随时运行的映射器或化简器的数量。在将 mapred.queue.name 设置为速率限制队列的情况下启动作业。您正在寻找 maxMaps/maxReduce 参数。
公平调度程序文档