运行时选项

编辑

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

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

推测执行

编辑

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

-- Yahoo! 开发人员网络

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

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

禁用 Map/Reduce 推测执行

编辑

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

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 表示启用)仔细检查是否是这种情况。