运行时选项编辑

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

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

推测执行编辑

随着作业中的大多数任务即将结束,推测执行将在没有其他工作要执行的多个节点上安排剩余任务的冗余副本。因此,可以并行处理相同的输入多次,以利用机器功能的差异。

-- 雅虎!开发者网络

换句话说,推测执行是一种默认启用的优化,它允许 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 表示启用)。