我设置了一个 Flink 集群,我希望能够查看 JobManager 和 TaskManager 的日志和标准输出。 当我转到 Web UI 时,我在相应的选项卡上看到以下错误消息:
JobManager:
Logs
(log file unavailable)
Stdout
(stdout file unavailable)
TaskManager
Logs
Fetching TaskManager log failed.
Stdout
Fetching TaskManager log failed.
我可以看到可以设置一些配置参数,特别是taskmanager.log.path
、job manager.web.log.path
和env.log.dir
。 但是,没有提到这些应该是网络可访问的路径还是本地路径等。
我需要做什么才能查看任务管理器和作业管理器日志?
我发现,如果您正在运行官方的 Flink docker 容器 (https://hub.docker.com/_/flink),默认情况下它会将所有内容吐到控制台(即我猜通常是 docker 最佳实践)。因此,似乎与调整相关的 log4j 配置是/opt/flink/conf/log4j-console.properties
.jobamanger(s)
和taskmanager(s)
都是这种情况。
因此,我将该文件配置为不仅吐槽到控制台,还吐到文件(在我的情况下是滚动文件):
log4j-console.properties:
log4j.rootLogger=INFO, console, file
# Uncomment this if you want to _only_ change Flink's logging
#log4j.logger.org.apache.flink=INFO
# The following lines keep the log level of common libraries/connectors on
# log level INFO. The root logger does not override this. You have to manually
# change the log levels here.
log4j.logger.akka=INFO
log4j.logger.org.apache.kafka=INFO
log4j.logger.org.apache.hadoop=INFO
log4j.logger.org.apache.zookeeper=INFO
# Log all infos to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n
# Log all INFOs to the given rolling file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.file=/opt/flink/log/output.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.append=true
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n
# Suppress the irrelevant (wrong) warnings from the Netty channel handler
log4j.logger.org.apache.flink.shaded.akka.org.jboss.netty.channel.DefaultChannelPipeline=ERROR, console, file
以上与下面的flink-conf.yaml
相结合,能够在作业管理器的日志选项卡中显示作业管理器的日志,并在任务管理器的日志选项卡中显示 taksmanager 的日志。
flink-conf.yaml:
# General configuration
taskmanager.data.port: 6121
taskmanager.rpc.port: 6122
jobmanager.rpc.port: 6123
blob.server.port: 6124
query.server.port: 6125
jobmanager.rpc.address: <your location>
jobmanager.heap.size: 1024m
taskmanager.heap.size: 1024m
taskmanager.numberOfTaskSlots: 1
web.log.path: /opt/flink/log/output.log
taskmanager.log.path: /opt/flink/log/output.log
注意:我在 Flink 1.8.0 上,在 Kubernetes 中运行一个小集群(即作业管理器和任务管理器的单独 pod)
JobManager Web UI 远程请求任务管理器日志,因此这些日志不必驻留在共享文件系统上。另一方面,JobManager 日志似乎是从本地文件系统读取的。
使用默认的 log4j.properties,所有日志文件都将写入log.file
属性指定的路径。使用默认的 Flink 启动脚本,此属性中的目录由env.log.dir
config 选项控制(通过FLINK_LOG_DIR
变量)。
taskmanager.log.path
似乎仅在作业管理器从任务管理器请求日志时使用。但是,如果未设置,则有一个回退log.file
,这应该会导致自动使用正确的目录。同样,jobmanager.web.log.path
在设置log.file
时甚至根本不使用。
因此,我认为taskmanager.log.path
和jobmanager.web.log.path
与生产部署无关,并且无法判断它们应该如何使用(请参阅我相应的 Flink 错误报告)。您可以设置env.log.dir
来控制日志文件位置,原则上这也应该适用于 Web UI。