Todos os produtos
Search
Central de documentação

MaxCompute:Perguntas frequentes sobre UDF do MaxCompute (Java)

Última atualização: Jul 10, 2026

Problemas comuns e soluções para funções definidas pelo usuário (UDFs) do MaxCompute escritas em Java, incluindo erros de carregamento de classe, restrições de sandbox, timeouts de desempenho e uso de UDTF.

Problemas de classe ou dependência

Problemas frequentes de classe ou dependência ao chamar uma UDF do MaxCompute:

  • Sintoma 1: Ocorre um erro em tempo de execução com a mensagem ClassNotFoundException ou Some dependencies are missing.

    • Causas:

      • O pacote JAR de recurso especificado durante a criação da UDF está incorreto.

      • O pacote JAR de recurso do qual a UDF depende não foi enviado para o MaxCompute. Por exemplo, um pacote de terceiros dependente não foi carregado.

      • O projeto está incorreto no momento da chamada da UDF. A UDF não existe no projeto atual do MaxCompute. Isso pode ocorrer quando a função é registrada em um projeto de desenvolvimento, mas chamada em um projeto de produção.

      • O arquivo de recurso não existe ou o tipo de recurso está errado. Por exemplo, para um arquivo PY, o tipo de recurso é PY, mas o tipo exigido por get_cache_file no código da UDF é FILE.

    • Soluções:

      • Verifique o pacote JAR para confirmar se está correto e contém as classes necessárias. Reempacote o arquivo e faça o upload para o projeto do MaxCompute. Para mais informações sobre empacotamento, upload e registro, consulte Empacotar, carregar e registrar uma UDF.

      • Carregue o pacote de terceiros do qual a UDF depende no projeto do MaxCompute como um recurso. Em seguida, adicione esse pacote à lista de recursos dependentes ao registrar a função. Para mais detalhes sobre como adicionar recursos e registrar funções, veja Adicionar um recurso e Registrar uma função.

      • Para resolver o problema descrito na Causa 3, execute o comando list functions; no projeto onde ocorreu o erro usando o cliente do MaxCompute. Isso garante que a UDF do MaxCompute exista e que sua classe e recursos dependentes estejam corretos.

      • Para solucionar a questão da Causa 4, utilize o cliente do MaxCompute e execute o comando desc function <function_name>; para assegurar que a lista Resources inclua todos os recursos de arquivo necessários. Caso o tipo de recurso não corresponda, execute o comando add <file_type> <file_name>; para adicionar o recurso novamente.

  • Sintoma 2: Uma mensagem de erro de tempo de execução é exibida, como NoClassDefFoundError ou NoSuchMethodError, ou o código de erro é ODPS-0123055.

    • Causas:

      • A versão de uma biblioteca de terceiros no pacote JAR carregado é incompatível com a versão da biblioteca de terceiros integrada ao MaxCompute.

      • Restrições do sandbox Java. Se o Stderr da instância do job contiver a mensagem java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "createClassLoader"), isso indica uma restrição de sandbox. As UDFs do MaxCompute estão sujeitas às restrições do sandbox Java quando executadas em ambiente distribuído. Para mais informações sobre essas restrições, consulte Sandbox Java.

    • Soluções:

  • Problemas de restrição do sandbox Java

    • Sintoma: Ocorre um erro ao chamar uma UDF do MaxCompute para acessar arquivos locais, a rede pública ou um sistema de arquivos distribuído, ou para criar threads Java.

    • Causa: Restrições de rede. Por padrão, as UDFs do MaxCompute não têm acesso à rede.

    • Solução: Preencha e envie o formulário de solicitação de conectividade de rede conforme suas necessidades de negócio. A equipe de suporte técnico do MaxCompute entrará em contato para ativar o acesso à rede. Para instruções sobre como preencher o formulário, consulte Procedimento de acesso à rede.

    Problemas de desempenho

    Problemas comuns de desempenho ao chamar uma UDF do MaxCompute:

    • Sintoma 1: O erro de tempo de execução é kInstanceMonitorTimeout.

      • Causa: O tempo de processamento da UDF excede o limite de timeout. Por padrão, um lote de registros (geralmente 1.024) deve ser processado em até 1.800 segundos. Esse limite aplica-se ao processamento de um único lote, não ao tempo total de execução do worker. O SQL normalmente processa dados a uma taxa superior a 10.000 registros por segundo. O limite evita loops infinitos nas UDFs que causariam uso prolongado da CPU.

      • Soluções:

        • Se o volume real de dados para computação for grande, chame ExecutionContext.claimAlive no método da classe de implementação da UDF para redefinir o temporizador.

        • Otimize a lógica do código da UDF. Também é possível configurar os seguintes parâmetros no nível de sessão para ajustar o tempo de execução da UDF e melhorar a velocidade de processamento.

          Parâmetro

          Descrição

          set odps.function.timeout=xxx;

          Ajusta o timeout de tempo de execução da UDF. O valor padrão é 1800s. Aumente esse valor conforme necessário. O intervalo válido vai de 1s a 3600s.

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

          Define o volume de dados de entrada para um worker Map. O valor padrão é 256 MB. Diminua esse valor se necessário.

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

          Controla a quantidade de linhas de dados que o MaxCompute processa por vez. O valor padrão é 1024. Reduza esse valor conforme a necessidade.

    • Sintoma 2: O tempo de execução retorna uma mensagem de erro como errMsg:SigKill(OOM) ou OutOfMemoryError.

      • Causa: Os jobs do MaxCompute são executados em três etapas principais: Map, Reduce e Join. Com grandes volumes de dados, cada instância nessas etapas pode exigir um longo tempo de processamento.

      • Soluções:

        • Quando o erro estiver relacionado ao código fuxi ou runtime, defina os seguintes parâmetros de recurso para aumentar a velocidade de processamento.

          Parâmetro

          Descrição

          set odps.stage.mapper.mem=xxx;

          Especifica o tamanho de memória de um worker Map. O valor padrão é 1024 MB. Aumente conforme necessário.

          set odps.stage.reducer.mem=xxx;

          Determina o tamanho de memória de um worker Reduce. O valor padrão é 1024 MB. Aumente se precisar.

          set odps.stage.joiner.mem=xxx;

          Configura o tamanho de memória de um worker Join. O valor padrão é 1024 MB. Aumente conforme a demanda.

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

          Ajusta o volume de dados de entrada para um worker Map. O valor padrão é 256 MB. Aumente esse valor se necessário.

          set odps.stage.reducer.num=xxx;

          Define a quantidade de workers na etapa Reduce. Aumente esse valor conforme necessário.

          set odps.stage.joiner.num=xxx;

          Estabelece o número de workers na etapa Join. Aumente conforme a necessidade.

        • Se o erro estiver no código Java, aumente a memória da JVM definindo set odps.sql.udf.jvm.memory=xxx; além dos parâmetros acima.

    • Para mais informações sobre parâmetros, consulte Operações SET.

      Problemas relacionados a UDTF

      Problemas comuns ao chamar uma função tabular definida pelo usuário (UDTF) em Java:

      • Sintoma 1: Erro de tempo de execução: Semantic analysis exception: only a single expression in the SELECT clause is supported with UDTFs.

        • Causa: Ao chamar uma UDTF Java em uma instrução SELECT, a UDTF foi misturada com outras colunas ou expressões. Essa prática não é suportada. O exemplo abaixo ilustra o uso incorreto.

          select b.*, 'x', udtffunction_name(v) from table lateral view udtffunction_name(v) b as f1, f2;
        • Solução: Utilize a UDTF Java com LATERAL VIEW. Exemplo:

          select b.*, 'x' from table lateral view udtffunction_name(v) b as f1, f2;
      • Sintoma 2: Erro de tempo de execução: Semantic analysis exception - expect 2 aliases but have 0.

        • Causa: Os nomes das colunas de saída não foram especificados no código da UDTF Java.

        • Solução: Especifique os nomes das colunas na cláusula as da instrução SELECT. Exemplo:

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