flink和kafka在docker中集成报错

一、前提介绍⚠️

本着深入学习flink的心态,搭建官网的flink运行demo,发现在docker中搭建flink消费kafka数据并写入前端展示组件过程中发现了一些不大不小,但是特别消耗精力的问题。现整理出来,给自己一个记录,也是给别人一个方便。希望可以帮助到您谢谢~~
说实话,运行起来对我来说听不容易的。。。😢😢😢😢😢
在这里插入图片描述

在这里插入图片描述

【demo地址】:https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/try-flink/table_api/ ;
【flink版本】:1.13.1;
【maven版本】:apache-maven-3.6.3
【其余组件版本】:按照demo地址使用maven构建之后,各自组件版本就可以看到了。这里就单纯只列出了flink的主版本,其他版本可以搭建好自查;

二、问题罗列🤔

1)docker build失败

$ docker-compose build 过程失败⚠️ 报错如下:
在这里插入图片描述
如图,在build过程中失败,报错其中一个包无法找到,不存在。
在project项目进行maven compile发现也失败了,报一样的错。
在这里插入图片描述
发现这个包其实我没有用到,在代码中其实是被注释掉的,但是在下载依赖和打包编译的时候还是去编译这个包了,所以我直接将这个包去掉【注意这里去掉是直接删除掉这两行代码,而不是注释掉,注释掉也会编译】,然后再次compile就成功过了。
在这里插入图片描述
本地编译完成后,再去dcoker build发现就可以成功下载所有的组件了。

2)在docker容器内安装一些常见的命令如netstat、vim等

一开始我想的是,现在docker中安装yum,然后使用yum安装,后来发现其实docker自身带着的依赖管理组件不是yum,而是apt-get,所以我直接使用apt-get来安装新的命令插件。 【使用apt-get安装前先更新该插件!!!可以防止很多错误】

进入docker容器前:
1)先使用镜像来启动容器

docker run -it <ImageId> bash

2)在新界面打开一个会话,使用root账户进入,因为安装新插件需要root权限

docker exec -it -u root <上面的ContainerId> bin/bash

3)在root账户界面下执行下述命令

##先更新
apt-get update;
## 安装各种插件
apt-get install vim;
apt-get install net-tools;

3)使用apt-get安装报错 unable to locate XXX

安装前先更新apt-get命令,如问题2)所示

4)docker-compose up -d后发现flink报如下错:

Caused by: java.lang.ClassCastException: cannot assign instance of org.apache.commons.collections.map.LinkedMap to field org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumerBase.pendingOffsetsToCommit of type org.apache.commons.collections.map.LinkedMap in instance of org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer010

java的默认类加载器是双亲委派原则,加载顺序如下:
在这里插入图片描述
这样做的好处是,一个类只能被一个加载器所加载,不会导致重复。但是flink并不是按照这种加载顺序加载,而是从下到上的逆序加载。
💗官方解释:
在使用动态类加载的设置中,您可能会看到样式com.foo.X中的异常无法转换为com.foo.X。这意味着不同的类加载器加载了com.foo.X类的多个版本,并且试图将该类的类型分配给彼此。

一个常见的原因是库与Flink的反向类加载方法不兼容。您可以关闭反向类加载来验证这一点(在Flink配置中设置classloader.resolve-order:parent first)或从反向类加载中排除库(在Flink配置中设置classloader.parent-first-patterns-additional)。

另一个原因可能是缓存对象实例,如ApacheAvro之类的一些库所生成的,或者是通过内部对象(例如通过Guava的内部对象)生成的。这里的解决方案是在没有任何动态类加载的情况下进行设置,或者确保相应的库完全是动态加载代码的一部分。后者意味着库不能添加到Flink的/lib文件夹中,而必须是应用程序的fat-jar/uber-jar的一部分

💗原文

In setups with dynamic classloading, you may see an exception in the style com.foo.X cannot be cast to com.foo.X. This means that multiple versions of the class com.foo.X have been loaded by different class loaders, and types of that class are attempted to be assigned to each other.

One common reason is that a library is not compatible with Flink’s inverted classloading approach. You can turn off inverted classloading to verify this (set classloader.resolve-order: parent-first in the Flink config) or exclude the library from inverted classloading (set classloader.parent-first-patterns-additional in the Flink config).
Another cause can be cached object instances, as produced by some libraries like Apache Avro, or by interning objects (for example via Guava’s Interners). The solution here is to either have a setup without any dynamic classloading, or to make sure that the respective library is fully part of the dynamically loaded code. The latter means that the library must not be added to Flink’s /lib folder, but must be part of the application’s fat-jar/uber-jar

这个错误我修改了好几次都没解决,后来发现官网给的文件Dockerfile和compose.yml根本就是不相干的,所以我一直在Dockerfile上修改是无济于事的。
在这里加不起作用:
在这里插入图片描述
所以我修改了compose.yaml启动的image,之前的镜像是这样的:
在这里插入图片描述
我手动生成一个新的镜像,在此基础上,然后将flink-conf.yaml文件加上了禁止逆序加载类的设置。生成了一个新的镜像。
在这里插入图片描述
将此Dcokerfile文件所在路径下,执行:

$ docker build -t myflink:20210911v1 .

之后使用我新建的镜像启动官方实例

docker-compose up -d

三、常见命令

1)文件寻找是否存在某字符串

在这里插入图片描述

2)移除全部停止的容器

docker rm $(docker container ls -f "status=exited" -q)

3)查看当前端口使用情况

netstat -tulnp;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值