我有 flink jobmanager 和 taskmanager 节点,还有 hdfs namenode 和 datanode 作为 Docker 容器。
jobmanager:
image: flink:1.17.2-scala_2.12-java8
ports:
- "8081:8081"
environment:
- HADOOP_CLASSPATH=??
- |
FLINK_PROPERTIES=
...
taskmanager:
image: flink:1.17.2-scala_2.12-java8
depends_on:
- jobmanager
scale: 2
environment:
- HADOOP_CLASSPATH=??
- |
FLINK_PROPERTIES=
...
namenode:
image: bde2020/hadoop-namenode:latest
ports:
- 9870:9870
- 9000:9000
- 8020:8020
environment:
- CLUSTER_NAME=hadoop-cluster
- HDFS_CONF_dfs_blocksize=128m
- HDFS_CONF_dfs_replication=1
datanode:
image: bde2020/hadoop-datanode:latest
ports:
- 9864:9864
depends_on:
- namenode
scale: 1
environment:
- CLUSTER_NAME=hadoop-cluster
- SERVICE_PRECONDITION=namenode:9870
- HDFS_CONF_dfs_blocksize=128m
- HDFS_CONF_dfs_replication=1
- CORE_CONF_fs_defaultFS=hdfs://namenode:8020
要运行作业,我需要在 Flink 容器中指定 HADOOP_CLASSPATH 环境变量。
hadoop classpath
namenode 容器内带我这个:
# export HADOOP_CLASSPATH=$(hadoop classpath)
# echo $HADOOP_CLASSPATH
/etc/hadoop:/opt/hadoop-3.2.1/share/hadoop/common/lib/*:/opt/hadoop-3.2.1/share/hadoop/common/*:/opt/hadoop-3.2.1/share/hadoop/hdfs:/opt/hadoop-3.2.1/share/hadoop/hdfs/lib/*:/opt/hadoop-3.2.1/share/hadoop/hdfs/*:/opt/hadoop-3.2.1/share/hadoop/mapreduce/lib/*:/opt/hadoop-3.2.1/share/hadoop/mapreduce/*:/opt/hadoop-3.2.1/share/hadoop/yarn:/opt/hadoop-3.2.1/share/hadoop/yarn/lib/*:/opt/hadoop-3.2.1/share/hadoop/yarn/*
但是,我不明白如何在Flink容器内指定HADOOP_CLASSPATH,因为hadoop本身安装在另一个容器中。任何帮助将不胜感激。
Flink 需要
HADOOP_CLASSPATH
才能访问 JAR 文件。这些 JAR 文件必须在本地可供 Flink 使用。
据我所知,如果不使用中间的挂载,您就无法将一个容器的文件系统的一部分公开给另一个容器(然后您需要将 Hadoop 容器上的必要文件复制到该容器,然后才能在 Flink 容器上使用它们)。
另一种选择是构建您自己的 Flink 容器来扩展
flink:1.17.2-scala_2.12-java8
图像。 这里有一个这样做的例子 - 在这种情况下,我只是挑选了我认为我的 Flink 程序所需的 JAR,而不是整个 Hadoop 发行版。您可以在此处阅读有关此方法的更多信息(在This is where it gets "fun": Hadoop Dependency
标题下)