部署教程
# 拉取镜像
$ docker pull flink:1.13.6-scala_2.12-java8
# 设置FLINK_PROPERTIES, 这里我设置了slot的插槽数,需要在创建容器的时候就进行设置,
# 之后进入到容器里面的flink-conf.yaml里面再进行修改重启是没有用的,默认是1
$ FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager
taskmanager.numberOfTaskSlots: 8
"
$ docker network create flink-network
# 创建容器运行 jobmanager
$ docker run -d\
--name=jobmanager \
--network flink-network \
--publish 8081:8081 \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
flink:1.13.6-scala_2.12-java8 jobmanager
# 创建容器运行 taskmanager
$ docker run -d\
--name=taskmanager \
--network flink-network \
--env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \
flink:1.13.6-scala_2.12-java8 taskmanager
# 查看容器是否在运行,两个进程都在运行就可以在ip:8081下进入webui界面进行查看
$ docker ps
问题1:webui界面 有log打印但是没有stdout 输出
这个问题的解决办法我网上参考了很多教程,在下面这个教程找到了一点思路
https://blog.csdn.net/Allocator/article/details/106858679
我跟他的情况稍有不一样:
1. 他是log和stdout都没有显示,我是有log显示但是没有stdout显示
2. flink 的版本不一样,所以里面的一些脚本不太一致,按照他的方法进行改动导致我taskmanager启动不了
但是还是给了我一些思路,下面是排查过程,不感兴趣的可以跳过
1. webui界面查看stdout的请求:我之前的错误,不是下面这个,之前的错误异常大概是找不到.out文件这样的(我懒得复现,就口头说了)大概就是没有生成.out文件,查看log界面的请求,是有返回的。
2. 当我按照上面的思路,把docker-entrypoint.sh 的start-foregroud 改成start 且在最后一行添加
exec /bin/bash -c "tail -f $FLINK_HOME/log/*.log" 之后,我的taskmanager起不来,日志是这样的。
3. 到这里我很感谢原博主提供的思路,查找原因在哪,以及为什么要添加最后一行,观察上面的日志我猜测,大概是没有执行到最后一行的代码,所以导致容器判断没有程序在运行,所以自己退出了,所以下面是我的修改
/docker-entrypoint.sh
通过查找日志打印的 “daemon on host” 定位到了/opt/flink/bin/flink-daemon.sh 文件,在执行java命令的下面添加了exec /bin/bash -c "tail -f $FLINK_HOME/log/*.log" 命令 然后保存配置文件,传到容器里面。然后重启,就可以发现log和stdout显示就都有了,至少我实测是这样的(docker里面修改配置的命令我下面会提到)
问题二: 通过修改flink-conf.yaml 里面的taskmanager.numberOfTaskSlots 来改动slot的数量不生效
这块我通过修改 flink-conf.yaml的taskmanager.numberOfTaskSlots: 8配置,然后保存重启,发现不生效,然后我查看容器里面这个文件发现又被改成了 默认的1,然后看了一下日志,这个选项是通过命令行进行指定的
所以修改有两个途径:
1. 修改docker-compose.yml 里面的taskmanager.numberOfTaskSlots 配置,但是这个还要重新build镜像太麻烦了,我没用
2. 观察上面可以发现它使用了FLINK_PROPERTIES 变量,这个是可以通过外部传入的,所以可以通过这个变量进行修改 修改步骤放在了部署教程里面,这里就不赘述了。
docker 容器里面没有vi 怎么修改配置文件
我也是参考这个文章的Docker修改容器内部文件的方法_docker内部如何修改文件_Miracle42的博客-CSDN博客
上面用到的两个docker-entrypoint.sh和flink-daemon.sh的文件传输命令,我贴在这里,需要的自取文章来源:https://www.toymoban.com/news/detail-820172.html
# 获取镜像内部的文件,注意我这里需要创建 flink目录
docker cp jobmanager:/docker-entrypoint.sh ./flink/docker-entrypoint.sh
docker cp jobmanager:/opt/flink/bin/flink-daemon.sh ./flink/flink-daemon.sh
# 覆盖镜像内部的文件
docker cp ./flink/docker-entrypoint.sh taskmanager:/docker-entrypoint.sh
docker cp ./flink/flink-daemon.sh taskmanager:/opt/flink/bin/flink-daemon.sh
完结撒花文章来源地址https://www.toymoban.com/news/detail-820172.html
到了这里,关于docker 部署flink和遇到webui 下taskmanager的无stdout 打印解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!