Hive 查询显示很少有 reducer 被杀死,但查询仍然 运行。输出会正常吗?

Hive query shows few reducers killed but query is still running. Will the output be proper?

我在 Amazon AWS EMR 的最后 1 小时内有一个包含多个左外连接 运行 的复杂查询。但是很少有 reducer 显示为 Failed 和 Killed。

我的问题是为什么有些减速器会被杀死?最终输出是否合适?

减速器被杀死的原因有很多。其中一些是:

  • 暂存区内存不足。
  • 资源不可用或死锁。
  • 限制一个任务生成的 reducer 数量。等等

一般来说,如果 reducer 被杀死,它会自行重启并完成作业,不会有数据丢失。但是,如果减速器一次又一次地被杀死,并且您的工作因此而处于停滞状态,那么您可能必须查看纱线日志才能找到解决方案。

此外,您似乎是 运行 TEZ 模式的蜂巢 尝试 运行 MR 模式, 可能会有帮助。

简短回答:是的,如果您的作业成功完成,那么您将看到正确的结果。

任务运行时失败的原因有很多。主要是资源问题。它可以是 cpu/disk/memory.

Tez AppMaster is responsible for dealing with transient container execution failures and must respond to RM requests regarding allocated and possibly deallocated Containers.

Tez AppMaster 尝试将任务重新分配给其他一些具有约束的容器

  • tez.maxtaskfailures.per.node default=3 确保相同的节点不会被用于重新分配。

  • tez.am.task.max.failed.attempts default=4 特定任务在任务失败之前可以失败的最大尝试次数。这不包括被杀死的尝试。 4任务失败导致DAG失败

通常每个容器在最终失败之前有 3 次尝试(可配置,如@rbyndoor 所述)。如果一次尝试失败,则重新启动直到尝试次数达到限制,如果失败,则整个顶点失败,所有其他任务被杀死。

一些任务尝试的罕见失败不是那么严重的问题,特别是当 运行 在具有 spot 节点的 EMR 集群上时,可以在执行期间删除这些节点,从而导致某些顶点的失败和部分重启。

在大多数情况下,您可以在跟踪器日志中找到失败的原因。

当然,这不是切换到已弃用的 MR 的原因。尝试找出根本原因并解决它。

在一些边际情况下,即使尝试失败的作业成功了,生成的数据也可能会部分损坏。例如,在 distribute by 子句中使用一些非确定性函数时。像兰德()。在这种情况下,重新启动的容器可能会尝试复制上一步(映射器)生成的数据,并且具有映射器结果的点节点已经被删除。在这种情况下,某些先前步骤的容器会重新启动,但由于 rand 函数的不确定性,生成的数据可能会有所不同。

关于终止任务。

Mappers 或 reducers 可能因多种原因而被终止。首先,当其中一个容器完全失败时,所有其他任务 运行 都将被终止。如果开启了推测执行,重复的任务会被杀死,如果任务长时间没有响应等等。这是很正常的,通常并不表示有什么问题。如果整个作业都失败了或者你有很多次尝试失败,你需要检查失败的任务日志来找到原因,而不是杀死那些。