运行时选项

编辑

使用 elasticsearch-hadoop 时,务必注意以下 Hadoop 配置,这些配置会影响 Map/Reduce 任务的执行方式,进而影响 elasticsearch-hadoop。

不幸的是,这些设置需要在作业/脚本配置之前手动设置。由于 elasticsearch-hadoop 的调用时机太晚,在任务已分派之后,因此无法再影响执行。

推测性执行

编辑

当作业中的大多数任务即将完成时,推测性执行 会跨多个没有其他工作的节点调度剩余任务的冗余副本。因此,可以并行多次处理相同的输入,以利用机器性能的差异。

-- 雅虎!开发者网络

换句话说,推测性执行是一种优化,默认情况下启用,它允许 Hadoop 创建那些它认为挂起或速度变慢的任务的重复任务。在进行数据处理或读取资源时,拥有重复的任务无害,最多意味着浪费计算资源;但是,当向外部存储写入数据时,这可能会导致由于重复或不必要的更新而导致数据损坏。由于推测性执行行为可能由外部因素(例如网络或 CPU 负载,进而导致误报)触发,即使在稳定的环境中(虚拟化集群尤其容易出现这种情况),并且对数据有直接影响,因此 elasticsearch-hadoop 禁用了此优化以确保数据安全。

请检查您的库设置并禁用此功能。如果您遇到比预期更多的数据,请仔细检查此设置。

禁用 Map/Reduce 推测性执行

编辑

可以为 map 和 reduce 阶段禁用推测性执行——我们建议在这两种情况下都禁用——通过将以下两个属性设置为false

mapred.map.tasks.speculative.execution mapred.reduce.tasks.speculative.execution

可以在Configuration/JobConf客户端上手动按名称设置属性

jobConf.setSpeculativeExecution(false);
// or
configuration.setBoolean("mapred.map.tasks.speculative.execution", false);
configuration.setBoolean("mapred.reduce.tasks.speculative.execution", false);

或者将其作为参数传递给命令行

$ bin/hadoop jar -Dmapred.map.tasks.speculative.execution=false \
                 -Dmapred.reduce.tasks.speculative.execution=false <jar>

Hive 推测性执行

编辑

Apache Hive 通过hive.mapred.reduce.tasks.speculative.execution设置拥有自己的推测性执行设置。它默认启用,因此请在您的脚本中将其更改为false

set hive.mapred.reduce.tasks.speculative.execution=false;

请注意,虽然此设置已在 Hive 0.10 中弃用,并且您可能会收到警告,但请仔细检查推测性执行是否确实已禁用。

Spark 推测性执行

编辑

Spark 默认情况下禁用了推测性执行。通过spark.speculation设置(false表示禁用,true表示启用)仔细检查是否如此。