Я запускаю потоковое приложение в кластере, состоящем из трех узлов, каждый из которых имеет своего работника и трех исполнителей (всего 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)?