Flink 1.9.0 编译时找不到 flink-fs-hadoop-shaded 的解决方案

问题背景

在编译 Apache Flink 1.9.0 版本时,可能会遇到 flink-fs-hadoop-shaded 模块找不到的问题。这个模块是 Flink 与 Hadoop 文件系统集成的关键组件,用于提供对 HDFS 等分布式文件系统的支持。

问题原因

  1. 依赖管理问题:Flink 1.9.0 的构建系统可能没有正确处理这个模块的依赖关系
  2. Maven 仓库缺失:该模块的 artifact 可能没有正确发布到 Maven 中央仓库
  3. 构建配置问题:编译时的 profile 或参数设置不当

解决方案

方法一:使用预构建的二进制包

最简单的解决方案是直接从 Flink 官网下载预编译的二进制包:

wget https://archive.apache.org/dist/flink/flink-1.9.0/flink-1.9.0-bin-scala_2.11.tgz

方法二:从源码正确编译

如果需要从源码编译,请按照以下步骤操作:

  1. 确保安装了必要的构建工具:
# 安装 JDK 8
sudo apt-get install openjdk-8-jdk

# 安装 Maven 3.3.9+
sudo apt-get install maven

  1. 克隆 Flink 源码并切换到 1.9.0 分支:
git clone https://github.com/apache/flink.git
cd flink
git checkout release-1.9.0

  1. 使用正确的 profile 进行编译:
mvn clean install -DskipTests -Dhadoop.version=2.8.5 -Dinclude-hadoop

方法三:手动添加依赖

如果还是找不到该模块,可以尝试手动添加依赖到你的项目中:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-fs-hadoop-shaded</artifactId>
    <version>1.9.0</version>
</dependency>

注意事项

  1. Hadoop 版本兼容性
    Flink 1.9.0 对 Hadoop 版本有严格要求,建议使用 Hadoop 2.8.5 以获得最佳兼容性。其他版本(如 Hadoop 3.x)可能存在 API 不兼容或运行时错误。

    • 验证方法:通过 hadoop version 命令检查当前安装的 Hadoop 版本。
    • 常见问题:若使用错误版本,可能报错 ClassNotFoundExceptionNoSuchMethodError
  2. Maven 环境配置

    • 镜像设置:在 settings.xml 中配置国内镜像(如阿里云)以加速依赖下载:
      <mirror>
        <id>aliyun</id>
        <name>Aliyun Maven Mirror</name>
        <url>https://maven.aliyun.com/repository/public</url>
        <mirrorOf>central</mirrorOf>
      </mirror>
      

    • 依赖仓库:确保包含 Flink 官方仓库:
      <repository>
        <id>apache.snapshots</id>
        <url>https://repository.apache.org/snapshots/</url>
        <releases><enabled>false</enabled></releases>
      </repository>
      

  3. IDE 编译指南

    • IntelliJ IDEA:需通过 File > New > Project from Existing Sources 导入项目,并勾选 Import Maven projects automatically
    • Eclipse:使用 Import > Maven > Existing Maven Projects,完成后右键项目选择 Update Project

替代方案

  1. 升级 Flink 版本

    • 推荐版本:Flink 1.13+ 修复了早期版本的许多兼容性问题,且支持更广泛的 Hadoop 版本(如 3.1.1)。
    • 迁移步骤
      1. 修改 pom.xml 中的 Flink 依赖版本。
      2. 检查 API 变更(如废弃的类需替换为新 API)。
  2. 使用 Docker 镜像

    • 官方镜像:直接运行预配置的 Flink 环境:
      docker run -it apache/flink:1.9.0-scala_2.12 bash
      

    • 自定义镜像:基于 flink:1.9.0 扩展,添加 Hadoop 依赖:
      FROM apache/flink:1.9.0
      RUN apt-get update && apt-get install -y hadoop-2.8.5
      

  3. 社区支持

    • 论坛:在 Apache Flink 邮件列表 中描述问题,附上错误日志和复现步骤。
    • Issue Tracker:在 JIRA 提交 Bug 报告时,需注明:
      • Flink/Hadoop 版本
      • 完整的堆栈跟踪
      • 最小化复现代码

扩展场景示例

场景:Hadoop 版本冲突
若环境中已安装 Hadoop 3.x,可通过以下方式隔离依赖:

  1. 在 Flink 的 lib 目录下手动放置 Hadoop 2.8.5 的 JAR 文件(如 hadoop-common-2.8.5.jar)。
  2. 设置 HADOOP_CLASSPATH 环境变量指向 2.8.5 的库路径。

示例命令

export HADOOP_CLASSPATH=/path/to/hadoop-2.8.5/share/hadoop/common/*
./bin/start-cluster.sh

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐