Realtime Compute for Apache Flink admite funciones definidas por el usuario (UDF) de Python en trabajos de Flink SQL. Puede crear funciones escalares, de agregación y de tabla en Python, gestionar dependencias de Python y ajustar el rendimiento de las UDF.
Tipos de funciones definidas por el usuario
|
Categoría |
Descripción |
|
Función escalar definida por el usuario (UDSF) |
Una UDSF asigna cero, uno o más valores escalares a un nuevo valor escalar. Procesa una fila de entrada para generar un valor de salida y crea una asignación de uno a uno. Para obtener más información, consulte User-defined scalar functions (UDSFs). |
|
Función de agregación definida por el usuario (UDAF) |
Una UDAF agrega varios registros en un solo registro y genera una asignación de muchos a uno. Para obtener más información, consulte User-defined aggregate functions (UDAFs). |
|
Función de tabla definida por el usuario (UDTF) |
Una UDTF acepta cero, uno o más valores escalares como parámetros de entrada. A diferencia de una función escalar, una función de tabla puede devolver cualquier número de filas, cada una compuesta por una o más columnas. Para obtener más información, consulte User-defined table functions (UDTFs). |
Uso de dependencias de Python
Los clústeres de Realtime Compute for Apache Flink incluyen paquetes comunes de Python preinstalados, como Pandas, NumPy y PyArrow. Para consultar la lista de paquetes de Python de terceros preinstalados, revise Develop Python jobs. Importe estos paquetes en su función antes de usarlos, como se muestra en el siguiente ejemplo.
@udf(result_type=DataTypes.FLOAT())
def percentile(values: List[float], percentile: float):
import numpy as np
return np.percentile(values, percentile)
Para usar un paquete de Python de terceros que no esté preinstalado, cárguelo como archivo de dependencia cuando registre la UDF de Python. Para obtener más información, consulte Manage user-defined functions (UDFs) y Use Python dependencies.
Depuración de código
Use el módulo logging para generar información de registro desde su función definida por el usuario de Python y facilitar la solución de problemas. El siguiente ejemplo muestra cómo usar logging.
@udf(result_type=DataTypes.BIGINT())
def add(i, j):
logging.info("hello world")
return i + j
Una vez generados los registros, puede consultarlos en los archivos de registro de TaskManager. Para obtener más información, consulte View run logs.
Ajuste de rendimiento
Precarga de recursos
Precargue los recursos durante la inicialización de la función para evitar recargarlos en cada llamada al método eval. Por ejemplo, cargue un modelo grande de aprendizaje profundo una sola vez y luego ejecute predicciones por lotes sobre él.
from pyflink.table import DataTypes
from pyflink.table.udf import ScalarFunction, udf
class Predict(ScalarFunction):
def open(self, function_context):
import pickle
with open("resources.zip/resources/model.pkl", "rb") as f:
self.model = pickle.load(f)
def eval(self, x):
return self.model.predict(x)
predict = udf(Predict(), result_type=DataTypes.DOUBLE(), func_type="pandas")
Para obtener información sobre cómo cargar archivos de datos de Python, consulte Use Python dependencies.
Funciones definidas por el usuario asíncronas
Para escenarios con uso intensivo de E/S, como el acceso a bases de datos externas o llamadas a servicios HTTP, utilice funciones definidas por el usuario asíncronas. Una sola instancia de función puede manejar varias solicitudes simultáneamente; esto distribuye el tiempo de espera entre múltiples llamadas y mejora significativamente el throughput del trabajo. Esta función solo es compatible con VVR 11.7 y versiones posteriores, y aplica únicamente a funciones escalares definidas por el usuario (UDSF). Para más detalles, consulte Asynchronous user-defined functions.
Uso de la biblioteca Pandas
Además de las funciones definidas por el usuario estándar de Python, Realtime Compute for Apache Flink admite funciones definidas por el usuario de Pandas. Estas funciones aceptan estructuras de datos de Pandas, como pandas.Series y pandas.DataFrame, como entrada, lo que le permite aprovechar bibliotecas de alto rendimiento como Pandas y NumPy. Para obtener más información, consulte Funciones definidas por el usuario vectorizadas.
Parámetros
El rendimiento de una función definida por el usuario de Python depende en gran medida de su implementación. Si experimenta problemas de rendimiento, optimice primero la lógica de la función. Los siguientes parámetros también afectan el rendimiento.
|
Parámetro |
Descripción |
|
python.fn-execution.bundle.size |
Las UDF de Python se ejecutan de forma asíncrona. El operador de Java almacena datos en caché antes de enviarlos a un proceso de Python para su ejecución. Cuando la caché alcanza un umbral, los datos se envían al proceso de Python. El parámetro El valor predeterminado es 100,000 registros. |
|
python.fn-execution.bundle.time |
Este parámetro controla el tiempo máximo de almacenamiento en caché. Los datos almacenados se envían para su procesamiento cuando el recuento de registros alcanza el umbral de El valor predeterminado es 1,000 milisegundos. |
|
python.fn-execution.arrow.batch.size |
Para las UDF de Pandas, este parámetro especifica el número máximo de registros que puede contener un lote de Arrow. El valor predeterminado es 10,000. Nota
El valor del parámetro |
Establecer estos parámetros en valores excesivamente grandes puede ser contraproducente. Un búfer excesivo durante un checkpoint puede provocar que los checkpoints tarden demasiado o fallen. Para obtener más información sobre estos parámetros, consulte Configuración.
Temas relacionados
Para obtener información sobre cómo registrar, actualizar y eliminar una función definida por el usuario, consulte Manage user-defined functions (UDFs).
Para ver demostraciones sobre cómo desarrollar y usar funciones definidas por el usuario de Python, consulte User-defined aggregate functions (UDAFs), User-defined scalar functions (UDSFs) y User-defined table functions (UDTFs).
Para aprender a usar entornos virtuales personalizados de Python, paquetes de Python de terceros, paquetes JAR y archivos de datos en un trabajo de Flink Python, consulte Use Python dependencies.
Para ver demostraciones sobre cómo desarrollar y usar funciones definidas por el usuario de Java, consulte User-defined aggregate functions (UDAFs), User-defined scalar functions (UDSFs) y User-defined table functions (UDTFs).
Para aprender a depurar y ajustar funciones definidas por el usuario de Java, consulte Overview.