Los nodos PyODPS 2 permiten escribir código Python directamente en DataWorks para procesar datos de MaxCompute mediante el SDK de Python PyODPS.
Requisitos previos
Antes de empezar, asegúrese de que cuenta con lo siguiente:
Un nodo PyODPS 2 creado. Consulte Create and manage MaxCompute nodes
Funcionamiento
PyODPS es el SDK de Python para MaxCompute. En DataWorks, cada nodo PyODPS incluye una variable global preinyectada odps (también disponible como alias o) que funciona como punto de entrada a MaxCompute. El código Python se escribe contra este punto de entrada para consultar tablas, ejecutar sentencias SQL, gestionar recursos y procesar datos. DataWorks también inyecta un diccionario global args para que el código pueda leer los parámetros de programación en tiempo de ejecución.
La única diferencia entre los nodos PyODPS 2 y PyODPS 3 radica en la capa de Python: PyODPS 2 utiliza Python 2.7 y PyODPS 3 utiliza Python 3.
Límites
|
Constraint |
Details |
|
Versión de Python |
2.7 |
|
Procesamiento local de datos (resource group exclusivo) |
Mantenga el uso por debajo de 50 MB. Superar este límite puede provocar un error de falta de memoria (OOM) y la finalización del proceso con el mensaje |
|
CUs (resource group serverless) |
Hasta 64 CUs por tarea; manténgase dentro de las 16 CUs para evitar escasez de recursos durante el inicio |
|
Tareas simultáneas de Python |
Una tarea a la vez por nodo |
|
Tamaño del registro de salida |
Hasta 4 MB |
|
Paquetes de terceros con código binario |
No compatible |
|
Bibliotecas preinstaladas |
NumPy y pandas (utilizables fuera de funciones definidas por el usuario [UDF]) |
|
InstanceTunnel |
Deshabilitado de forma predeterminada; establezca |
El límite de memoria de 50 MB aplica únicamente a operaciones locales de datos. Las tareas de SQL y DataFrame (excepto to_pandas ) iniciadas por PyODPS no están sujetas a este límite.
Notas de uso
Paquetes de terceros
Para utilizar un paquete de terceros en un nodo PyODPS, use un resource group serverless y cree una imagen personalizada que incluya dicho paquete.
Si su código UDF requiere un paquete de terceros, el enfoque de imagen personalizada no aplica. Consulte en su lugar Ejemplo: Referencia a paquetes de terceros en UDF de Python.
Acceso a la red
Para acceder a un origen de datos en una virtual private cloud (VPC) o en un centro de datos local, ejecute el nodo en un resource group serverless y configure una conexión de red entre el resource group y el origen de datos. Consulte Soluciones de conectividad de red.
Actualización de PyODPS
En un resource group serverless: utilice la función de gestión de imágenes para ejecutar
/home/tops/bin/pip3 install pyodps==0.12.1en un nodo PyODPS 3 (reemplace0.12.1con su versión objetivo). Consulte Gestionar imágenes.En un resource group exclusivo para programación: utilice la función O&M Assistant para ejecutar el mismo comando en un nodo PyODPS 3. Consulte Uso de la función O&M Assistant.
Registros de salida
Mantenga la salida de registros ligera. Incluya registros de alertas y puntos de control de progreso en lugar de volcar grandes conjuntos de datos al registro. El límite de 4 MB aplica a todo el registro de salida de una ejecución de nodo.
Linaje de datos
Si las sentencias SQL en un nodo PyODPS no generan linajes de datos en Data Map, pase los parámetros de tiempo de ejecución del programador de DataWorks como sugerencias (hints) de SQL. El siguiente código muestra cómo recopilar estos parámetros y pasarlos al ejecutar SQL:
import os
# Collect DataWorks scheduler runtime parameters
skynet_hints = {}
for k, v in os.environ.items():
if k.startswith('SKYNET_'):
skynet_hints[k] = v
# Pass the parameters as hints when running SQL
o.execute_sql('INSERT OVERWRITE TABLE XXXX SELECT * FROM YYYY WHERE ***', hints=skynet_hints)
Para obtener más información, consulte Visualizar linajes de datos y Configurar el parámetro hints.
Escritura y ejecución de código
Para consultar la referencia completa de sintaxis de PyODPS, véase Descripción general.
Uso del punto de entrada de MaxCompute
Cada nodo PyODPS preinyecta odps (y su alias o) como punto de entrada a MaxCompute. No es necesario inicializar un cliente manualmente.
print(odps.exist_table('PyODPS_iris'))
Ejecución de sentencias SQL
Utilice o.execute_sql() para ejecutar sentencias SQL en MaxCompute.
De forma predeterminada, InstanceTunnel está deshabilitado. Al leer resultados con instance.open_reader, la interfaz Result limita la lectura a 10,000 registros. Para leer todos los registros, habilite InstanceTunnel globalmente:
options.tunnel.use_instance_tunnel = True
options.tunnel.limit_instance_tunnel = False # Remove the record count limit
with instance.open_reader() as reader:
# Reads all records using InstanceTunnel
Para habilitar InstanceTunnel en una sola operación de lectura sin modificar la configuración global:
with instance.open_reader(tunnel=True, limit=False) as reader:
# Reads all records for this operation only
Lectura de resultados de consultas SQL
Utilice open_reader para procesar los resultados de las consultas.
Para sentencias SQL que devuelven datos estructurados:
with o.execute_sql('select * from dual').open_reader() as reader:
for record in reader: # Process each record
...
Para sentencias DDL como DESC, utilice reader.raw para obtener la salida sin procesar:
with o.execute_sql('desc dual').open_reader() as reader:
print(reader.raw)
Configuración de parámetros de tiempo de ejecución
Pase la configuración de tiempo de ejecución a la ejecución de SQL mediante el parámetro hints (un diccionario):
o.execute_sql('select * from PyODPS_iris', hints={'odps.sql.mapper.split.size': 16})
Para aplicar la configuración globalmente en todas las ejecuciones de SQL dentro del nodo:
from odps import options
options.sql.settings = {'odps.sql.mapper.split.size': 16}
o.execute_sql('select * from PyODPS_iris') # Uses the global settings
Para obtener más información sobre los hints compatibles, consulte Operaciones SET.
Uso de DataFrame para procesar datos
No se recomienda el uso de DataFrame. Considere utilizar SQL u otros enfoques compatibles.
Las operaciones de la API de DataFrame son diferidas (lazy); se ejecutan únicamente cuando se invoca un método de ejecución inmediata.
from odps.df import DataFrame
iris = DataFrame(o.get_table('pyodps_iris'))
for record in iris[iris.sepal_width < 3].execute(): # Triggers execution
...
Para habilitar la ejecución implícita en métodos de visualización, establezca options.interactive en True al inicio del nodo:
from odps import options
from odps.df import DataFrame
options.interactive = True # Enable at the top of the node
iris = DataFrame(o.get_table('pyodps_iris'))
print(iris.sepal_width.sum()) # Runs immediately and prints the result
De forma predeterminada, options.verbose es True en DataWorks, por lo que la URL de Logview y otros detalles de ejecución aparecen en el registro durante la ejecución.
Ejemplo: consulta de una tabla de MaxCompute con DataFrame
Prepare un conjunto de datos y cree una tabla llamada
pyodps_iris. Consulte Procesamiento de datos con DataFrame.Cree un objeto DataFrame a partir de la tabla. Consulte Create a DataFrame object from a MaxCompute table.
-
Introduzca el siguiente código en el editor de código y ejecute el nodo:
from odps.df import DataFrame # Create a DataFrame from the MaxCompute table iris = DataFrame(o.get_table('pyodps_iris')) print(iris.sepallength.head(5))Salida esperada:
sepallength 0 4.5 1 5.5 2 4.9 3 5.0 4 6.0
Configuración de parámetros de programación
A diferencia de los nodos SQL, el código de los nodos PyODPS no realiza sustitución de cadenas ${param_name}. En su lugar, DataWorks inyecta los parámetros de programación en el nodo como un diccionario global args antes de que se ejecute el nodo.
Paso 1: Agregar parámetros en las propiedades del nodo
Abra la pestaña Properties del nodo (panel de navegación derecho en la pestaña de configuración) y agregue entradas en la sección Scheduling Parameter. Para conocer el formato y las diferencias de sintaxis entre tipos de nodos, consulte Configuración de parámetros de programación para diferentes tipos de nodos.
Paso 2: Leer parámetros en el código
Por ejemplo, si establece ds=${yyyymmdd} en la sección Scheduling Parameter, lea el valor en su código de la siguiente manera:
print('ds=' + args['ds'])
# Output: ds=20161116
Para obtener la partición correspondiente a esa fecha:
o.get_table('table_name').get_partition('ds=' + args['ds'])
Los parámetros de programación personalizados para nodos PyODPS deben establecerse con un valor constante. A diferencia de los nodos SQL, el valor no se sustituye automáticamente en tiempo de ejecución.
Para conocer más escenarios de desarrollo de tareas PyODPS, consulte:
Pasos siguientes
Comprobar que el nodo se ejecutó correctamente: El método para confirmar la ejecución correcta de un script de Shell también aplica a scripts de Python.
Desplegar el nodo PyODPS 3: En espacios de trabajo en modo estándar, despliegue el nodo en el entorno de producción antes de programarlo.
Realizar O&M en el nodo PyODPS 3: Después del despliegue en Operation Center, gestione y supervise el nodo desde el entorno de producción.
Preguntas frecuentes sobre PyODPS: Problemas comunes y guía de solución.