Ниже тестируемый сценарий,
Работа:
Задание Spark SQK написано на Scala и выполняется на 1 ТБ ДАННЫХ ЭТАП TPCDS BENCHMARK, которые представлены в виде паркета, мгновенного формата и таблиц кустов.
Диспетчер кластеров:
Kubernetes
Конфигурация Spark sql:
Набор 1:
spark.executor.heartbeatInterval 20s
spark.executor.cores 4
spark.driver.cores 4
spark.driver.memory 15g
spark.executor.memory 15g
spark.cores.max 220
spark.rpc.numRetries 5
spark.rpc.retry.wait 5
spark.network.timeout 1800
spark.sql.broadcastTimeout 1200
spark.sql.crossJoin.enabled true
spark.sql.starJoinOptimization true
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenodeHA/tmp/spark-history
spark.sql.codegen true
spark.kubernetes.allocation.batch.size 30
Комплект 2:
spark.executor.heartbeatInterval 20s
spark.executor.cores 4
spark.driver.cores 4
spark.driver.memory 11g
spark.driver.memoryOverhead 4g
spark.executor.memory 11g
spark.executor.memoryOverhead 4g
spark.cores.max 220
spark.rpc.numRetries 5
spark.rpc.retry.wait 5
spark.network.timeout 1800
spark.sql.broadcastTimeout 1200
spark.sql.crossJoin.enabled true
spark.sql.starJoinOptimization true
spark.eventLog.enabled true
spark.eventLog.dir hdfs://namenodeHA/tmp/spark-history
spark.sql.codegen true
spark.kubernetes.allocation.batch.size 30
Используется Kryoserialiser со значением spark.kryoserializer.buffer.mb
64 МБ.
50 исполнителей создаются с помощью аргумента spark.executor.instances = 50.
Наблюдаемые проблемы:
Задание Spark SQL внезапно завершается, а драйверы и исполнители убиваются случайным образом.
Стручки водителя и исполнителей внезапно погибают, а работа не выполняется.
На разных трассах найдено несколько разных трасс стека,
Stack Trace 1:
"2018-05-10 06:31:28 ERROR ContextCleaner:91 - Error cleaning broadcast 136
org.apache.spark.SparkException: Exception thrown in awaitResult:
at org.apache.spark.util.ThreadUtils$.awaitResult(ThreadUtils.scala:205)"
Прикрепленный файл: StackTrace1.txt
Stack Trace 2:
"org.apache.spark.shuffle.FetchFailedException: Failed to connect to /192.178.1.105:38039^M
at org.apache.spark.storage.ShuffleBlockFetcherIterator.throwFetchFailedException(ShuffleBlockFetcherIterator.scala:442)^M
at org.apache.spark.storage.ShuffleBlockFetcherIterator.next(ShuffleBlockFetcherIterator.scala:418)"
Прикрепленный файл: StackTrace2.txt
Stack Trace 3:
"18/05/10 11:21:17 WARN KubernetesTaskSetManager: Lost task 3.0 in stage 48.0 (TID 16486, 192.178.1.35, executor 41): FetchFailed(null, shuffleId=29, mapId=-1, reduceId=3, message=^M
org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 29^M
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:697)^M
at org.apache.spark.MapOutputTracker$$anonfun$org$apache$spark$MapOutputTracker$$convertMapStatuses$2.apply(MapOutputTracker.scala:693)"
Прикрепленный файл: StackTrace3.txt
Stack Trace 4:
"ERROR KubernetesTaskSchedulerImpl: Lost executor 11 on 192.178.1.123: Executor lost for unknown reasons."
Это повторяется до тех пор, пока исполнители не умрут полностью без следов стека.
Кроме того, мы видим 18/05/11 07:23:23 INFO DAGScheduler: fail: Set ()
что это значит ? что-то не так или он говорит, что сбойный набор пуст, что означает отсутствие сбоя?
Наблюдения или изменения опробованы:
- Контролировал использование памяти и ЦП между исполнителями, и ни один из них не выходит за пределы.
По нескольким прочтениям и предложениям
spark.network.timeout
было увеличено до 600 с 600, но не помогло.
Кроме того, объем памяти драйвера и исполнителя был сохранен по умолчанию в наборе 1 конфигурации и составлял 0,1 * 15 г = 1,5 ГБ.
Также увеличил это значение явно до 4 ГБ и уменьшил значения памяти драйвера и исполнителя до 11 ГБ с 15 ГБ в соответствии с набором 2.
это не дало каких-либо ценных результатов, такие же сбои наблюдаются.
Spark SQL используется для выполнения запросов,
пример строк кода:
val qresult = spark.sql(q)
qresult.show()
В коде не выполняется перераспределение вручную.