Este tema describe el contexto, los límites, los métodos de desarrollo y depuración, así como el uso de conectores para los trabajos de la API de Python de Flink.
Contexto
Debe desarrollar los trabajos de Python de Flink de forma local. Una vez finalizado el desarrollo, despliegue e inicie los trabajos en la consola de desarrollo de Flink para consultar los resultados del negocio. Para obtener más información sobre el procedimiento general, consulte Flink Python jobs.
Requisitos del entorno de desarrollo
-
Las versiones del motor de Realtime Compute for Apache Flink anteriores a VVR 8.0.11 incluyen Python 3.7.9 preinstalado. Las versiones VVR 8.0.11 y posteriores incluyen Python 3.9.21 preinstalado. Las versiones VVR 11.7 y posteriores incluyen Python 3.9.21, 3.10.19 y 3.11.14 preinstalados.
NotaSe recomienda que la versión de Python en su entorno de desarrollo local coincida con la versión de Python preinstalada en el motor VVR de destino.
NotaVVR 11.7 y versiones posteriores utilizan Python 3.9 de forma predeterminada. Si desea utilizar las versiones preinstaladas de Python 3.10 o 3.11, configure el trabajo de la siguiente manera:
En la página , haga clic en el nombre del trabajo de destino.
-
En la pestaña Configuration, dentro de la sección Parameters, haga clic en Edit en el lado derecho y agregue la siguiente configuración en el campo Other Configuration (tomando Python 3.11 como ejemplo):
python.executable: python3.11 python.client.executable: python3.11
-
PyFlink está instalado y su versión coincide con la versión del motor VVR de destino. Por ejemplo, si el motor que seleccionó en la página de despliegue es
vvr-11.7.0-jdk11-flink-1.20, debe instalar:pip install ververica-flink==11.7.0NotaVVR 11.5 y versiones anteriores no proporcionan un paquete PyFlink dedicado. Debe instalar la versión correspondiente de PyFlink de código abierto. Por ejemplo, si el motor que seleccionó en la página de despliegue es
vvr-8.0.9-flink-1.17, debe instalarapache-flink==1.17.*.pip install apache-flink==1.17.2 Tiene instalado un IDE. Se recomienda PyCharm o VS Code.
Debe desarrollar los trabajos de Python localmente y, posteriormente, desplegarlos y ejecutarlos en la consola de Realtime Compute for Apache Flink.
Límites
Debido al impacto de los entornos de despliegue y de red en Flink, tenga en cuenta los siguientes límites al desarrollar trabajos de Python:
Solo se admite Flink de código abierto V1.13 y versiones posteriores.
El espacio de trabajo de Flink incluye un entorno de Python preinstalado que contiene bibliotecas comunes como Pandas, NumPy y PyArrow. Para más detalles, consulte Pre-installed package list al final de este tema.
El entorno de ejecución de Flink solo admite JDK 8 y JDK 11. Si su trabajo de Python depende de paquetes JAR de terceros, asegúrese de que dichos paquetes sean compatibles.
VVR 4.x solo admite Scala de código abierto V2.11. VVR 6.x y versiones posteriores solo admiten Scala de código abierto V2.12. Si su trabajo de Python depende de paquetes JAR de terceros, asegúrese de que las dependencias del paquete JAR coincidan con la versión de Scala correspondiente.
Desarrollo de trabajos
Elección entre Table API/SQL y DataStream API
PyFlink admite dos enfoques de desarrollo: Table API/SQL y DataStream API. Se recomienda Table API/SQL por las siguientes razones:
Mejor rendimiento: El plan de ejecución optimizado de Table API/SQL se ejecuta completamente dentro de la JVM. En cambio, DataStream API requiere serialización y deserialización fila por fila entre la JVM y el proceso de Python, lo que introduce una sobrecarga de rendimiento significativa.
Funcionalidades más completas: Table API/SQL ofrece un soporte más integral para conectores, formatos de datos y funciones de ventana, además de compartir el mismo ecosistema de conectores que los trabajos SQL.
Recomendación de la comunidad: La comunidad de Apache Flink prioriza Table API/SQL como la dirección principal de desarrollo para PyFlink.
Utilice DataStream API únicamente para escenarios con lógica personalizada compleja que no pueda expresarse mediante SQL.
Referencias de desarrollo
Puede consultar los siguientes documentos para desarrollar código de negocio de Flink localmente. Una vez finalizado el desarrollo, cargue el código en la consola de desarrollo de Flink y despliegue el trabajo.
Para el desarrollo de código de negocio en Apache Flink V1.20, consulte la Guía de desarrollo de la API de Python de Flink.
Para problemas encontrados durante la codificación en Apache Flink y sus soluciones, consulte las Preguntas frecuentes.
Estructura del proyecto
La estructura recomendada para proyectos de Python es la siguiente:
my-flink-python-project/
├── my_job.py # Main job file.
├── udfs.py # User-defined functions (optional)
├── requirements.txt # Third-party Python dependencies (optional)
└── config.properties # Configuration file (optional)
Gestión de dependencias
Para obtener información sobre cómo usar entornos virtuales de Python personalizados, paquetes de Python de terceros, archivos JAR y archivos de datos en trabajos de Python, consulte Use Python dependencies.
Funciones definidas por el usuario (UDF)
A continuación se presenta un ejemplo de desarrollo de una UDSF de Python que enmascara datos de cadenas sensibles:
from pyflink.table import DataTypes
from pyflink.table.udf import udf
@udf(result_type=DataTypes.STRING())def mask_phone(phone: str):"""Phone number masking: retains the first 3 and last 4 digits, replacing the middle with ****"""if phone is None or len(phone) != 11:return phone.
return phone[:3] + '****' + phone[7:]
Utilice esta UDF en un trabajo SQL:
CREATE TEMPORARY FUNCTION mask_phone AS 'udfs.mask_phone' LANGUAGE PYTHON;INSERT INTO sink_table
SELECT name, mask_phone(phone) AS masked_phone
FROM source_table;
Para obtener información sobre cómo registrar, actualizar y eliminar UDF, consulte Manage UDFs.
Uso de conectores
Para consultar la lista de conectores compatibles con Flink, vea Supported connectors. Para usar un conector, realice los siguientes pasos:
Inicie sesión en la consola de Realtime Compute.
Haga clic en Console en la columna Actions del espacio de trabajo de destino.
En el panel de navegación izquierdo, haga clic en Artifacts.
-
Haga clic en Upload Artifact y seleccione el paquete de Python del conector de destino para cargarlo.
Puede cargar un conector desarrollado por usted o uno proporcionado por Flink. Para descargar los paquetes oficiales de Python de los conectores proporcionados por Flink, consulte la Lista de conectores.
En la página , haga clic en . Seleccione el paquete de Python del conector de destino en el campo Additional Dependencies, configure los demás parámetros y despliegue el trabajo.
-
Haga clic en el nombre del trabajo desplegado. En la pestaña Configuration, dentro de la sección Parameters, haga clic en Edit. En Other Configuration, agregue la información de ubicación de los paquetes de Python del conector.
Si su trabajo depende de varios paquetes de Python de conectores, por ejemplo, dos paquetes llamados connector-1.jar y connector-2.jar, la configuración es la siguiente.
pipeline.classpaths: 'file:///flink/usrlib/connector-1.jar;file:///flink/usrlib/connector-2.jar' -
Para usar conectores integrados, formatos de datos y catálogos (solo en VVR 11.2 y posteriores), agregue la configuración en la sección Running Parameters bajo Additional Configuration del trabajo. Ejemplo:
## Multiple connectors used. pipeline.used-builtin-connectors: kafka;sls ## Multiple data formats for data transmission. pipeline.used-builtin-formats: avro;parquet ## Multiple previously created catalogs used. pipeline.used-builtin-catalogs: catalogname1;catalogname2
Para más detalles sobre cómo usar conectores, consulte Complete sample code.
Depuración de trabajos
Puede usar registros en la implementación de código de las UDF de Python para generar información de registro útil en la resolución de problemas. Ejemplo:
import logging
@udf(result_type=DataTypes.BIGINT())
def add(i, j):
logging.info("hello world")
return i + j
Después de generar la salida de registros, puede consultarlos en los archivos de registro de TaskManager.
Depuración local
Dado que Realtime Compute for Apache Flink no tiene acceso a Internet de forma predeterminada, es posible que su código no pueda conectarse directamente a fuentes de datos en línea para realizar pruebas locales. Se recomiendan los siguientes enfoques para la depuración local:
Pruebas unitarias: Realice pruebas unitarias independientes en las UDF para asegurar que la lógica de la función sea correcta.
-
Ejecución local: Utilice fuentes de datos locales (como archivos o datos en memoria) para simular entradas y ejecute el trabajo localmente con el fin de verificar la lógica de procesamiento. Ejemplo:
from pyflink.datastream import StreamExecutionEnvironment env = StreamExecutionEnvironment.get_execution_environment()# Use a local data source for testing. ds = env.from_collection([('Alice', 1), ('Bob', 2), ('Alice', 3)]) ds.key_by(lambda x: x[0]).sum(1).print() env.execute("local_test") Depuración remota: Para depurar conectándose a fuentes de datos en línea, consulte Run and debug jobs with connectors locally.
Despliegue de trabajos
Una vez finalizado el desarrollo del trabajo de Python, cárguelo en la consola de Realtime Compute para su despliegue. Realice los siguientes pasos:
Inicie sesión en la consola de Realtime Compute y vaya al espacio de trabajo de destino.
En el panel de navegación izquierdo, haga clic en Artifacts y cargue el archivo del trabajo de Python (.py o .zip). Si existen dependencias de terceros o archivos de configuración, cárguelos también.
-
En la página , haga clic en y complete la información de despliegue.
Parámetro
Descripción
Python File Path
Seleccione el archivo del trabajo de Python cargado.
Entry Module
Si el archivo del trabajo es un archivo .py, este campo no es obligatorio. Si el archivo del trabajo es un archivo .zip, especifique el nombre del módulo de entrada, por ejemplo,
my_job.Additional Dependencies
Seleccione archivos JAR de conectores o archivos de configuración si corresponde.
Python Libraries
Seleccione paquetes de Python de terceros (.whl o .zip) si corresponde.
Python Archives
Seleccione un entorno virtual de Python personalizado (.zip) si corresponde.
Haga clic en Deploy.
Para obtener más información sobre los parámetros de despliegue, consulte Deploy a job.
Código de ejemplo completo
Este ejemplo demuestra un trabajo de streaming en Python que lee datos de Kafka, realiza un procesamiento sencillo y escribe los resultados en MySQL. Esto es solo para referencia.
Este ejemplo no incluye la configuración de parámetros de ejecución como puntos de control y estrategias de reinicio. Puede personalizar estas configuraciones en la página Deployment Details después de desplegar el trabajo. Para más información, consulte Configure job deployment information.
import logging
import sys
from pyflink.common import Types
from pyflink.datastream import StreamExecutionEnvironment
from pyflink.table import StreamTableEnvironment
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
def kafka_to_mysql():
# Create the execution environment.
env = StreamExecutionEnvironment.get_execution_environment()
t_env = StreamTableEnvironment.create(env)
# Create the Kafka source table.
t_env.execute_sql("""
CREATE TABLE kafka_source (
`id` INT,
`name` STRING,
`score` INT,
`event_time` TIMESTAMP(3),
WATERMARK FOR event_time AS event_time - INTERVAL '5' SECOND
) WITH (
'connector' = 'kafka',
'topic' = 'student_topic',
'properties.bootstrap.servers' = 'your-kafka-broker:9092',
'properties.group.id' = 'my-group',
'scan.startup.mode' = 'latest-offset',
'format' = 'json'
)
""")
# Create the MySQL sink table.
t_env.execute_sql("""
CREATE TABLE mysql_sink (
`id` INT,
`name` STRING,
`score` INT,
PRIMARY KEY (id) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://your-mysql-host:3306/my_database',
'table-name' = 'student',
'username' = 'your_username',
'password' = 'your_password'
)
""")
# Filter records with scores greater than 60 and write them to MySQL.
t_env.execute_sql("""
INSERT INTO mysql_sink
SELECT id, name, score
FROM kafka_source
WHERE score >= 60
""")
if __name__ == '__main__':
kafka_to_mysql()
Paquetes preinstalados
VVR-11
Los siguientes paquetes están preinstalados en el espacio de trabajo de Flink.
|
Paquete |
Versión |
|
apache-beam |
2.48.0 |
|
avro-python3 |
1.10.2 |
|
brotlipy |
0.7.0 |
|
certifi |
2022.12.7 |
|
cffi |
1.15.1 |
|
charset-normalizer |
2.0.4 |
|
cloudpickle |
2.2.1 |
|
conda |
22.11.1 |
|
conda-content-trust |
0.1.3 |
|
conda-package-handling |
1.9.0 |
|
crcmod |
1.7 |
|
cryptography |
38.0.1 |
|
Cython |
3.0.12 |
|
dill |
0.3.1.1 |
|
dnspython |
2.7.0 |
|
docopt |
0.6.2 |
|
exceptiongroup |
1.3.0 |
|
fastavro |
1.12.1 |
|
fasteners |
0.20 |
|
find_libpython |
0.5.0 |
|
grpcio |
1.56.2 |
|
grpcio-tools |
1.56.2 |
|
hdfs |
2.7.3 |
|
httplib2 |
0.22.0 |
|
idna |
3.4 |
|
importlib_metadata |
8.7.0 |
|
iniconfig |
2.1.0 |
|
isort |
6.1.0 |
|
numpy |
1.24.4 |
|
objsize |
0.6.1 |
|
orjson |
3.9.15 |
|
packaging |
25.0 |
|
pandas |
2.3.3 |
|
pemja |
0.5.5 |
|
pip |
22.3.1 |
|
pluggy |
1.0.0 |
|
proto-plus |
1.26.1 |
|
protobuf |
4.25.8 |
|
py-spy |
0.4.0 |
|
py4j |
0.10.9.7 |
|
pyarrow |
11.0.0 |
|
pyarrow-hotfix |
0.6 |
|
pycodestyle |
2.14.0 |
|
pycosat |
0.6.4 |
|
pycparser |
2.21 |
|
pydot |
1.4.2 |
|
pymongo |
4.15.4 |
|
pyOpenSSL |
22.0.0 |
|
pyparsing |
3.2.5 |
|
PySocks |
1.7.1 |
|
pytest |
7.4.4 |
|
python-dateutil |
2.9.0 |
|
pytz |
2025.2 |
|
regex |
2025.11.3 |
|
requests |
2.32.5 |
|
ruamel.yaml |
0.18.16 |
|
ruamel.yaml.clib |
0.2.14 |
|
setuptools |
70.0.0 |
|
six |
1.16.0 |
|
tomli |
2.3.0 |
|
toolz |
0.12.0 |
|
tqdm |
4.64.1 |
|
typing_extensions |
4.15.0 |
|
tzdata |
2025.2 |
|
urllib3 |
1.26.13 |
|
wheel |
0.38.4 |
|
zipp |
3.23.0 |
|
zstandard |
0.25.0 |
|
torch |
2.5.1 |
|
torchvision |
0.20.1 |
|
transformers |
4.57.6 |
|
opencv-python-headless |
4.10.0.84 |
|
pillow |
11.3.0 |
|
ultralytics |
8.4.66 |
|
easyocr |
1.7.2 |
|
open-clip-torch |
2.32.0 |
|
rembg |
2.0.61 |
|
onnxruntime |
1.16.3 |
|
av |
14.2.0 |
|
librosa |
0.11.0 |
|
soundfile |
0.13.1 |
|
imagehash |
4.3.2 |
|
safetensors |
0.7.0 |
|
huggingface-hub |
0.36.2 |
|
tokenizers |
0.22.2 |
|
timm |
1.0.27 |
|
scikit-learn |
1.6.1 |
|
scikit-image |
0.24.0 |
|
scipy |
1.13.1 |
|
numba |
0.60.0 |
|
llvmlite |
0.43.0 |
|
matplotlib |
3.9.4 |
|
pywavelets |
1.6.0 |
|
tifffile |
2024.8.30 |
|
shapely |
2.0.7 |
|
pymatting |
1.1.15 |
|
audioread |
3.1.0 |
|
soxr |
0.5.0.post1 |
|
joblib |
1.5.3 |
|
threadpoolctl |
3.6.0 |
|
sympy |
1.13.1 |
|
mpmath |
1.3.0 |
|
python-bidi |
0.6.10 |
|
filelock |
3.19.1 |
|
pyyaml |
6.0.3 |
|
decorator |
5.3.1 |
|
msgpack |
1.1.2 |
|
ftfy |
6.3.1 |
|
wcwidth |
0.8.1 |
|
contourpy |
1.3.0 |
|
cycler |
0.12.1 |
|
fonttools |
4.60.2 |
|
importlib-resources |
5.4.0 |
|
kiwisolver |
1.4.7 |
|
lazy-loader |
0.5 |
|
attrs |
26.1.0 |
|
jsonschema |
4.25.1 |
|
jsonschema-specifications |
2025.9.1 |
|
referencing |
0.36.2 |
|
rpds-py |
0.27.1 |
|
pooch |
1.9.0 |
|
platformdirs |
4.4.0 |
VVR-8
Los siguientes paquetes están preinstalados en el espacio de trabajo de Flink.
|
Paquete |
Versión |
|
apache-beam |
2.43.0 |
|
avro-python3 |
1.9.2.1 |
|
certifi |
2025.7.9 |
|
charset-normalizer |
3.4.2 |
|
cloudpickle |
2.2.0 |
|
crcmod |
1.7 |
|
Cython |
0.29.24 |
|
dill |
0.3.1.1 |
|
docopt |
0.6.2 |
|
fastavro |
1.4.7 |
|
fasteners |
0.19 |
|
find_libpython |
0.4.1 |
|
grpcio |
1.46.3 |
|
grpcio-tools |
1.46.3 |
|
hdfs |
2.7.3 |
|
httplib2 |
0.20.4 |
|
idna |
3.10 |
|
isort |
6.0.1 |
|
numpy |
1.21.6 |
|
objsize |
0.5.2 |
|
orjson |
3.10.18 |
|
pandas |
1.3.5 |
|
pemja |
0.3.2 |
|
pip |
22.3.1 |
|
proto-plus |
1.26.1 |
|
protobuf |
3.20.3 |
|
py4j |
0.10.9.7 |
|
pyarrow |
8.0.0 |
|
pycodestyle |
2.14.0 |
|
pydot |
1.4.2 |
|
pymongo |
3.13.0 |
|
pyparsing |
3.2.3 |
|
python-dateutil |
2.9.0 |
|
pytz |
2025.2 |
|
regex |
2024.11.6 |
|
requests |
2.32.4 |
|
setuptools |
58.1.0 |
|
six |
1.17.0 |
|
typing_extensions |
4.14.1 |
|
urllib3 |
2.5.0 |
|
wheel |
0.33.4 |
|
zstandard |
0.23.0 |
VVR-6
Los siguientes paquetes están preinstalados en el espacio de trabajo de Flink.
|
Paquete |
Versión |
|
apache-beam |
2.27.0 |
|
avro-python3 |
1.9.2.1 |
|
certifi |
2024.8.30 |
|
charset-normalizer |
3.3.2 |
|
cloudpickle |
1.2.2 |
|
crcmod |
1.7 |
|
Cython |
0.29.16 |
|
dill |
0.3.1.1 |
|
docopt |
0.6.2 |
|
fastavro |
0.23.6 |
|
future |
0.18.3 |
|
grpcio |
1.29.0 |
|
hdfs |
2.7.3 |
|
httplib2 |
0.17.4 |
|
idna |
3.8 |
|
importlib-metadata |
6.7.0 |
|
isort |
5.11.5 |
|
jsonpickle |
2.0.0 |
|
mock |
2.0.0 |
|
numpy |
1.19.5 |
|
oauth2client |
4.1.3 |
|
pandas |
1.1.5 |
|
pbr |
6.1.0 |
|
pemja |
0.1.4 |
|
pip |
20.1.1 |
|
protobuf |
3.17.3 |
|
py4j |
0.10.9.3 |
|
pyarrow |
2.0.0 |
|
pyasn1 |
0.5.1 |
|
pyasn1-modules |
0.3.0 |
|
pycodestyle |
2.10.0 |
|
pydot |
1.4.2 |
|
pymongo |
3.13.0 |
|
pyparsing |
3.1.4 |
|
python-dateutil |
2.8.0 |
|
pytz |
2024.1 |
|
requests |
2.31.0 |
|
rsa |
4.9 |
|
setuptools |
47.1.0 |
|
six |
1.16.0 |
|
typing-extensions |
3.7.4.3 |
|
urllib3 |
2.0.7 |
|
wheel |
0.42.0 |
|
zipp |
3.15.0 |
Referencias
Para un ejemplo completo del flujo de trabajo de desarrollo de trabajos de Python en Flink, consulte Flink Python jobs.
Para obtener información sobre el uso de entornos virtuales de Python personalizados, paquetes de Python de terceros, archivos JAR y archivos de datos en trabajos de Python de Flink, consulte Use Python dependencies.
Realtime Compute for Apache Flink también admite trabajos SQL y DataStream. Para más información, consulte Job development guide y Develop JAR jobs.