我通过 Helm Operator 将 Flink 部署到 Kubernetes 集群。我启用了
flink-s3-f2-hadoop
插件:
# Source: flink-demo/templates/flink-session-cluster.yaml
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
name: flink-session-cluster
spec:
image: flink:1.18
flinkVersion: v1_18
flinkConfiguration:
taskmanager.numberOfTaskSlots: "2"
serviceAccount: flink
podTemplate:
spec:
containers:
- name: flink-main-container
env:
- name: ENABLE_BUILT_IN_PLUGINS
value: flink-s3-fs-hadoop-1.18.1.jar
jobManager:
resource:
cpu: 1
memory: 2048m
taskManager:
resource:
cpu: 1
memory: 2048m
然后我部署了工作:
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
name: kafka-to-iceberg-job
spec:
deploymentName: flink-session-cluster
job:
jarURI: <joburi>
parallelism: 1
upgradeMode: stateless
在
pom.xml
中,我添加了依赖关系 hadoop-common
,如下所示:
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.3.6</version>
<scope>provided</scope>
</dependency>
我的理解是,如果您在
flink-s3-f2-hadoop
中启用插件 podTemplate
,那么它应该可以工作,但我仍然收到 Caused by: java.lang.ClassNotFoundException: org.apache.hadoop.conf.Configuration
错误。
添加
provided
范围只是表明在构造可执行文件时,依赖关系将在运行时可用(即通常由运行基于操作员的作业的映像提供),在本例中是 flink:1.18
映像。
您不应该明确需要对 Hadoop 的引用,因为
ENABLE_BUILT_IN_PLUGINS
配置应该可以为您提供所需的一切。我以完全相同的方式使用了 S3 和 GCS 相关插件来针对 Flink 的普通图像。
您确定这不是 YAML 间距/格式问题吗?尝试设置间距,使您的项目显示在与您的
env
相同的水平上,如下所示:
spec:
...
podTemplate:
spec:
containers:
- name: flink-main-container
env:
- name: ENABLE_BUILT_IN_PLUGINS
value: flink-s3-fs-hadoop-1.18.1.jar
您应该在日志中看到一些内容,表明它正在尝试在 pod 启动时加载依赖项。