Spark流式传输-同一工作人员上有多个执行者时,块复制策略问题

时间:2018-10-10 08:49:08

标签: apache-spark spark-streaming executor apache-spark-standalone

我正在由三个节点组成的集群上运行一个火花流应用程序,每个节点都有一个工作程序和三个执行程序(因此总共有9个执行程序)。我正在使用Spark版本2.3.2和Spark独立群集管理器。

问题

调查一个工作机完全停机时的最近一个问题,我可以看到由于以下原因,火花流作业已停止:

18/10/08 11:53:03 ERROR TaskSetManager: Task 122 in stage 413804.1 failed 8 times; aborting job

由于同一阶段中的一项任务失败了8次,因此作业被中止。 这是预期的行为。

提到的任务由于以下原因而失败:

18/10/08 11:53:03 INFO DAGScheduler: ShuffleMapStage 413804 (flatMapToPair at MessageReducer.java:30) failed in 3.817 s due to Job aborted due to stage failure: Task 122 in stage 413804.1 failed 8 times, most recent failure: Lost task 122.7 in stage 413804.1 (TID 223071001, 10.12.101.60, executor 1): java.lang.Exception: Could not compute split, block input-39-1539013586600 of RDD 1793044 not found
org.apache.spark.SparkException: Job aborted due to stage failure: Task 122 in stage 413804.1 failed 8 times, most recent failure: Lost task 122.7 in stage 413804.1 (TID 223071001, 10.12.101.60, executor 1): java.lang.Exception: Could not compute split, block input-39-1539013586600 of RDD 1793044 not found

因此,我然后尝试跟踪未找到的块input-39-1539013586600,可以看到以下内容:

18/10/08 11:46:26 INFO BlockManagerInfo: Added input-39-1539013586600 in memory on 10.10.101.66:32825 (size: 1398.0 B, free: 5.2 GB)
18/10/08 11:46:26 INFO BlockManagerInfo: Added input-39-1539013586600 in memory on 10.10.101.66:35258 (size: 1398.0 B, free: 5.2 GB)
18/10/08 11:47:35 WARN BlockManagerMasterEndpoint: No more replicas available for input-39-1539013586600 !
18/10/08 11:53:03 WARN TaskSetManager: Lost task 122.0 in stage 413804.1 (TID 223070944, 10.10.101.60, executor 5): java.lang.Exception: Could not compute split, block input-39-1539013586600 of RDD 1793044 not found
18/10/08 11:53:03 INFO TaskSetManager: Lost task 122.1 in stage 413804.1 (TID 223070956) on 10.12.101.66, executor 9: java.lang.Exception (Could not compute split, block input-39-1539013586600 of RDD 1793044 not found) [duplicate 1]

您会注意到,该块已复制到同一工人上的两个不同的执行器上 (在本例中为10.10.101.66)。

火花代码

然后我们检查了火花代码,以查看此行为是否正常,而且看起来是正常的。 BlockManager中使用的默认策略是RandomBlockReplication(https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/storage/BlockManager.scala#L240)。

在此策略中,尽管javaDoc说了“ ...基本实现,但这只是确保我们在可能的情况下将块放在不同的主机上” ,该策略似乎是完全随机的,因为它们不是使用host对象的BlockManagerId属性来尝试将副本放置在其他主机(https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/storage/BlockReplicationPolicy.scala#L120)上。

如果我们的分析是正确的,则似乎在像我们这样的配置(在一台工作计算机上有多个执行程序)的情况下,如果整个主机丢失,火花流很容易下降。

强迫作业使用BasicBlockReplicationPolicy似乎也不是解决方案,因为如果未指定拓扑结构(https://github.com/apache/spark/blob/master/core/src/main/scala/org/apache/spark/storage/BlockReplicationPolicy.scala#L169),则该策略将回退到随机机制,而我无法在可以在其中设置拓扑的代码(此值目前暂时不使用)。

最后的问题

  • 我们可以认为这是Spark中的错误吗?
  • 过去有人遇到过这个问题吗?是否有其他解决方法(除了将每个工人的执行者数量减少到1个)?

0 个答案:

没有答案