Я настраиваю наш продукт для G1GC, и в ходе этого тестирования у меня регулярно возникают сбои в работе Spark Workers, что, конечно, приводит к сбою JVM. Когда это происходит, JVM Spark Worker / Executor автоматически перезапускает себя, который затем перезаписывает журналы GC, которые были записаны для предыдущей JVM Executor.
Если честно, я не совсем уверен в том, как механизм JVM Executor перезапускается, но я запускаю службу Spark Driver через init.d
, которая, в свою очередь, вызывает скрипт bash. В этом сценарии я использую метку времени, которая добавляется к имени файла журнала GC: * 1004 *
today=$(date +%Y%m%dT%H%M%S%3N)
SPARK_HEAP_DUMP="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${SPARK_LOG_HOME}/heapdump_$$_${today}.hprof"
SPARK_GC_LOGS="-Xloggc:${SPARK_LOG_HOME}/gc_${today}.log -XX:LogFile=${SPARK_LOG_HOME}/safepoint_${today}.log"
GC_OPTS="-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:+PrintFlagsFinal -XX:+PrintJNIGCStalls -XX:+PrintTLAB -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=15 -XX:GCLogFileSize=48M -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+PrintHeapAtGC -XX:+PrintGCCause -XX:+PrintReferenceGC -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1"
Я думаю, проблема в том, что этот скрипт отправляет эти параметры драйверу Spark, который затем передает их исполнителям Spark (через аргумент -Dspark.executor.extraJavaOptions
), которые являются отдельными серверами, и когда происходит сбой JVM Executor, он просто использует команду, которая была первоначально отправлена для запуска резервного копирования, что будет означать, что часть метки времени в имени файла журнала GC является статической:
SPARK_STANDALONE_OPTS=`property ${SPARK_APP_CONFIG}/spark.properties "spark-standalone.extra.args"`
SPARK_STANDALONE_OPTS="$SPARK_STANDALONE_OPTS $GC_OPTS $SPARK_GC_LOGS $SPARK_HEAP_DUMP"
exec java ${SPARK_APP_HEAP_DUMP} ${GC_OPTS} ${SPARK_APP_GC_LOGS} \
${DRIVER_JAVA_OPTIONS} \
-Dspark.executor.memory=${EXECUTOR_MEMORY} \
-Dspark.executor.extraJavaOptions="${SPARK_STANDALONE_OPTS}" \
-classpath ${CLASSPATH} \
com.company.spark.Main >> ${SPARK_APP_LOGDIR}/${SPARK_APP_LOGFILE} 2>&1 &
Это затрудняет мне отладку причины ошибок, так как я теряю активность и состояние рабочих, которые привели к сбою JVM. Любые идеи о том, как я могу справиться с этой ситуацией и сохранить журналы GC на рабочих, даже после сбоя JVM / segfault?