Este tópico descreve as perguntas frequentes (FAQs) sobre o uso do MapReduce.
Uma view pode ser fonte de entrada para o MapReduce?
Não. A entrada deve ser obrigatoriamente uma tabela.
Ao gravar resultados em uma tabela ou partição, o MapReduce sobrescreve ou anexa dados?
Ele sobrescreve os dados existentes na tabela ou na partição.
É possível chamar um arquivo shell no MapReduce?
Não. O sandbox do Java restringe essa ação. Para mais informações, consulte Java sandbox.
O método reduce.setup pode ler dados de uma tabela de entrada?
É possível ler da tabela de cache, mas não da tabela de entrada.
Um Mapper aceita entradas de múltiplas partições da mesma tabela?
Sim. Os Mappers aceitam entradas de várias partições dentro de uma única tabela. Cada partição pode ser tratada como uma tabela independente.
Um Mapper pode ler diretamente as informações de campo de partição de um Record?
Um Mapper não recupera informações de campo de partição diretamente de um Record. No entanto, utilize o código abaixo. 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 sua origem.
Um job do MapReduce pode conter apenas uma função Map?
Sim. O MapCompute suporta jobs do tipo Map-Only. Para esse tipo de job, defina explicitamente o número de Reducers como 0 usando job.setNumReduceTasks(0).
É possível ler cada registro de uma tabela de entrada em um Mapper pelo nome da coluna?
Sim. Leia cada registro de uma tabela de entrada pelo 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, comokey.set("id", v1),value.set("size", v2). A função Map envia os resultados intermediários à função Reduce pela rede. Como não há tabela associada para inferência de tipos, declare os tipos dos campos para serialização. Os tipos de campos de saída correspondem aos 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 existe uma tabela associada para inferência de tipos, não é necessário declarar os tipos dos campos.
Por que preciso especificar dois JARs no MaxCompute MapReduce: Libjars e Classpath?
O cliente local executa a configuração do job e outras operações que envolvem execução remota. Portanto, um executor roda no cliente local e outro no servidor remoto.
O executor remoto carrega o Classpath remoto, definido por -libjars mapreduce-examples.jar. Já o executor local carrega o Classpath local; portanto, especifique também -classpath lib/mapreduce-examples.jar.
Posso usar diretamente o código-fonte do Hadoop MapReduce no MaxCompute MapReduce?
Não. A API do MaxCompute MapReduce difere da API do Hadoop MapReduce, embora os estilos de programação sejam semelhantes. Modifique o código-fonte do Hadoop e compile-o com o kit de desenvolvimento de software (SDK) do MaxCompute MapReduce antes de executar o código no MaxCompute.
Como implementar ordenação no MapReduce?
Utilize o código a seguir para ordenar os dados.
// 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 });
O exemplo abaixo mostra 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, se detectar uma carga de trabalho pesada, inicia um job de backup. Ambos os jobs processam os mesmos dados, e o sistema utiliza o resultado daquele que terminar primeiro. Esse mecanismo chama-se Backups. Contudo, se a tarefa for muito grande, os Backups podem não ser eficazes, pois nem a tarefa original nem o job de backup conseguirão concluir a tempo.
Como passar múltiplos resources na linha de comando ao desenvolver um job do MapReduce?
Separe os resources com vírgulas (,), por exemplo: jar -resource resource1,resource2,...
Como verificar se uma tabela está vazia no método main?
Use o código abaixo 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
Como configurar a impressão de logs em código Java no MaxCompute MapReduce?
Escolha um dos métodos a seguir:
Utilize
System.out.printlnno código para imprimir logs. A saída será direcionada para stdout no Logview.Quando ocorre uma exceção, o cliente retorna uma mensagem de erro. Nesse caso, não é necessário imprimir informações de log.
Use bibliotecas de logging comuns. Os logs serão direcionados para stderr, onde podem ser visualizados no Logview.
A tabela de destino mantém dados duplicados após duas computações do MapReduce?
Sim. Ao consultar os dados, você recuperará dois registros idênticos.
No Hadoop, posso selecionar vários nós para processamento distribuído. Como configuro nós para processamento distribuído no MaxCompute MapReduce?
Não é necessário criar ou alocar nós manualmente. Essa é uma das vantagens do MaxCompute.
Ao executar um job do MapReduce, o sistema subjacente do MaxCompute determina automaticamente as partições de dados a serem usadas com base em seu algoritmo interno.
A saída é normal sem um Combiner, mas a função Reduce não recebe 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?
Crie o schema da tabela de saída antecipadamente e especifique-o durante a execução da instrução create table. O programa MapOnly não precisa definir o schema e pode gerar os dados diretamente.
Como chamar localmente um servidor do MaxCompute para executar um job do MapReduce?
Normalmente, execute um pacote JAR do MaxCompute rodando 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. Siga o procedimento abaixo:
-
Defina as dependências do pacote.
Além do SDK básico, outros pacotes de dependência são necessários. Encontre-os na pasta lib da ferramenta de cliente. A pasta lib também contém o pacote JAR do SDK. Recomendamos importar todos os pacotes JAR da pasta lib da versão mais recente da ferramenta de cliente.
-
Faça o upload do pacote JAR.
Empacote o programa MapReduce aprovado 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.
-
Configure o modo de execução.
Configure o JobConf. Veja um exemplo de configuração abaixo.
// 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 do MapReduce diretamente.
Como resolver o erro BufferOverflowException ao executar um job do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do 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:
A quantidade de dados gravados de uma só vez é excessiva, causando estouro de buffer.
-
Solução:
Os limites a seguir 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 do MaxCompute MapReduce?
Ao enviar um job, use o parâmetro -resources para especificar os resources necessários. Separe múltiplos resources com vírgulas (,).
Como resolver o erro "Class Not Found" ao executar um job do MaxCompute MapReduce?
Esse erro ocorre nas duas situações seguintes durante a execução de um job do MapReduce:
O nome da classe no parâmetro
classpathestá incorreto. Especifique o nome completo do pacote.Ocorreu um erro durante o empacotamento do JAR. Certifique-se de selecionar todo o código-fonte no diretório SRC durante o empacotamento.
Como resolver o erro ODPS-0010000 ao executar um job do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do MaxCompute MapReduce, o seguinte erro é retornado.
ODPS-0010000: System internal error - get input pangu dir meta fail. -
Causa:
Esse erro ocorre ao tentar usar uma partição antes de sua criação ou antes que seus dados estejam prontos.
-
Solução:
Crie a partição antes de executar o job do MapReduce.
Como resolver o erro "Table not found" ao executar um job do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do 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 do MapReduce requer ProjectName e TableName. Defina esses dois parâmetros com o nome correto do projeto e da tabela.
Como resolver o erro ODPS-0123144 ao executar um job do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do MaxCompute MapReduce, o seguinte erro é retornado.
FAILED: ODPS-0123144: Fuxi job failed - WorkerRestar -
Causa:
Esse erro ocorre porque um nó secundário no cluster atingiu o tempo limite durante a computação. O nó primário considera o nó secundário defeituoso e reporta um erro. O tempo limite é 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, provocado por dados de cauda longa ou por um produto cartesiano. Tente minimizar esses loops extensos.
Como resolver o erro java.security.AccessControlException ao executar um job do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do 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:
Esse erro ocorre porque seu código viola as restrições do sandbox. Para mais informações, consulte Java sandbox.
-
Solução:
Resolver esse erro exigiria acessar resources externos, mas o MaxCompute atualmente não suporta essa operação. 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 do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do 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 exige ajuste.
-
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 do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do MaxCompute MapReduce, o seguinte erro é retornado.
ODPS-0730001: Exceed maximum read times per resource -
Causa:
O arquivo de resource foi lido vezes demais.
-
Solução:
Verifique a lógica do código para leitura do resource. Normalmente, leia o resource apenas uma vez na fase de setup. Não leia o resource múltiplas vezes na fase Map ou Reduce.
Ocorre um erro de falta de memória antes do início da função Reduce. Como resolver?
-
Causa:
Alguns dados são grandes demais e causam estouro ao serem carregados na memória.
-
Solução:
Remova o Combiner ou limite o tamanho no Combiner usando
set odps.mapred.map.min.split.size=512;.
Como resolver um erro de falta de memória ao executar um job do MaxCompute MapReduce?
Um erro de falta de memória geralmente indica 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 do MaxCompute MapReduce, 600 Reducers são iniciados para carregar um pequeno arquivo de configuração, mas ocorre um erro java.lang.OutOfMemoryError. Como resolver?
-
Sintoma:
Ao executar um job do MaxCompute MapReduce, o seguinte erro é retornado.
java.lang.OutOfMemoryError: Java heap space -
Causa:
Esse problema decorre dos limites de uso do MapReduce. Para mais informações, consulte Limits.
-
Solução:
Configure as definições conforme descrito em Native SDK overview.
Como resolver o erro ODPS-0420095 ao executar um job do MaxCompute MapReduce?
-
Sintoma:
Ao executar um job do 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 utiliza resources do MaxCompute Developer Edition. Esta edição suporta apenas MaxCompute SQL (incluindo UDFs) e jobs PyODPS, mas não suporta outras tarefas, como MapReduce ou Spark.
-
Solução:
Para atualizar as especificações do projeto, consulte Switch between billing methods.
Ocorre um erro "Too many open files" ao usar resources no MapReduce. Como resolver?
-
Sintoma:
Ao usar resources 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 resources; caso contrário, ocorrerá um erro. Resources de tabela e resources de Archive contam individualmente como uma unidade. Para mais informações sobre os limites, consulte Limits.
-
Solução:
Ajuste a quantidade de resources referenciados.
Uso uma classe de terceiros em um programa MapReduce e empacoto um arquivo Assembly JAR. Ocorre um erro "class not found" em tempo de execução. Como resolver?
Quando um job do MaxCompute MapReduce é executado em ambiente distribuído, ele está sujeito às restrições do sandbox Java. O programa principal do job do MapReduce não está sujeito a essas restrições. Para mais informações sobre as restrições, consulte Java sandbox.
Se precisar apenas processar JSON, use o Gson diretamente. Não é necessário empacotar a classe Gson. Componentes open source do Java fornecem vários métodos para converter strings em datas, como o SimpleDateFormat.
Ocorre um erro "index out of bounds" ao executar um job do MapReduce compatível com open source no MaxCompute. Como resolver?
Recomendamos usar a interface do MaxCompute MapReduce para escrever seu código. Também sugerimos utilizar o Spark em vez do MapReduce, a menos que este seja estritamente necessário.