Este tópico responde às perguntas mais frequentes sobre tabelas externas.
|
Categoria |
Perguntas frequentes |
|
Tabela externa do Object Storage Service (OSS) |
|
|
Tabela externa do Hologres |
Como resolver o erro ODPS-0130071 ao ler dados do Hologres diretamente do MaxCompute? |
|
Problemas de desempenho |
Como solucionar problemas de lentidão em jobs SQL de tabelas externas? |
Erro ODPS-0123131: Leitura de tipos DATETIME com extratores personalizados
-
Problema
Ao usar um extrator personalizado para ler dados não estruturados, o sistema retorna o seguinte erro se um campo de dados for do tipo DATETIME, como
2019-11-11 06:43:36.FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.IllegalArgumentException at java.sql.Date.valueOf(Date.java:143) at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194) at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153) at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120) -
Causa
No código
Date.valueOf(parts[i]), a funçãojava.sql.Date.valueOf()aceita apenas parâmetros STRING no formato"yyyy-[m]m-[d]d"e não oferece suporte a parâmetros DATETIME. -
Solução
-
Adicione a dependência Joda-Time ao seu projeto e importe as classes necessárias para o código.
-- Dependency. <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> -- Import information. import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; -
Use a função
DateTimeFormat.forPattern()para converter um valor do tipo DATETIME para o tipo STRING durante a leitura.record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));
Exemplo:
-
Faça upload do arquivo JAR do projeto do extrator usando o cliente MaxCompute.
add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jarO caminho
/Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jarcorresponde ao local de armazenamento do arquivo JAR gerado. -
Envie o arquivo JAR de terceiros Joda-Time por meio do cliente MaxCompute.
add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jarO caminho
/Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jarindica a localização local do arquivo JAR de terceiros Joda-Time. -
Transfira os dados de teste para o diretório especificado no OSS. Para um arquivo chamado
video_play_log.txt, os dados de exemplo são os seguintes.5c661071dba64d5080c91da085ff1073^Music-Click-Fast forward^26.12.XX.XX^2019-11-11 06:43:36 -
Leia os dados da tabela externa.
select * from <project_name>.video_play_log;+------+-------+---+----------------+ | uuid | action | ip | time | +------+-------+---+----------------+ | 5c661071dba64d5080c91da085ff1073 | Music-Click-Fast forward | 26.12.XX.XX | 2019-11-11 06:43:36 | +------+-------+---+----------------+
-
Estouro de memória com UDFs em tabelas externas do OSS
-
Problema
Ocorre um erro de estouro de memória ao acessar uma tabela externa do OSS com uma UDF, mesmo que a função tenha passado nos testes locais.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap spaceMesmo após definir os parâmetros abaixo, o tempo de execução aumenta, mas o erro persiste.
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096; -
Causa
A tabela externa contém muitos arquivos de objetos, o que consome uma grande quantidade de memória. Além disso, nenhuma partição foi configurada.
-
Solução
Consulte um volume menor de dados.
Use partições para reduzir a quantidade de dados verificados em cada consulta.
Erro: Dados inline excedem o tamanho máximo permitido
-
Problema
O erro
Inline data exceeds the maximum allowed sizeocorre durante o processamento de dados no Object Storage Service (OSS). -
Causa
Ao gravar dados em uma tabela externa do OSS, o MaxCompute pode tentar criar um único arquivo que ultrapassa o limite operacional de tamanho.
-
Solução
Ajuste as propriedades a seguir para controlar o plano de execução. Isso garante que os arquivos individuais gravados na tabela externa do OSS não ultrapassem o limite de tamanho.
-- Adjust the amount of data read by each mapper. Unit: MB. SET odps.sql.mapper.split.size=256; -- Adjust the number of workers in the reduce phase. SET odps.stage.reducer.num=100;
Mesclar arquivos pequenos em tabelas externas do OSS
Verifique no log do Logview se o último operador no plano de execução SQL é um Reducer ou um Joiner. Caso seja um Reducer, execute a instrução set odps.stage.reducer.num=1;. Se for um Joiner, execute a instrução set odps.stage.joiner.num=1;.
Erro ODPS-0130071: Leitura de dados do Hologres via MaxCompute
-
Problema
Ao ler dados diretamente do Hologres, o sistema retorna o erro "ODPS-0130071 Failed to split to equal size...max count: 7777". Exemplo:
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777 -
Causa
Esse erro ocorre porque a estratégia padrão de divisão de mappers do MaxCompute (volume de dados de entrada / split.size = 256 MB) faz com que o número de mappers simultâneos exceda o limite máximo de 7.777.
NotaEsse limite impede que os usuários enviem jobs que geram um grande número de mappers, o que poderia afetar a estabilidade do Hologres ou da conexão de rede.
-
Solução
Defina os parâmetros a seguir para resolver o erro.
-- Increase the mapper concurrency limit. The maximum value is 10,000. SET odps.external.holo.mapper.instances=10000; -- Adjust task concurrency by increasing the split size. The maximum value is 512 MB. SET odps.sql.mapper.split.size=512;
Jobs SQL lentos em tabelas externas
Diversos fatores comuns podem causar lentidão em jobs SQL executados em tabelas externas:
-
Leitura lenta de arquivos compactados GZ em tabela externa do OSS
-
Problema
A leitura de um arquivo grande e compactado (como um arquivo GZ de 200 GB) a partir de uma tabela externa do OSS apresenta lentidão.
-
Causa
O job fica lento porque formatos compactados como GZ não permitem divisão, forçando o MaxCompute a usar apenas um único mapper.
-
Solução
-
Para melhorar o desempenho, divida o arquivo compactado grande em vários arquivos menores no OSS. Isso permite que o MaxCompute use múltiplos mappers em paralelo, aumentando o throughput de leitura.
-- Sets the data split size for each mapper in MB. SET odps.sql.mapper.split.size=256; Para dados não estruturados, verifique se o caminho da tabela externa do Object Storage Service (OSS) contém apenas um arquivo. Se houver somente um arquivo, o sistema gera apenas um Mapper, pois dados não estruturados compactados não podem ser divididos, tornando o processamento mais lento. Divida o arquivo grande do OSS em arquivos menores no caminho da tabela externa do OSS. Essa ação aumenta o número de Mappers e melhora a velocidade de leitura.
-
-
-
Consulta lenta de dados em tabela externa do MaxCompute via SDK
-
Problema
A consulta de dados em uma tabela externa do MaxCompute usando um SDK apresenta lentidão.
-
Solução
Tabelas externas suportam apenas varreduras completas de tabela, o que pode ser lento. Recomendamos o uso de tabelas internas do MaxCompute.
-
-
Consulta lenta de dados em tabela externa do Tablestore
-
Problema
Uma consulta em uma tabela externa do Tablestore é significativamente mais lenta do que uma consulta equivalente em uma tabela interna do MaxCompute contendo os mesmos dados.
-
Solução
Essa diferença de desempenho é esperada, pois consultar uma tabela externa envolve leituras remotas de dados. Para obter melhor desempenho, importe primeiro os dados para uma tabela interna do MaxCompute e depois execute suas consultas.
-
-
Problema
Ao ler dados de uma tabela externa do OSS, o sistema retorna o seguinte erro:
ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server. -
Causas
Motivo 1: Durante a criação da tabela externa do OSS, utilizou-se um endpoint público para o
oss_endpointno oss_location, em vez de um endpoint interno.Motivo 2: Ao criar a tabela externa do OSS, o
oss_endpointespecificado no caminho oss_location pertence a uma região diferente.
-
Solução
-
Para o Motivo 1:
Verifique o parâmetro
oss_locationna instruçãoCREATE TABLEda tabela externa do OSS. Se ooss_endpointfor público, altere-o para um endpoint interno. Para mais informações sobre os parâmetros, consulte Parameter description.Por exemplo, se você estiver na região Indonesia (Jakarta) e usar o endpoint
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....para criar uma tabela externa, altere-o para o endpoint interno correspondente:oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/..... -
Para o Motivo 2:
Confirme se o
oss_endpointno parâmetrooss_locationda instrução CREATE TABLE da tabela externa do OSS corresponde ao endpoint da região que você deseja acessar. Para mais informações sobre nomes de domínio de rede clássica do OSS, consulte Regions and Endpoints.
-
-
Problema
Ao criar uma tabela externa para o Object Storage Service (OSS), o sistema retorna o seguinte erro:
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed). -
Causa
Durante a criação da tabela externa do OSS, o
oss_endpointno endereço oss_location utiliza um endpoint público, e não um endpoint interno. -
Solução
Verifique a instrução
CREATE TABLEda tabela externa do OSS para confirmar se ooss_endpointespecificado no parâmetrooss_locationé um endpoint interno. Caso seja um endpoint público, altere-o para um endpoint interno. Para mais informações sobre os parâmetros, consulte Parameter description.Por exemplo, na região China (Beijing), se você usar o endpoint
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....para criar uma tabela externa, altere-o para o endpoint interno correspondente:oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....