Todos os produtos
Search
Central de documentação

MaxCompute:Perguntas Frequentes sobre MapReduce

Última atualização: Sep 20, 2026

Este tópico descreve as perguntas frequentes (FAQs) sobre o uso do MapReduce.

Categoria

FAQ

Consultas sobre recursos

Desenvolvimento com MapReduce

Erros comuns

Uma view pode ser usada como fonte de entrada para o MapReduce?

Não. A fonte de entrada deve ser uma tabela.

Quando o MapReduce grava resultados em uma tabela ou partição, os dados são sobrescritos ou acrescentados?

Os dados existentes na tabela ou partição são sobrescritos.

É possível chamar um arquivo shell no MapReduce?

Não. Essa ação é restrita pelo sandbox do Java. Para mais informações, consulte Java sandbox.

O reduce.setup consegue ler dados de uma tabela de entrada?

É possível ler da tabela de cache, mas não da tabela de entrada.

Um Mapper suporta entrada de múltiplas partições da mesma tabela?

Os Mappers suportam entrada de várias partições dentro de uma única tabela. Cada partição pode ser tratada como uma tabela independente.

Um Mapper consegue ler informações de campos de partição diretamente de um Record?

Um Mapper não consegue recuperar informações de campos de partição diretamente de um Record. No entanto, é possível usar o código a seguir. O PartitionSpec fornece as informações da partição.

PartitionSpec ps = context.getInputTableInfo().getPartitionSpec();
String area = ps.get(“area”);        

Qual é a relação entre um rótulo e uma partição?

Um rótulo é uma tag aplicada a diferentes saídas para identificar a origem de cada resultado.

Um job MapReduce pode conter apenas uma função Map?

Sim. O MapReduce suporta jobs Map-Only. Para um job Map-Only, defina explicitamente o número de Reducers como 0 usando job.setNumReduceTasks(0).

Cada registro de uma tabela de entrada em um Mapper pode ser lido pelo nome da coluna?

Sim. Cada registro de uma tabela de entrada pode ser lido pelo seu número ordinal, como record.get(i), ou pelo nome da coluna, como record.get("size").

Qual é a diferença entre write(Record key, Record value) e write(Record record)?

  • write(Record key, Record value): Gera resultados intermediários, como key.set("id", v1),value.set("size", v2). Os resultados intermediários da função Map são enviados para a função Reduce pela rede. Como nenhuma tabela está associada para inferência de tipo, declare os tipos de campo para serialização. Os tipos de campo de saída são tipos de dados do MaxCompute.

    job.setMapOutputKeySchema(SchemaUtils.fromString(“id:string”));  
    job.setMapOutputValueSchema(SchemaUtils.fromString(“size:bigint”));               
  • write(Record record): Grava os resultados na tabela de destino. Como uma tabela está associada para inferência de tipo, não é necessário declarar os tipos de campo.

No MaxCompute MapReduce, por que é necessário especificar dois JARs: Libjars e Classpath?

O cliente local realiza a configuração do job e outras operações que envolvem execução remota. Por isso, um executor roda no cliente local e outro no servidor remoto.

O executor remoto carrega o Classpath remoto, que é -libjars mapreduce-examples.jar. O executor local carrega o Classpath local, portanto também especifique -classpath lib/mapreduce-examples.jar.

É possível usar diretamente o source code do Hadoop MapReduce no MaxCompute MapReduce?

Não. A API do MaxCompute MapReduce é diferente da API do Hadoop MapReduce, embora os estilos de programação sejam semelhantes. Modifique o source code do Hadoop e compile-o com o software development kit (SDK) do MaxCompute MapReduce antes de executá-lo no MaxCompute.

Como implementar ordenação no MapReduce?

Use o seguinte código para implementar a ordenação.

// Set the sort columns. Here, the data is sorted by the i1 and i2 fields.
job.setOutputKeySortColumns(new String[] { "i1", "i2" });
// Set the sort order for the columns. Here, i1 is sorted in ascending order and i2 is sorted in descending order.
job.setOutputKeySortOrder(new SortOrder[] { SortOrder.ASC, SortOrder.DESC });        

Veja a seguir como usar o método setOutputKeySortOrder.

public void setOutputKeySortOrder(JobConf.SortOrder[] order)
Function: Sets the sort order of the key columns.
Parameter: Order specifies the sort order of the columns. Valid values: ASC (ascending) and DESC (descending).       

O que são Backups no MapReduce?

Backups são um recurso de ajuste de desempenho. O MaxCompute monitora suas tarefas e, quando identifica uma com carga elevada, inicia um job de backup para ela. Os dois jobs processam os mesmos dados, e o resultado do que concluir primeiro é utilizado. Esse recurso é chamado de Backups. No entanto, quando a tarefa é muito grande, os Backups podem não ser eficazes, pois nem a tarefa original nem o job de backup conseguem concluir a tempo.

Ao desenvolver um job MapReduce, como passar múltiplos recursos pela linha de comando?

Separe os recursos com vírgulas (,), por exemplo: jar -resource resource1,resource2,...

Como verificar se uma tabela está vazia no método main?

Use o seguinte código para verificar se uma tabela está vazia.

Odps odps=SessionState.get().getOdps();
Table table=odps.tables().get('tableName');
RecordReader recordReader=table.read(1);
if(recordReader.read()==null){
//TO DO      

No MaxCompute MapReduce, como configurar código Java para impressão de logs?

Utilize um dos métodos a seguir:

  • Use System.out.println no seu código para imprimir logs. Os logs são enviados para o stdout no Logview.

  • Quando ocorre uma exceção, o cliente retorna a mensagem de erro automaticamente. Não é necessário imprimir informações de log manualmente.

  • Adote o logging padrão. Os logs são enviados para o stderr, que pode ser visualizado no Logview.

A tabela de destino reterá dados duplicados após duas computações MapReduce?

Sim. Ao consultar os dados, dois registros idênticos serão retornados.

No Hadoop, é possível selecionar múltiplos nós para processamento distribuído. Como configurar nós para processamento distribuído no MaxCompute MapReduce?

Não é necessário construir nem alocar nós manualmente. Essa é uma das vantagens do MaxCompute.

Ao executar um job MapReduce, o sistema subjacente do MaxCompute determina as partições de dados a usar com base em seu próprio algoritmo.

A saída é normal sem um Combiner, mas a função Reduce não recebe nenhuma entrada quando um Combiner é usado. Por quê?

Esse problema ocorre porque o registro único gerado pela função Reduce é inconsistente com o par chave-valor produzido pela função Map.

Em um job MapOnly, por que o programa não especifica o formato de schema da tabela de saída?

O schema da tabela de saída deve ser criado previamente e especificado na instrução create table. O programa MapOnly não precisa especificar o schema e pode gravar os dados diretamente.

Como chamar um servidor MaxCompute localmente para executar um job MapReduce?

Normalmente, execute um pacote JAR do MaxCompute usando o comando jar na interface de linha de comando. Para mais informações, consulte Submit a MapReduce job.

Também é possível integrar o pacote ao seu projeto em modo analógico. O procedimento é o seguinte:

  1. Defina as dependências do pacote.

    Além do SDK básico, outros pacotes de dependência são necessários. Eles estão disponíveis na pasta lib da ferramenta cliente. Essa pasta também contém o pacote JAR do SDK. Recomenda-se importar todos os pacotes JAR da pasta lib da versão mais recente da ferramenta cliente.

  2. Faça o upload do pacote JAR.

    Empacote o programa MapReduce que passou nos testes locais em um arquivo JAR e faça o upload. Por exemplo, suponha que o arquivo JAR se chame mr.jar. Para mais informações, consulte Resource operations.

  3. Configure o modo de execução.

    Configure o JobConf. Veja a seguir um exemplo de configuração.

    // Configure the MaxCompute connection information.
    Account account = new AliyunAccount(accessid, accesskey);
    Odps odps = new Odps(account);
    odps.setEndpoint(endpoint);
    odps.setDefaultProject(project);
    // Get the session.
    SessionState ss = SessionState.get();
    ss.setOdps(odps);
    ss.setLocalRun(false);  // Set the value to false to run the job on the server. To debug the job locally, set the value to true.
    // The code for setting jobconf.
    Job job = new Job();
    String resource = “mr.jar”;
    job.setResources(resource); // This step is similar to the 'jar -resources mr.jar' command.
    // The following code follows the standard MapReduce rules.
    job.setMapperClass(XXXMapper.class);
    job.setReducerClass(XXXReducer.class);                            

    Após concluir a configuração, execute o job MapReduce diretamente.

Como resolver o erro BufferOverflowException ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
         java.nio.BufferOverflowException
         at java.nio.DirectByteBuffer.put(Unknown Source)
         at com.aliyun.odps.udf.impl.batch.TextBinary.put(TextBinary.java:35)   
  • Causa:

    O volume de dados gravado de uma vez é muito grande, causando overflow no buffer.

  • Solução:

    Os seguintes limites se aplicam aos tipos de dados que podem ser gravados em um único campo no MaxCompute.

    String      8 MB
    Bigint      -9223372036854775807 to 9223372036854775807
    Boolean     True/False
    Double      -1.0 10308 to 1.0 10308
    Date        0001-01-01 00:00:00 to 9999-12-31 23:59:59                  

Como resolver o erro "Resource not found" ao executar um job MaxCompute MapReduce?

Ao enviar um job, use o parâmetro -resources para especificar os recursos necessários. Separe múltiplos recursos com vírgulas (,).

Como resolver o erro "Class Not Found" ao executar um job MaxCompute MapReduce?

Esse erro ocorre em duas situações ao executar um job MapReduce:

  • O nome da classe para o parâmetro classpath está incorreto. Especifique o nome completo do pacote.

  • Ocorreu um erro durante o empacotamento do JAR. Certifique-se de selecionar todo o source code do diretório SRC ao empacotar.

Como resolver o erro ODPS-0010000 ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    ODPS-0010000: System internal error - get input pangu dir meta fail.
  • Causa:

    O erro ocorre porque você tenta usar uma partição antes de criá-la ou antes que seus dados estejam disponíveis.

  • Solução:

    Crie a partição antes de executar o job MapReduce.

Como resolver o erro "Table not found" ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    Exception in thread "main" com.aliyun.odps.OdpsException: Table not found: project_name.table_name.
  • Causa:

    O projeto de destino está incorreto ou a tabela de destino não existe.

  • Solução:

    O Table Info Builder da interface MapReduce requer ProjectName e TableName. Defina esses dois parâmetros com o nome correto do projeto e o nome correto da tabela.

Como resolver o erro ODPS-0123144 ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    FAILED: ODPS-0123144: Fuxi job failed - WorkerRestar
  • Causa:

    O erro ocorre porque um nó secundário do cluster atinge o tempo limite durante a computação. O nó primário considera o nó secundário com falha e reporta o erro. O período de timeout é de 10 minutos e não pode ser configurado pelos usuários.

  • Solução:

    Uma causa comum desse erro é um loop extenso na função Reduce, que pode ser provocado por dados de cauda longa ou por um produto cartesiano. Minimize esses loops extensos sempre que possível.

Como resolver o erro java.security.AccessControlException ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.ExceptionInInitializerError
     ...
    Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "getProtectionDomain")
      at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)       
  • Causa:

    O erro ocorre porque o código viola as restrições do sandbox. Para mais informações, consulte Java sandbox.

  • Solução:

    Para resolver esse erro, é necessário acessar recursos externos. No entanto, o MaxCompute não suporta essa operação atualmente. Armazene a lógica de processamento externo e os dados relacionados no MaxCompute para acessá-los. Para ler arquivos de configuração, consulte Use resource files.

Como resolver o erro java.io.IOException ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    Exception in thread “main“ java.io.IOException: ODPS-0740001: Too many local-run maps: 101, must be <= 100(specified by local-run parameter ‘odps.mapred.local.map.max.tasks‘)     
  • Causa:

    O valor padrão de local-run maps é 100, o que precisa ser ajustado.

  • Solução:

    Adicione a configuração -Dodps.mapred.local.map.max.tasks=200.

Como resolver o erro "Exceed maximum read times" ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    ODPS-0730001: Exceed maximum read times per resource       
  • Causa:

    O arquivo de recurso foi lido um número excessivo de vezes.

  • Solução:

    Verifique a lógica do código de leitura do recurso. Em geral, um recurso deve ser lido apenas uma vez na fase de setup. Evite ler o recurso múltiplas vezes nas fases Map ou Reduce.

Um erro de falta de memória ocorre antes do início da função Reduce. Como resolver esse problema?

  • Causa:

    Alguns dados são muito grandes e causam overflow ao serem carregados na memória.

  • Solução:

    Remova o Combiner ou limite o tamanho dos dados no Combiner usando set odps.mapred.map.min.split.size=512;.

Como resolver um erro de falta de memória ao executar um job MaxCompute MapReduce?

Erros de falta de memória geralmente são causados por memória insuficiente. Resolva esse problema ajustando os parâmetros de memória da JVM, como odps.stage.mapper.jvm.mem e odps.stage.reducer.jvm.mem. Por exemplo, execute o comando set odps.stage.mapper.jvm.mem = 2048 para definir a memória como 2 GB.

Ao executar um job MaxCompute MapReduce, 600 Reducers são iniciados para carregar um pequeno arquivo de configuração, mas ocorre um erro java.lang.OutOfMemoryError. Como resolver esse problema?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    java.lang.OutOfMemoryError: Java heap space
  • Causa:

    O problema é causado pelos limites de uso do MapReduce. Para mais informações, consulte Limits.

  • Solução:

    Defina as configurações conforme descrito em Native SDK overview.

Como resolver o erro ODPS-0420095 ao executar um job MaxCompute MapReduce?

  • Sintoma:

    Ao executar um job MaxCompute MapReduce, o seguinte erro é retornado.

    Exception in thread "main" java.io.IOException: com.aliyun.odps.OdpsException: ODPS-0420095: Access Denied - The task is not in release range: LOT
  • Causa:

    O projeto usa recursos da edição MaxCompute Developer Edition. Essa edição suporta apenas jobs MaxCompute SQL (incluindo UDFs) e PyODPS. Outras tarefas, como MapReduce ou Spark, não são suportadas.

  • Solução:

    Para atualizar as especificações do projeto, consulte Switch between billing methods.

O erro "Too many open files" ocorre ao usar recursos no MapReduce. Como resolver esse problema?

  • Sintoma:

    Ao usar recursos no MapReduce, o seguinte erro é retornado.

     Caused by: com.aliyun.odps.OdpsException: java.io.FileNotFoundException: temp/mr_XXXXXX/resource/meta.user.group.config (Too many open files)
  • Causa:

    Um único job não pode referenciar mais de 256 recursos. Caso contrário, ocorre um erro. Recursos de tabela e recursos Archive são contados individualmente como uma unidade cada. Para mais informações sobre os limites, consulte Limits.

  • Solução:

    Ajuste o número de recursos referenciados.

Uso uma classe de terceiros em um programa MapReduce e empacoto um arquivo JAR Assembly. Um erro "class not found" ocorre em tempo de execução. Como resolver esse problema?

Quando um job MaxCompute MapReduce é executado em ambiente distribuído, ele está sujeito às restrições do sandbox do Java. O programa principal do job MapReduce não está sujeito a essas restrições. Para mais informações sobre as restrições, consulte Java sandbox.

Se você precisar apenas processar JSON, use o Gson diretamente, sem necessidade de empacotá-lo. Os componentes open source do Java oferecem diversos métodos para converter strings em datas, como o SimpleDateFormat.

Um erro "index out of bounds" ocorre ao executar um job MapReduce compatível com open source no MaxCompute. Como resolver esse problema?

Recomenda-se usar a interface MaxCompute MapReduce para escrever o código. Também é recomendável usar Spark em vez de MapReduce, exceto quando for estritamente necessário.