一、说明
Flink全托管开发控制台提供了Flink Python作业开发、提交、暂停和停止、依赖管理等功能。
二、作业开发
下面介绍Python API作业开发的背景信息、使用限制、开发方法和Connector使用等。
1、背景信息和使用限制
阿里的托管平台已经安装的Python的软件包可根据操作手册查询。
由于Flink全托管产品受部署环境、网络环境等因素的影响,所以开发Python作业,需要注意以下限制:
- Flink全托管集群已预装了Python 3.7.9
- Python环境中已预装了Pandas、NumPy、PyArrow等常用的Python库。因此需要您在Python 3.7版本开发代码。
- Flink全托管运行环境使用的是JDK1.8,如果Python作业中依赖第三方JAR包,请确保JAR包兼容JDK1.8。
- 仅支持开源Scala V2.11版本,如果Python作业中依赖第三方JAR包,请确保使用Scala V2.11对应的JAR包依赖。
2、开发
您需要在线下完成Python API作业开发后,再在Flink全托管开发控制台上提交作业到集群上运行。您可以参见以下文档开发Flink全托管产品业务代码:
Apache Flink V1.12业务代码开发,请参见Flink Python API开发指南。
3、作业调试
在Python自定义函数的代码实现中,通过logging的方式,输出日志信息,方便后期问题定位,示例如下。
@udf(result_type=DataTypes.BIGINT())
def add(i, j):
logging.info("hello world")
return i + j
日志输出后,您可以在TaskManager的日志文件查看。
4、Connector使用
Flink全托管所支持的Connector列表,登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的控制台。
在左侧导航栏,单击资源上传。
单击上传资源,选择您要上传的目标Connector的JAR包。
您可以上传您自己开发的Connector,也可以上传Flink全托管产品提供的Connector。Flink全托管产品提供的Connector官方JAR包的下载地址,请参见Connector列表。
在目标作业开发右侧高级配置面板中的附加依赖文件项,选择目标Connector的JAR包。
在目标作业开发右侧高级配置面板中的更多Flink配置项,添加相关配置。
假如您的作业需要依赖多个Connector JAR包,且名字分别为connector-1.jar和connector-2.jar,则配置信息如下。
pipeline.classpaths: 'file:///flink/usrlib/connector-1.jar;file:///flink/usrlib/connector
三、作业提交
在阿里管理控制台,Python作业的提交比较类似于Flink SQL ,其限制在于Python作业仅支持Per-Job集群。并在配置设置中使用与Python相关的配置。
四、作业启动
类似Flink SQL 作业启动.
五、作业暂停与停止
类似Flink SQL 作业启动.
六、使用Python依赖
您可以在Flink Python作业中使用自定义的Python虚拟环境、第三方Python包、JAR包和数据文件等.
1、设置Python 3.7的虚拟环境
在本地准备setup-pyflink-virtual-env.sh脚本,其内容如下。
set -e
# 下载Python 3.7 miniconda.sh脚本。
wget "https://repo.continuum.io/miniconda/Miniconda3-py37_4.9.2-Linux-x86_64.sh" -O "miniconda.sh"
# 为Python 3.7 miniconda.sh脚本添加执行权限。
chmod +x miniconda.sh
# 创建Python的虚拟环境。
./miniconda.sh -b -p venv
# 激活Conda Python虚拟环境。
source venv/bin/activate ""
# 安装PyFlink依赖。
# update the PyFlink version if needed
pip install "apache-flink==1.12.1"
# 关闭Conda Python虚拟环境。
conda deactivate
# 删除缓存的包。
rm -rf venv/pkgs
# 将准备好的Conda Python虚拟环境打包。
zip -r venv.zip venv
在本地准备build.sh脚本,其内容如下。
#!/bin/bash
set -e -x
yum install -y zip wget
cd /root/
bash /build/setup-pyflink-virtual-env.sh
mv venv.zip /build/
在CMD命令行,执行如下命令。
docker run -it --rm -v $PWD:/build -w /build quay.io/pypa/manylinux2014_x86_64 ./build.sh
执行完该命令后,会生成一个名字为venv.zip的文件,即为Python 3.7的虚拟环境。
您也可以修改上述脚本,在虚拟环境中安装所需的第三方Python包。
2、Python作业中使用Python 3.7虚拟环境
登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的开发控制台。
在左侧导航栏,单击资源上传,上传venv.zip文件。
说明 Flink全托管开发控制台上可以上传文件大小的限制为200 MB,而Python虚拟环境的大小通常会超过该限制,因此,您需要通过OSS管理控制台上传文件。
在作业运维页面,单击目标作业名称。
在作业详情页面右上角,单击编辑。
在Python Archives项,选择venv.zip文件。
单击右侧的高级配置,在更多Flink配置项,添加配置信息。
python.executable: venv.zip/venv/bin/python
单击保存。
3、使用第三方Python包
下面将从以下两个场景为您介绍如何使用第三方Python包:
使用可直接Import的第三方Python包,与Pycharm导入第三方包过程类似。
在浏览器上打开PyPI页面。在搜索框中输入目标第三方Python包名称,例如apache-flink 1.12.2。
在搜索结果中,单击目标结果名称。在左侧导航栏,单击Download files。
单击文件名中包含cp37-cp37m-manylinux1的包名称进行下载。
登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的开发控制台。
在左侧导航栏,单击资源上传,上传第三方Python包。
在目标作业开发页面的Python Libraries项,选择所上传的第三方Python包。
单击保存。
使用需要编译的第三方Python包
如果您的第三方Python包是tar.gz格式的压缩包,或从其他地方下载的源码包,且压缩包的根目录下存在setup.py文件,则这种类型的第三方Python包通常需要先编译才能被使用。您需要先在与Flink全托管兼容的环境下编译第三方Python包,然后才可在Python作业中调用第三方Python包。
推荐使用quay.io/pypa/manylinux2014_x86_64镜像容器中的Python 3.7来编译第三方Python包,使用该容器编译生成的包兼容绝大多数Linux环境,关于该镜像容器的更多信息请参见manylinux。
说明 Python 3.7的安装路径为 /opt/python/cp37-cp37m/bin/python3。
下面以opencv-python-headless第三方Python包为例,介绍一下如何编译和使用该第三方Python包。
编译第三方Python包。
在本地准备requirements.txt文件,其内容如下。
opencv-python-headless
在本地准备build.sh脚本,其内容如下。
#!/bin/bash
set -e -x
yum install -y zip
PYBIN=/opt/python/cp37-cp37m/bin
"${PYBIN}/pip" install --target __pypackages__ -r requirements.txt --no-deps
cd __pypackages__ && zip -r deps.zip . && mv deps.zip ../ && cd ..
rm -rf __pypackages__
在CMD命令行,执行如下命令。
docker run -it --rm -v $PWD:/build -w /build quay.io/pypa/manylinux2014_x86_64 /bin/bash build.sh
该命令执行完后,会生成一个名字为deps.zip的文件,该文件为编译之后的第三方Python包。
您也可以修改requirements.txt,安装其他所需的第三方Python包。此外,requirements.txt文件中可以指定多个Python依赖。
在Python作业中使用第三方Python包deps.zip。
登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的开发控制台。
在左侧导航栏,单击资源上传,上传deps.zip。
说明 Flink全托管产品限制可上传的最大文件大小为200 MB,而Python虚拟环境的大小通常会超过该限制,需要通过OSS控制台进行文件上传。
在目标作业开发页面的Python Libraries项,选择deps.zip。
单击保存。
4、使用JAR包
如果您的Flink Python作业中使用了Java类,例如作业中使用了Connector或者Java自定义函数时,可以通过如下方式来指定Connector或者Java自定义函数的JAR包。
登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的开发控制台。
在左侧导航栏,单击资源上传,上传需要使用的JAR包。
在目标作业开发页面的附加依赖文件项,选择需要使用的JAR包。
单击右侧的高级配置,在更多Flink配置项,添加配置信息。
假如需要依赖多个JAR包,且名字分别为jar1.jar和jar2.jar,配置内容如下。
pipeline.classpaths: 'file:///flink/usrlib/jar1.jar;file:///flink/usrlib/jar2.jar'
单击保存。
5、使用数据文件
说明 Flink全托管暂不支持通过上传数据文件的方式来进行python作业调试。
下面将从两个场景为您介绍如何使用数据文件:
通过Python Archives选项方式
如果您的数据文件的数量比较多时,您可以将数据文件打包成一个ZIP包,然后通过如下方式在Python作业中使用。操作步骤如下:
登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的开发控制台。
在左侧导航栏,单击资源上传,上传目标数据文件ZIP包。
在目标作业开发页面的Python Archives项,选择需要使用的数据文件ZIP包。
在Python自定义函数中,可以通过如下方式访问数据文件。假如数据文件所在压缩包名称为mydata.zip。
def map():
with open("mydata.zip/mydata/data.txt") as f:
...
通过附加依赖文件选项
如果您的数据文件数量比较少时,可以通过如下方式在Python作业中使用。操作步骤如下:
登录实时计算控制台。
在Flink全托管页签,单击目标工作空间操作列下的开发控制台。
在左侧导航栏,单击资源上传,上传目标数据文件。
在目标作业开发页面的附加依赖文件项,选择需要的数据文件。
在Python自定义函数中,可以通过如下方式访问数据文件。以数据文件名称为data.txt为例的代码如下。
def map():
with open("/flink/usrlib/data.txt") as f:
...