使用Docker搭建Flink集群


前言

最近接触了一下docker,想搭个Flink集群玩一玩,在网上搜了一下,发现挺多都是从Dockerfile开始构建的,然后我在官网上看了一下,发现有使用Docker进行搭建的教程。我参考官网的方式,在Linux环境下进行构建,顺便记录一下我踩过的坑。
主要有两种方式进行构建,分别是使用docker命令进行构建使用docker-compose进行构建,在进行操作之前,我已经安装好了docker,安装docker并且给docker换国内源的教程这里就不在赘述了,可以在网上搜索


方式一:使用docker命令进行构建

  • 创建网络
docker network create app-tier --bridge
  • 创建jobmanager容器
docker run -t -d --name jmr \
--network app-tier \
-e JOB_MANAGER_RPC_ADDRESS=jmr \
-p 8081:8081  \
flink:1.9.2-scala_2.12 jobmanager
  • 创建taskmanager容器
docker run -t -d --name tmr \
--network app-tier \
-e JOB_MANAGER_RPC_ADDRESS=jmr   \
flink:1.9.2-scala_2.12 taskmanager

方式二:使用docker-compose进行构建

使用这种方式必须先安装docker-compose
我使用了以下命令进行安装,参考链接

su root
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装完之后,我们可以查看一下docker的版本来验证一下是否安装成功

docker-compose --version

然后我们可以在一个文件夹里创建一个名为docker-compose.yml的文件,方便起见,那么我就在当前文件夹下创建就好了

touch docker-compose.yml

然后编辑这个文件,写入以下内容并保存退出!!!注意格式不能错

version: "2.1"
services:
  jobmanager:
    image: flink:1.9.2-scala_2.12
    expose:
      - "6123"
    ports:
      - "8081:8081"
    command: jobmanager
    environment:
      - JOB_MANAGER_RPC_ADDRESS=jobmanager

  taskmanager:
    image: flink:1.9.2-scala_2.12
    expose:
      - "6121"
      - "6122"
    depends_on:
      - jobmanager
    command: taskmanager
    links:
      - "jobmanager:jobmanager"
    environment:
      - JOB_MANAGER_RPC_ADDRESS=jobmanager

最后通过以下的命令就能够构建起来了

docker-compose up -d

如何查看Flink集群和日志

通过web查看集群

官方镜像暴露了8081端口,并且我们在方式一和方式二中我们都将机器的本地端口8081映射到容器的8081端口上了,所以我们可以通过浏览器来查看集群,由于我是在虚拟机上运行的。所以在浏览器上通过虚拟机IP:端口的方式访问,如果docker是直接装在机器上的,没有装在虚拟机上,那么可以直接通过localhost:8081访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看日志命令

#tmr 是镜像名,可以替换成其他的镜像名
docker logs tmr

答疑解惑

方式一在官网是这么写的

Running a JobManager or a TaskManager
You can run a JobManager (master).

$ docker run --name flink_jobmanager -d -t flink jobmanager

You can also run a TaskManager (worker). Notice that workers need to register with the JobManager directly or via ZooKeeper so the master starts to send them tasks to execute.

$ docker run --name flink_taskmanager -d -t flink taskmanager

这里面有坑,构建单个容器可以,构建多个就报错了
方式二中docker-compose.yml则是从官网照搬过来的

  1. 方式一中为什么要创建网络
    答:创建网络是为了让容器能过通过容器名或者容器ID发现对方,与对方进行通信。不指定创建的网络的话,taskmanager可能会出现以下的错误
ERROR org.apache.flink.runtime.taskexecutor.TaskManagerRunner       - TaskManager initialization failed.
java.net.UnknownHostException: jmr: Name or service not known
        at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method)
  1. 方式一中为什么要指定环境变量JOB_MANAGER_RPC_ADDRESS
    答:不指定环境变量的话,jobmanager(即jmr)不会报错,但是taskmanager(即tmr)会报以下错误
2020-02-27 03:35:12,029 INFO  org.apache.flink.runtime.taskexecutor.TaskExecutor            - Could not resolve ResourceManager address akka.tcp://flink@f59c179f3470:6123/user/resourcemanager, retrying in 10000 ms: Could not connect to rpc endpoint under address akka.tcp://flink@f59c179f3470:6123/user/resourcemanager..
2020-02-27 03:35:20,782 ERROR org.apache.flink.runtime.taskexecutor.TaskExecutor            - Fatal error occurred in TaskExecutor akka.tcp://flink@172.18.0.9:38671/user/taskmanager_0.
org.apache.flink.runtime.taskexecutor.exceptions.RegistrationTimeoutException: Could not register at the ResourceManager within the specified maximum registration duration 300000 ms. This indicates a problem with this instance. Terminating now.
        at org.apache.flink.runtime.taskexecutor.TaskExecutor.registrationTimeout(TaskExecutor.java:1111)
        at org.apache.flink.runtime.taskexecutor.TaskExecutor.lambda$startRegistrationTimeout$8(TaskExecutor.java:1097)
        at org.apache.flink.runtime.rpc.akka.AkkaRpcActor.handleRunAsync(AkkaRpcActor.java:397)

taskmanager在30000ms内无法在jobmanager处注册,抛出异常
出现这个错误的原因是docker启动flink容器的时候,会执行镜像中官方定制的docker-entrypoint.sh脚本文件。
在这个脚本文件中指定了,如果启动命令中没有指定环境变量JOB_MANAGER_RPC_ADDRESS,那么就会使用本机的hostname作为这个环境变量的值,并将其写入到配置文件中。在docker中这个值就是Container ID,所以在日志中可以看到类似的信息

INFO  org.apache.flink.configuration.GlobalConfiguration            - Loading configuration property: jobmanager.rpc.address, f59c179f3470

所以,如果我们没有指定这个环境变量的值,那么taskmanager就会向自身的6123端口发起注册,这是错误的,因为taskmanger没有接受注册的能力,并且taskmanger应该是向jobmanger注册才对。因此我们需要指定JOB_MANAGER_RPC_ADDRESS的值为jobmanger的容器名或者容器ID或者容器的IP

  1. 如何往这个集群中增加或者删除容器
    答:删除容器,我们可以简单地通过rm命令来实现
docker rm -f tmr

可以使用docker命令增加容器,修改下容器名字就可以了

docker run -t -d --name tmr1 \
--network app-tier \
-e JOB_MANAGER_RPC_ADDRESS=jmr   \
flink:1.9.2-scala_2.12 taskmanager

也可以通过修改docker-compose.yaml文件来增加,复制一下taskmanger的配置,修改下容器名就可以了(这个我没试过,应该是可以的),通过命令启动,-d参数在docker和docker-compose中均指以后台的形式启动,这样就不会打印出一大堆的log,可以通过docker logs [容器名]命令查看日志

docker-compose up -d [容器名]
  1. flink:1.9.2-scala_2.12是什么?
    答:这个字符串的格式是 Image name:tagtag中1.9.2是指flink的版本,scala_2.12是指这个版本的flink的版本是使用scala 2.12构建的。如果想使用其他的镜像,可以使用docker search [容器名,比如flink]进行搜索,然后使用docker pull [容器名]命令拉取镜像,想了解flink的更多的版本信息,可以访问https://hub.docker.com/_/flink
  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
回答: Docker搭建kafka集群的过程可以参考以下步骤。首先,需要依赖zookeeper来管理kafka集群的状态和元数据。因此,在搭建kafka集群之前,需要先搭建一个zookeeper集群。可以使用Docker创建一个新的网络,并在该网络上启动一个zookeeper集群。接下来,创建一个docker-compose文件(例如docker-compose-zk.yml),在该文件中定义zookeeper集群的配置和启动参数。然后,使用docker-compose命令启动zookeeper集群。接下来,创建一个新的docker-compose文件(例如docker-compose-kafka.yml),在该文件中定义kafka集群的配置和启动参数。在这个文件中,需要挂载一些文件,这些文件包括kafka的配置文件和数据目录。挂载这些文件的目的是为了保留kafka集群的状态和数据。最后,使用docker-compose命令启动kafka集群。在集群启动后,可以安装kafka-manager来管理kafka集群。可以创建一个新的docker-compose文件(例如docker-compose-kafka-manager.yml),在该文件中定义kafka-manager的配置和启动参数。使用docker-compose命令启动kafka-manager。配置kafka-manager连接到kafka集群,并进行测试。\[1\] 在搭建过程中,可能会遇到一些问题。例如,如果之前已经安装过旧版本的docker,可能会导致安装新版本docker时出现冲突的错误。解决这个问题的方法之一是使用wget命令下载docker-ce.repo文件,并将其放置在/etc/yum.repos.d/目录下。这样可以更新docker的安装源,然后重新安装docker。\[2\]\[3\] #### 引用[.reference_title] - *1* [Docker搭建kafka集群](https://blog.csdn.net/weixin_48412846/article/details/128724377)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [docker搭建kafka集群](https://blog.csdn.net/fxh13579/article/details/81299185)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值