DataWorks proporciona un nodo de PyODPS 3 para escribir y ejecutar periódicamente trabajos de MaxCompute en Python. En este tema se describe cómo configurar y programar trabajos de Python con DataWorks.
Requisitos previos
Ya creó un nodo de PyODPS 3. Para obtener más información, consulte Create and manage MaxCompute nodes.
Contexto
PyODPS es el SDK de Python para MaxCompute. Proporciona una interfaz de programación en Python para escribir trabajos de MaxCompute, consultar tablas y vistas, y gestionar recursos. Para obtener más información, consulte PyODPS. En DataWorks, puede usar un nodo de PyODPS para programar y ejecutar trabajos de Python, e integrarlos con otros tipos de trabajos.
Notas de uso
-
Si su código de PyODPS requiere paquetes de terceros, instálelos mediante un serverless resource group y un custom image.
NotaEste método no es compatible si su código incluye una función definida por el usuario (UDF) que hace referencia a un paquete de terceros. Para conocer la configuración correcta, consulte UDF example: Use third-party packages in Python UDFs.
Para actualizar la versión de PyODPS, use un custom image y ejecute el comando
/home/tops/bin/pip3 install pyodps==0.12.1en un serverless resource group (puede reemplazar0.12.1por la versión de PyODPS deseada). También puede usar O&M Assistant para ejecutar el mismo comando en un exclusive resource group for scheduling.
Si su trabajo de PyODPS necesita acceder a un entorno de red especial, como un origen de datos o un servicio en una VPC o en un centro de datos local (IDC), utilice un serverless resource group y establezca una conexión de red entre dicho grupo y el entorno de destino. Para obtener más información, consulte Network connectivity solutions.
Para obtener más información sobre la sintaxis de PyODPS, consulte PyODPS documentation.
Los nodos de PyODPS están disponibles en dos tipos: PyODPS 2 y PyODPS 3. Cada uno utiliza una versión subyacente distinta de Python: los nodos de PyODPS 2 usan Python 2 y los de PyODPS 3 usan Python 3. Asegúrese de crear el tipo de nodo que coincida con su versión de Python.
-
Si la ejecución de SQL en un nodo de PyODPS no genera correctamente la data lineage, lo cual impide que aparezca en Data Map, resuelva el problema estableciendo manualmente los parámetros de programación y de tiempo de ejecución de DataWorks en su código. Para saber cómo consultar el linaje de datos, consulte View data lineage. Para conocer la configuración de parámetros, consulte Set runtime parameter hints. Puede obtener los parámetros de tiempo de ejecución necesarios con el siguiente código de ejemplo:
import os ... # get DataWorks sheduler runtime parameters skynet_hints = {} for k, v in os.environ.items(): if k.startswith('SKYNET_'): skynet_hints[k] = v ... # setting hints while submiting a task o.execute_sql('INSERT OVERWRITE TABLE XXXX SELECT * FROM YYYY WHERE ***', hints=skynet_hints) ...
El tamaño máximo del registro de salida de un nodo de PyODPS es de 4 MB. Evite imprimir resultados de datos extensos en el registro; en su lugar, muestre únicamente la información esencial de alertas y progreso.
Límites
Cuando ejecute un nodo de PyODPS en un exclusive resource group for scheduling, no procese más de 50 MB de datos locales. Esto se debe a las especificaciones de recursos de dicho grupo. Procesar una gran cantidad de datos locales que supere el umbral del sistema operativo puede provocar un error de falta de memoria (OOM), indicado con el mensaje
Got Killed. Evite escribir código de procesamiento de datos extenso directamente en el nodo de PyODPS.-
Cuando ejecute un nodo de PYODPS con un serverless resource group, configure las CU del nodo según la cantidad de datos que necesite procesar.
NotaAl ejecutar una tarea en un serverless resource group, una sola tarea admite una configuración máxima de
64CU. Sin embargo, se recomienda no superar16CUpara evitar la escasez de recursos provocada por un valor de CU excesivo, lo cual podría afectar el inicio de la tarea. Un error Got killed indica que el uso de memory superó el límite, lo que provocó la finalización del proceso. Para evitarlo, evite las operaciones con datos locales. Esta limitación no aplica a los trabajos de SQL ni de DataFrame iniciados mediante PyODPS (excepto
to_pandas).Puede utilizar las bibliotecas Numpy y Pandas preinstaladas para el código que no involucre funciones personalizadas. No se admiten otros paquetes de terceros que contengan código binario.
Por motivos de compatibilidad, options.tunnel.use_instance_tunnel se establece en False de forma predeterminada en DataWorks. Si necesita habilitar instance tunnel de manera global, debe establecer este valor manualmente en True.
-
La definición de bytecode varía entre las versiones menores de Python 3, como Python 3.8 y Python 3.7.
Actualmente, MaxCompute usa Python 3.7. Se producirá un error de ejecución si utiliza sintaxis de otras versiones de Python 3, como el bloque
finallyde Python 3.8. Se recomienda usar Python 3.7. PyODPS 3 admite la ejecución en un serverless resource group. Para adquirir y utilizar uno, consulte Use serverless resource groups.
No se admite la ejecución simultánea de varios trabajos de Python dentro de un solo nodo de PyODPS.
Editar código: ejemplo básico
Una vez creado el nodo de PyODPS, edite y ejecute su código. Para obtener más información sobre la sintaxis de PyODPS, consulte Overview of basic operations.
-
Punto de entrada de ODPS
Un nodo de PyODPS de DataWorks proporciona una variable global, llamada odps o o, que funciona como punto de entrada de ODPS. No es necesario definirla manualmente.
print(odps.exist_table('PyODPS_iris')) -
Ejecutar SQL
Puede ejecutar instrucciones SQL en un nodo de PyODPS. Para obtener más información, consulte SQL.
-
De forma predeterminada, instance tunnel está deshabilitado en DataWorks. Esto significa que instance.open_reader utiliza la interfaz Result, la cual lee un máximo de 10,000 registros. Utilice reader.count para obtener la cantidad de registros. Para iterar por todos los datos, debe deshabilitar
limit. Use las siguientes instrucciones para habilitar instance tunnel de manera global y deshabilitarlimit.options.tunnel.use_instance_tunnel = True options.tunnel.limit_instance_tunnel = False # Disable the limit to read all data. with instance.open_reader() as reader: # All data can be read through the instance tunnel. -
También puede agregar
tunnel=Truea para habilitar instance tunnel en la llamada actual a open_reader. De igual forma, agreguelimit=Falsepara deshabilitar la restricciónlimiten la llamada actual.# Use the Instance Tunnel interface for the current open_reader operation to read all data. with instance.open_reader(tunnel=True, limit=False) as reader:
-
-
Parámetros de tiempo de ejecución
-
Establezca los parámetros de tiempo de ejecución mediante el parámetro hints, que es de tipo dict. Para obtener más información sobre los hints, consulte SET operations.
o.execute_sql('select * from PyODPS_iris', hints={'odps.sql.mapper.split.size': 16}) -
Si configura sql.settings en la configuración global, estos parámetros de tiempo de ejecución se agregarán a cada ejecución.
from odps import options options.sql.settings = {'odps.sql.mapper.split.size': 16} o.execute_sql('select * from PyODPS_iris') # This call includes hints from the global configuration.
-
-
Resultados de la ejecución
Una instancia de ejecución de SQL puede ejecutar directamente la operación open_reader en los siguientes dos escenarios:
-
La instrucción SQL devuelve datos estructurados.
with o.execute_sql('select * from dual').open_reader() as reader: for record in reader: # Process each record. -
Al ejecutar instrucciones como
desc, recupere el resultado de ejecución de SQL sin procesar mediante la propiedad reader.raw.with o.execute_sql('desc dual').open_reader() as reader: print(reader.raw)NotaSi utiliza parámetros de programación personalizados, debe codificar de forma fija la hora cuando active directamente la ejecución de un nodo de PyODPS 3 desde la página. El nodo de PyODPS no puede sustituir este valor de manera directa.
-
-
DataFrame
También puede procesar datos mediante un DataFrame (not recommended).
-
Ejecución
En el entorno de DataWorks, las operaciones de DataFrame deben activarse explícitamente llamando a un immediately executed method.
from odps.df import DataFrame iris = DataFrame(o.get_table('pyodps_iris')) for record in iris[iris.sepal_width < 3].execute(): # Call an immediately executed method to process each record.Si necesita activar una ejecución inmediata al imprimir, habilite
options.interactive.from odps import options from odps.df import DataFrame options.interactive = True # Enable the switch at the beginning. iris = DataFrame(o.get_table('pyodps_iris')) print(iris.sepal_width.sum()) # An immediate execution is triggered when printing. -
Imprimir información detallada
Configure la opción
options.verbose. Esta opción está habilitada de forma predeterminada en DataWorks e imprime información detallada durante la ejecución, como la URL de Logview.
-
Ejemplo
A continuación se muestra cómo utilizar un nodo de PyODPS:
Prepare el conjunto de datos y cree la tabla de ejemplo pyodps_iris. Para obtener más detalles, consulte Process data by using DataFrame.
Cree un DataFrame. Para obtener más detalles, consulte Create a DataFrame from a MaxCompute table.
-
Introduzca y ejecute el siguiente código en el nodo de PyODPS.
from odps.df import DataFrame # Create a DataFrame from an ODPS table. iris = DataFrame(o.get_table('pyodps_iris')) print(iris.sepallength.head(5))Se devuelve el siguiente resultado:
sepallength 0 4.5 1 5.5 2 4.9 3 5.0 4 6.0
Editar código: ejemplo avanzado
Si el nodo debe ejecutarse periódicamente, defina sus propiedades de programación. Para obtener más información, consulte Configure scheduling properties for a node.
Parámetros de programación
En el panel derecho del editor de nodos, haga clic en Scheduling Settings. En la sección Parameter, configure los parámetros personalizados. La forma de definir variables en un nodo de PyODPS difiere de la utilizada en un nodo de SQL. Para obtener más información, consulte Configure scheduling parameters.
A diferencia de los nodos de SQL en DataWorks, los nodos de PyODPS no reemplazan cadenas como ${param_name} en el código. En su lugar, se agrega un dict llamado args a las variables globales antes de ejecutar el código. Desde este dict puede recuperar los parámetros de programación. Por ejemplo, si establece ds=${yyyymmdd} en Parameter, utilice el siguiente método para recuperar este parámetro en su código.
print('ds=' + args['ds'])
ds=20161116
Si necesita obtener la partición denominada ds, utilice el siguiente método.
o.get_table('table_name').get_partition('ds=' + args['ds'])
Para obtener más información sobre el desarrollo de trabajos de PyODPS en otros casos de uso, consulte los siguientes temas:
Pasos siguientes
Determine whether a custom Shell script has run successfully: la lógica para determinar si un script de Python personalizado se ejecutó correctamente es la misma que se aplica a un script de shell. Utilice este método para comprobarlo.
Deploy a job: si utiliza un espacio de trabajo en modo estándar, despliegue el trabajo en el entorno de producción para que pueda ejecutarse periódicamente.
O&M for periodically-run jobs: después de desplegar y programar un trabajo en el entorno de producción, gestione su operación y mantenimiento en Operation Center.
PyODPS FAQ: encuentre respuestas a preguntas frecuentes sobre la ejecución de trabajos de PyODPS para solucionar problemas rápidamente.
Preguntas frecuentes
P: Estoy utilizando un nodo PyODPS3 para recopilar datos de una API de terceros, como Lark, e importarlos a DataWorks. El código se ejecuta sin problemas en mi entorno de desarrollo local, pero reporta un error de tiempo de espera de respuesta cuando se envía al entorno de producción y se ejecuta en Operation Center. ¿Por qué ocurre esto?
R: Vaya a . En la lista blanca del sandbox, agregue el nombre de dominio de la API de terceros para otorgarle acceso al trabajo de PyODPS 3. Por ejemplo:
Agregue el nombre de dominio de la API de Lark open.feishu.cn y establezca el puerto en 443.