从源码构建 Flink

本篇主题是如何从版本 1.12-SNAPSHOT 的源码构建 Flink。

首先需要准备源码。可以从发布版本下载源码或者从 Git 库克隆 Flink 源码

还需要准备 Maven 3JDK (Java开发套件)。Flink 依赖 Java 8 或更新的版本来进行构建。

*注意:Maven 3.3.x 可以构建 Flink,但是不能正确地屏蔽掉指定的依赖。Maven 3.2.5 可以正确地构建库文件。

运行单元测试需要 Java 8u51 以上的版本,以避免使用 PowerMock Runner 的单元测试失败。

输入以下命令从 Git 克隆代码

git clone https://github.com/apache/flink

最简单的构建 Flink 的方法是执行如下命令:

mvn clean install -DskipTests

上面的 Maven 指令(mvn)首先删除(clean)所有存在的构建,然后构建一个新的 Flink 运行包(install)。

为了加速构建,可以执行如下命令,以跳过测试,QA 的插件和 JavaDocs 的生成:

mvn clean install -DskipTests -Dfast

先决条件

  1. 构建 Flink

    如果想构建一个可用于 pip 安装的 PyFlink 包,需要先构建 Flink 工程,如 构建 Flink 中所述。

  2. Python 的版本为 3.5, 3.6, 3.7 或者 3.8.

     $ python --version
     # the version printed here must be 3.5, 3.6, 3.7 or 3.8
    
  3. 构建 PyFlink 的 Cython 扩展模块(可选的)

    为了构建 PyFlink 的 Cython 扩展模块,需要 C 编译器。在不同操作系统上安装 C 编译器的方式略有不同:

    • Linux Linux 操作系统通常预装有 GCC。否则,需要手动安装。例如,可以在 Ubuntu 或 Debian 上使用命令sudo apt-get install build-essential安装。

    • Mac OS X 要在 Mac OS X 上安装 GCC,你需要下载并安装 Xcode 命令行工具,该工具可在 Apple 的开发人员页面中找到。

    还需要使用以下命令安装依赖项:

     $ python -m pip install -r flink-python/dev/dev-requirements.txt
    

安装

进入 Flink 源码根目录,并执行以下命令,构建 PyFlink 的源码发布包和 wheel 包:

cd flink-python; python setup.py sdist bdist_wheel

构建好的源码发布包和 wheel 包位于./flink-python/dist/目录下。它们均可使用 pip 安装,比如:

python -m pip install dist/*.tar.gz

依赖屏蔽

Flink 屏蔽了一些它使用的包,这样做是为了避免与程序员自己引入的包的存在的可能的版本冲突。屏蔽掉的包包括 Google Guava,Asm,Apache Curator,Apache HTTP Components,Netty 等。

这种依赖屏蔽机制最近在 Maven 中有所改变。需要用户根据 Maven 的的不同版本来执行不同的命令。

对于Maven 3.1.x and 3.2.x 直接在 Flink 源码根目录执行命令 mvn clean install -DskipTests 就足够了。

Maven 3.3.x 如下的构建需要两步走:第一步需要在基础目录下执行编译构建;第二步需要在编译后的 flink-dist 目录下执行:

mvn clean install -DskipTests
cd flink-dist
mvn clean install

注意: 运行 mvn --version 以查看Maven的版本。

Back to top

Hadoop 版本

请查看 Hadoop 集成模块 一节中关于处理 Hadoop 的类和版本问题的方法。

Scala 版本

Info 只是用 Java 库和 API 的用户可以 忽略 这一部分。

Flink 有使用 Scala 来写的 API,库和运行时模块。使用 Scala API 和库的同学必须配置 Flink 的 Scala 版本和自己的 Flink 版本(因为 Scala 并不严格的向后兼容)。

从 1.7 版本开始,Flink 可以使用 Scala 2.11(默认)和 2.12 来构建。

如果使用 Scala 2.12 来进行构建,执行如下命令:

mvn clean install -DskipTests -Dscala-2.12

Back to top

加密的文件系统

如果你的 home 目录是加密的,可能遇到如下异常 java.io.IOException: File name too long。一些像 Ubuntu 的 enfs 这样的加密文件系统因为不支持长文件名会产生这个异常。

解决方法是添加如下内容到 pom.xml 文件中出现这个错误的模块的编译器配置项下。

<args>
    <arg>-Xmax-classfile-name</arg>
    <arg>128</arg>
</args>

例如,如果错误出现在 flink-yarn 模块下,上述的代码需要添加到 scala-maven-plugin<configuration> 项下。请查看这个问题的链接获取更多信息。

Back to top