Flink-构建python环境镜像

摘要

官方文档

准备工作

获取源码包

官网下载地址

1
2
3
4
5
6
7
8
9
# 下载源码包
wget --no-check-certificate https://dlcdn.apache.org/flink/flink-1.15.0/flink-1.15.0-src.tgz
# 下载编译包
wget --no-check-certificate https://dlcdn.apache.org/flink/flink-1.15.0/flink-1.15.0-bin-scala_2.12.tgz

# 构建编译环境
tar xf flink-1.15.0-src.tgz -C /usr/local/src
mkdir -p /usr/local/src/flink-1.15.0/flink-dist/target/flink-1.15.0-bin
tar xf flink-1.15.0-bin-scala_2.12.tgz -C /usr/local/src/flink-1.15.0/flink-dist/target/flink-1.15.0-bin

为什么要这么做?

  • 在编译flink-python环境包的时候需要将flink以来的jar包打包进去
  • 从源码包编译需要配置mvn环境先进行jar的编译

编译安装python3.6.8

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装环境依赖
yum install -y libffi-devel # 不安装会缺少ctype
yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

# 获取源码包
cd /usr/local/src
wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tar.xz
tar xf Python-3.6.8.tar.xz

# 编译安装
cd Python-3.6.8
./configure --prefix=/usr/local/src/python386
make -j 4 && make install

# 添加环境变量
echo -e '
export PYTHON_HOME=/usr/local/src/python386
export PATH=$PYTHON_HOME/bin:$PATH
' >> /etc/profile
source /etc/profile

安装java11

1
yum install -y java-11-openjdk

安装jar

1
yum install -y maven-jar-plugin

配置maven

使用上述的方式后不需要再配置maven环境进行编译

官方下载地址

image-20220607141607614

1
2
3
4
5
6
7
8
9
10
# 下载最新版本二进制包
wget --no-check-certificate https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz
# 解压
tar xf apache-maven-3.8.5-bin.tar.gz -C /usr/local/src
# 添加环境变量
echo -e '
export MAVEN_HOME=/usr/local/src/apache-maven-3.8.5
export PATH=$MAVEN_HOME/bin:$PATH
' >> /etc/profile
source /etc/profile

配置阿里源

配置阿里源手册

打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ),在<mirrors></mirrors>标签中添加 mirror 子节点:

1
2
3
4
5
6
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

如果想使用其它代理仓库,可在<repositories></repositories>节点中加入对应的仓库使用地址。以使用 spring 代理仓为例:

1
2
3
4
5
6
7
8
9
10
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>

在你的 pom.xml 文件<denpendencies></denpendencies>节点中加入你要引用的文件信息:

1
2
3
4
5
<dependency>
<groupId>[GROUP_ID]</groupId>
<artifactId>[ARTIFACT_ID]</artifactId>
<version>[VERSION]</version>
</dependency>

执行拉取命令:

1
mvn install

从源码构建Flink

官方文档

构建Flunk

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

1
mvn clean install -DskipTests

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

为了加速构建,可以:

  • 使用 ’ -DskipTests’ 跳过测试

  • 使用 fast Maven profile 跳过 QA 的插件和 JavaDocs 的生成

  • 使用 skip-webui-build Maven profile 跳过 WebUI 编译

  • 使用 Maven 并行构建功能,比如 ‘mvn package -T 1C’ 会尝试并行使用多核 CPU,同时让每一个 CPU 核构建1个模块。

    maven-shade-plugin 现存的 bug 可能会在并行构建时产生死锁。建议分2步进行构建:首先使用并行方式运行 mvn validate/test-compile/test,然后使用单线程方式运行 mvn package/verify/install

构建脚本如下:

1
mvn clean install -DskipTests -Dfast -Pskip-webui-build -T 1C

fastskip-webui-build 这两个 Maven profiles 对整体构建时间影响比较大,特别是在存储设备比较慢的机器上,因为对应的任务会读写很多小文件。

先决条件 #

  1. 构建 Flink

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

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

    1
    2
    $ python3 --version
    # the version printed here must be 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 的开发人员页面中找到。

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

    1
    2
    cd /usr/local/src/flink-1.15.0
    python3 -m pip install -r flink-python/dev/dev-requirements.txt

编译依赖包

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 环境中需要有jar命令才能完成编译
# 同时需要在下面的目录中有编译产出
$ tree -d /usr/local/src/flink-1.15.0/flink-dist/target/flink-1.15.0-bin/flink-1.15.0/ -L 2
/usr/local/src/flink-1.15.0/flink-dist/target/flink-1.15.0-bin/flink-1.15.0/
├── bin
├── conf
├── examples
│   ├── batch
│   ├── gelly
│   ├── python
│   ├── streaming
│   └── table
├── lib
├── licenses
├── log
├── opt
│   └── python
└── plugins
├── external-resource-gpu
├── metrics-datadog
├── metrics-graphite
├── metrics-influx
├── metrics-jmx
├── metrics-prometheus
├── metrics-slf4j
└── metrics-statsd

22 directories

# 在opt目录下有编译好的jar包
$ tree /usr/local/src/flink-1.15.0/flink-dist/target/flink-1.15.0-bin/flink-1.15.0/opt/
/usr/local/src/flink-1.15.0/flink-dist/target/flink-1.15.0-bin/flink-1.15.0/opt/
├── flink-azure-fs-hadoop-1.15.0.jar
├── flink-cep-scala_2.12-1.15.0.jar
├── flink-gelly-1.15.0.jar
├── flink-gelly-scala_2.12-1.15.0.jar
├── flink-gs-fs-hadoop-1.15.0.jar
├── flink-oss-fs-hadoop-1.15.0.jar
├── flink-python_2.12-1.15.0.jar
├── flink-queryable-state-runtime-1.15.0.jar
├── flink-s3-fs-hadoop-1.15.0.jar
├── flink-s3-fs-presto-1.15.0.jar
├── flink-shaded-netty-tcnative-dynamic-2.0.44.Final-15.0.jar
├── flink-shaded-zookeeper-3.6.3.jar
├── flink-sql-client-1.15.0.jar
├── flink-state-processor-api-1.15.0.jar
├── flink-table-planner_2.12-1.15.0.jar
└── python
├── cloudpickle-1.2.2-src.zip
├── py4j-0.10.9.3-src.zip
└── pyflink.zip

# 开始编译
cd /usr/local/src/flink-1.15.0/flink-python
python3 setup.py sdist bdist_wheel
cd /usr/local/src/flink-1.15.0/flink-python/apache-flink-libraries
python3 setup.py sdist

# 编译完成的结果
$ cd /usr/local/src/flink-1.15.0/flink-python && tree dist/ apache-flink-libraries/dist/
dist/
├── apache_flink-1.15.0-cp37-cp37m-linux_x86_64.whl
└── apache-flink-1.15.0.tar.gz
apache-flink-libraries/dist/
└── apache-flink-libraries-1.15.0.tar.gz

安装依赖

至此,如果需要在环境中安装依赖就可以直接安装了

1
2
python3 -m pip install dist/*.whl
python3 -m pip install apache-flink-libraries/dist/*.tar.gz

pip安装PyFlink环境

免去繁杂的编译过程直接从pypi

PyFlink 已经被发布到PyPi,免去繁杂的编译过程,可以通过如下方式安装 PyFlink:

  • 缺点是包很大,带宽小的话需要下很久
1
python3 -m pip install apache-flink==1.15.0

官方文档

构建docker镜像

官方文档