在此记录 pyflink 运行过程中遇到的问题以及解决方法。让小伙伴们少走弯路。
Q1: No module named 'encodings'
Caused by: java.io.IOException: Failed to execute the command: venv.zip/venv/bin/python -c import pyflink;import os;print(os.path.join(os.path.abspath(os.path.dirname(pyflink.__file__)), 'bin'))
output: Could not find platform independent libraries
Could not find platform dependent libraries
Consider setting $PYTHONHOME to [:]
Fatal Python error: initfsencoding: unable to load the file system codec
ModuleNotFoundError: No module named 'encodings'
问题分析:Python 环境的问题,用 virtualenv 来管理虚拟环境时遇到。
问题解决:利用以下脚本(注意修改 pyflink 版本),使用 miniconda3 来管理虚拟环境即可解决。
wget https://ci.apache.org/projects/flink/flink-docs-release-1.11/downloads/setup-pyflink-virtual-env.sh
sh setup-pyflink-virtual-env.sh 1.11.2
source venv/bin/activate # 激活虚拟环境
Q2: No module named 'encodings'
File "main.py", line 2
SyntaxError: Non-ASCII character '\xe5' in file main.py on line 3, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
org.apache.flink.client.program.ProgramAbortException
问题分析:表面上是无法解析非 ASCII 码,实际上是因为当前的 python 版本错了。通过 flink run 来提交 Python 任务时,Flink 会调用 “python” 命令,要求 python 的版本为 3.5, 3.6 或者 3.7 中的一个。
问题解决:激活虚拟环境,使得运行 python -V
时显示的 python 版本为 3.5,3.6 或 3.7
Q3: Could not find any factory for identifier 'kafka'
Caused by: org.apache.flink.table.api.ValidationException: Could not find any factory for identifier 'kafka' that implements 'org.apache.flink.table.factories.DynamicTableSourceFactory' in the classpath.org.apache.flink.client.program.ProgramAbortException
问题分析:没有指定 kafka jar 文件
问题解决:在 flink run 的时候,加入参数 -j flink-sql-connector-kafka_2.11-1.11.2.jar
,具体 jar 包的下载路径见 Apache Kafka SQL Connector,根据 kafka 版本选择 jar 包来下载。
Q4: The parallelism must be a positive number: yarch
The parallelism must be a positive number: yarch
问题分析:并行度要设置为正数
问题解决:在 flink run 的时候,加入参数 -p 1
。但问题可能出在 flink 上。直接部署的 flink 没有问题,但是集成到 CDH 后,flink 的配置参数发生了变化,导致无法以简单的 flink run 的方式来运行
Q5: No manifest found in jar file '/xxxx/venv.zip'
org.apache.flink.client.program.ProgramInvocationException: No manifest found in jar file '/xxxx/venv.zip'. The manifest is need to point to the program's main class.
问题分析:没有找到 manifest 文件来指定程序的 main class。
问题解决:同 Q4,可能是 flink 没有正确安装好。
Q6: Neither a 'Main-Class', nor a 'program-class' entry was found in the jar file.
org.apache.flink.client.program.ProgramInvocationException: Neither a 'Main-Class', nor a 'program-class' entry was found in the jar file.
问题分析:jar 包里没有指定 'Main-Class' 或 'program-class'
问题解决:同 Q4,可能是 flink 没有正确安装好。