Todos los productos
Search
Centro de documentos

MaxCompute:Preguntas frecuentes sobre UDF de MaxCompute (Java)

Última actualización: Sep 03, 2026

Problemas comunes y soluciones para las funciones definidas por el usuario (UDF) de MaxCompute escritas en Java, incluidos errores de carga de clases, restricciones del sandbox, tiempos de espera por rendimiento y uso de UDTF.

Problemas de clases o dependencias

Problemas frecuentes de clases o dependencias al invocar una UDF de MaxCompute:

  • Síntoma 1: Se produce un error en tiempo de ejecución con el mensaje ClassNotFoundException o Some dependencies are missing.

    • Causas:

      • El paquete JAR de recursos que se especificó al crear la UDF es incorrecto.

      • El paquete JAR de recursos del que depende la UDF no se ha cargado en MaxCompute. Por ejemplo, no se cargó un paquete de terceros del que depende la función.

      • El proyecto es incorrecto al invocar la UDF. La UDF no se encuentra en el proyecto actual de MaxCompute. Por ejemplo, la UDF está registrada en un proyecto de desarrollo, pero se invoca desde un proyecto de producción.

      • El recurso de archivo no existe o el tipo de recurso es incorrecto. Por ejemplo, para un archivo PY, el tipo de recurso es PY, pero el tipo que requiere get_cache_file en el código de la UDF es FILE.

    • Soluciones:

      • Revise el paquete JAR para confirmar que es correcto y contiene las clases necesarias. Vuelva a empaquetar el archivo y cárguelo en el proyecto de MaxCompute. Para obtener más información sobre cómo empaquetar, cargar y registrar recursos, consulte Package, upload, and register a UDF.

      • Cargue el paquete de terceros del que depende la UDF en el proyecto de MaxCompute como recurso. Luego, agregue este paquete a la lista de recursos dependientes cuando registre la función. Para obtener más información sobre cómo agregar recursos y registrar funciones, consulte Add a resource y Register a function.

      • Para resolver el problema descrito en la causa 3, ejecute el comando list functions; en el proyecto donde ocurrió el error mediante MaxCompute client. Esto permite verificar que la UDF de MaxCompute existe y que tanto su clase como sus recursos dependientes son correctos.

      • Para resolver el problema descrito en la causa 4, utilice MaxCompute client para ejecutar el comando desc function <function_name>; y asegúrese de que la lista Resources incluya todos los recursos de archivo necesarios. Si el tipo de recurso no coincide, puede ejecutar el comando add <file_type> <file_name>; para volver a agregar el recurso.

  • Síntoma 2: Se muestra un mensaje de error en tiempo de ejecución, como NoClassDefFoundError o NoSuchMethodError, o el código de error es ODPS-0123055.

    • Causas:

      • La versión de una biblioteca de terceros en el paquete JAR cargado no coincide con la versión de la biblioteca de terceros integrada en MaxCompute.

      • Restricciones del sandbox de Java. Si el campo Stderr de la instancia del trabajo contiene el mensaje java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader"), esto indica una restricción del sandbox. Las UDF de MaxCompute están sujetas a las restricciones del sandbox de Java cuando se ejecutan en un entorno distribuido. Para obtener más información sobre las restricciones del sandbox de Java, consulte Java sandbox.

    • Soluciones:

      • Puede utilizar maven-shade-plugin para resolver la inconsistencia de versiones y modificar la ruta de importación. Vuelva a empaquetar el archivo en un paquete JAR y cárguelo en el proyecto de MaxCompute. Para obtener más información sobre cómo empaquetar, cargar y registrar recursos, consulte Package, upload, and register a UDF.

      • Consulte Java sandbox restriction issues.

Problemas de restricciones del sandbox de Java

  • Síntoma: Se produce un error al invocar una UDF de MaxCompute para acceder a archivos locales, a la red pública o a un sistema de archivos distribuido, o bien para crear subprocesos de Java.

  • Causa: Restricciones de red. De forma predeterminada, las UDF de MaxCompute no pueden acceder a la red.

  • Solución: Complete y envíe el formulario de solicitud de conectividad de red según sus necesidades empresariales. El equipo de soporte técnico de MaxCompute se pondrá en contacto con usted para habilitar el acceso a la red. Para obtener instrucciones sobre cómo completar el formulario, consulte Network access procedure.

Problemas de rendimiento

Problemas frecuentes de rendimiento al invocar una UDF de MaxCompute:

  • Síntoma 1: El error en tiempo de ejecución es kInstanceMonitorTimeout.

    • Causa: El tiempo de procesamiento de la UDF supera el límite de tiempo de espera. De forma predeterminada, un lote de registros (generalmente 1,024) debe procesarse en un máximo de 1,800 segundos. Este límite aplica al procesamiento de un solo lote, no al tiempo total de ejecución del worker. SQL normalmente procesa datos a una velocidad superior a 10,000 registros por segundo. El límite evita bucles infinitos en las UDF que provocarían un uso prolongado de la CPU.

    • Soluciones:

      • Si el volumen real de datos para el cálculo es grande, puede invocar ExecutionContext.claimAlive en el método de la clase de implementación de la UDF para restablecer el temporizador.

      • Optimice la lógica del código de la UDF. También puede configurar los siguientes parámetros a nivel de sesión para ajustar el tiempo de ejecución de la UDF y mejorar la velocidad de procesamiento.

        Parámetro

        Descripción

        set odps.function.timeout=xxx;

        Ajusta el tiempo de espera de ejecución de la UDF. El valor predeterminado es 1800 s. Puede aumentar este valor según sea necesario. El rango válido es de 1 s a 3600 s.

        set odps.stage.mapper.split.size=xxx;

        Ajusta el volumen de datos de entrada para un worker Map. El valor predeterminado es 256 MB. Puede disminuir este valor según sea necesario.

        set odps.sql.executionengine.batch.rowcount=xxx;

        Ajusta el número de filas de datos que MaxCompute procesa a la vez. El valor predeterminado es 1024. Puede disminuir este valor según sea necesario.

  • Síntoma 2: El entorno de ejecución devuelve un mensaje de error: errMsg:SigKill(OOM) o OutOfMemoryError.

    • Causa: Los trabajos de MaxCompute se ejecutan en tres etapas principales: Map, Reduce y Join. Si el volumen de datos es grande, cada instancia en estas etapas puede requerir un tiempo de procesamiento prolongado.

    • Soluciones:

      • Si el error está relacionado con el código fuxi o runtime, puede establecer los siguientes parámetros de recursos para mejorar la velocidad de procesamiento.

        Parámetro

        Descripción

        set odps.stage.mapper.mem=xxx;

        Ajusta el tamaño de memoria de un worker Map. El valor predeterminado es 1024 MB. Puede aumentar este valor según sea necesario.

        set odps.stage.reducer.mem=xxx;

        Ajusta el tamaño de memoria de un worker Reduce. El valor predeterminado es 1024 MB. Puede aumentar este valor según sea necesario.

        set odps.stage.joiner.mem=xxx;

        Ajusta el tamaño de memoria de un worker Join. El valor predeterminado es 1024 MB. Puede aumentar este valor según sea necesario.

        set odps.stage.mapper.split.size=xxx;

        Ajusta el volumen de datos de entrada para un worker Map. El valor predeterminado es 256 MB. Puede aumentar este valor según sea necesario.

        set odps.stage.reducer.num=xxx;

        Ajusta el número de workers en la etapa Reduce. Puede aumentar este valor según sea necesario.

        set odps.stage.joiner.num=xxx;

        Ajusta el número de workers en la etapa Join. Puede aumentar este valor según sea necesario.

      • Si el error se encuentra en el código Java, también puede aumentar la memoria JVM estableciendo set odps.sql.udf.jvm.memory=xxx; además de los parámetros anteriores.

Para obtener más información sobre los parámetros, consulte SET operations.

Problemas relacionados con UDTF

Problemas frecuentes al invocar una función con valores de tabla definida por el usuario (UDTF) de Java:

  • Síntoma 1: Error en tiempo de ejecución: Semantic analysis exception: only a single expression in the SELECT clause is supported with UDTFs.

    • Causa: Al invocar una UDTF de Java en una instrucción SELECT, la UDTF se mezcla con otras columnas o expresiones. Esta práctica no es compatible. El siguiente ejemplo muestra un uso incorrecto.

      select b.*, 'x', udtffunction_name(v) from table lateral view udtffunction_name(v) b as f1, f2;
    • Solución: Utilice la UDTF de Java con LATERAL VIEW. Ejemplo:

      select b.*, 'x' from table lateral view udtffunction_name(v) b as f1, f2;
  • Síntoma 2: Error en tiempo de ejecución: Semantic analysis exception - expect 2 aliases but have 0.

    • Causa: No se especificaron los nombres de las columnas de salida en el código de la UDTF de Java.

    • Solución: Especifique los nombres de las columnas en la cláusula as de la instrucción SELECT. Ejemplo:

      select udtffunction_name(paramname) as (col1, col2);