应用程序分析与调试

每个独立的 JobManager,TaskManager,HistoryServer,ZooKeeper 守护进程都将 stdoutstderr 重定向到名称后缀为 .out 的文件,并将其内部的日志记录写入到 .log 后缀的文件。用户可以在 env.java.opts.allenv.java.opts.jobmanagerenv.java.opts.taskmanagerenv.java.opts.historyserverenv.java.opts.client 配置项中配置 Java 选项(包括 log 相关的选项),同样也可以使用脚本变量 FLINK_LOG_PREFIX 定义日志文件,并将选项括在双引号中以供后期使用。日志文件将使用 FLINK_LOG_PREFIX 与默认的 .out.log 后缀一起滚动。

使用 Java Flight Recorder 分析

Java Flight Recorder 是 Oracle JDK 内置的分析和事件收集框架。Java Mission Control 是一套先进的工具,可以对 Java Flight Recorder 收集的大量数据进行高效和详细的分析。配置示例:

  1. env.java.opts.all: "-XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+FlightRecorder -XX:+DebugNonSafepoints -XX:FlightRecorderOptions=defaultrecording=true,dumponexit=true,dumponexitpath=${FLINK_LOG_PREFIX}.jfr"

使用 JITWatch 分析

JITWatch Java HotSpot JIT 编译器的日志分析器和可视化工具,用于检查内联决策、热点方法、字节码和汇编。配置示例:

  1. env.java.opts.all: "-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:LogFile=${FLINK_LOG_PREFIX}.jit -XX:+PrintAssembly"

分析内存溢出(OOM)问题

如果你的 Flink 应用程序遇到 OutOfMemoryExceptions,那么启用在内存溢出错误时堆转储(Heap Dump)是一个好主意。

  1. env.java.opts.all: "-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${FLINK_LOG_PREFIX}.hprof"

堆转储(Heap Dump)将使你能够方便地分析用户代码中潜在的内存泄漏问题。如果内存泄漏是由 Flink 引起的,那么请联系开发人员邮件列表

分析内存和垃圾回收行为

内存使用和垃圾回收会对你的应用程序产生巨大的影响。如果 GC 停顿时间过长,其影响小到性能下降,大到集群完全瘫痪。如果你想更好地理解应用程序的内存和 GC 行为,可以在 TaskManagers 上启用内存日志记录。

  1. taskmanager.debug.memory.log: true
  2. taskmanager.debug.memory.log-interval: 10000 // 10s interval

如果你想了解更详细的 GC 统计数据,可以通过以下方式激活 JVM 的 GC 日志记录:

  1. env.java.opts.all: "-Xloggc:${FLINK_LOG_PREFIX}.gc.log -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintPromotionFailure -XX:+PrintGCCause"