Este tópico responde às perguntas frequentes (FAQs) sobre o uso do kit de desenvolvimento de software (SDK) do Tunnel.
Ao fazer upload de dados com o Tunnel SDK, é possível distribuí-los automaticamente entre partições?
O Tunnel SDK não distribui automaticamente os dados enviados para diferentes partições. Cada operação de upload tem como destino apenas uma tabela ou uma única partição dentro dela. Em tabelas particionadas, especifique a partição de destino. Para tabelas com múltiplos níveis de partição, indique sempre a partição do nível mais baixo.
Existe um limite de tamanho para o pacote JAR criado a partir de uma User-Defined Function (UDF) ao usar o Tunnel SDK?
O pacote JAR não pode ultrapassar 10 MB. Caso seu arquivo exceda esse tamanho, utilize o comando Tunnel Upload do MaxCompute para enviar os dados.
Há um limite para o número de partições durante o upload de dados com o Tunnel SDK?
O sistema suporta no máximo 60.000 partições. Um volume excessivo dificulta a geração de estatísticas e análises. O MaxCompute restringe a quantidade de instâncias por job, e esse número está diretamente ligado ao volume de dados de entrada e à contagem de partições. Por isso, avalie suas necessidades de negócio e escolha uma política de particionamento adequada para evitar problemas decorrentes de um número elevado de partições.
Como resolver o erro "StatusConflict" que ocorre ao fazer upload de dados com o Tunnel SDK?
-
Sintoma
Durante o upload de dados via Tunnel SDK, o sistema retorna o seguinte erro:
RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status. java.io.IOException: RequestId=20170116xxxxxxx, ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status.at com.aliyun.odps.tunnel.io.TunnelRecordWriter.close(TunnelRecordWriter.java:93) -
Causa: Esse erro surge ao tentar fechar um RecordWriter. Os motivos mais comuns incluem:
Tentativa de fechar um RecordWriter já encerrado.
A sessão associada ao RecordWriter já havia sido fechada.
A sessão já tinha recebido commit.
Solução: Verifique as causas listadas acima. Imprima logs para conferir o estado do RecordWriter e da sessão antes de efetuar o commit. Após confirmar a ausência desses problemas, tente enviar os dados novamente.
Como corrigir o erro "Blocks Not Match" durante o upload de dados com o Tunnel SDK?
-
Sintoma:
Ao enviar dados usando o Tunnel SDK, a seguinte mensagem de erro é exibida:
ErrorCode=Local Error, ErrorMessage=Blocks not match, server: 0, tunnelServiceClient: 1 at com.aliyun.odps.tunnel.TableTunnel$UploadSession.commit(TableTunnel.java:814) -
Causa
A quantidade de blocos recebida pelo servidor difere daquela informada nos parâmetros de commit.
-
Solução
No código, valide se o número de writers abertos por
uploadSession.openRecordWriter(i)corresponde ao array de blocos utilizado no momento do commit. Garanta que ambos estejam alinhados.Após concluir a escrita, confirme a chamada de
recordWriter.close();. Se você fizer o commit direto da sessão, a contagem de blocos no servidor poderá divergir do esperado.
O que fazer quando o erro "StatusConflict" aparece ao executar odps tunnel recordWriter.close() após enviar 80 milhões de registros de uma vez?
-
Sintoma
Ao carregar 80 milhões de registros simultaneamente, o comando odps tunnel recordWriter.close() retorna este erro:
ErrorCode=StatusConflict, ErrorMessage=You cannot complete the specified operation under the current upload or download status. -
Causas
A sessão encontra-se em um estado inválido porque uma operação anterior já a fechou ou realizou o commit.
-
Solução
Crie uma nova sessão e refaça o upload dos dados. Cada partição exige uma sessão distinta. Se o erro for provocado por múltiplos commits, verifique primeiro se os dados foram carregados com sucesso. Em caso de falha, repita a operação. Para mais detalhes, consulte Exemplo de upload multithread.
De que forma o TunnelBufferedWriter evita falhas em uploads de dados em lote com o Tunnel SDK?
A partir da versão 0.21.3-public, o MaxCompute Java SDK passou a incluir o BufferedWriter SDK, que simplifica o envio de dados e oferece tolerância a falhas. Na prática, basta abrir um writer na sessão e começar a gravar os registros. Internamente, o BufferedWriter armazena os registros em um buffer no lado do cliente e, quando esse buffer atinge a capacidade máxima, abre uma conexão HTTP para transmitir os dados.
O BufferedWriter foi projetado para tolerar falhas e garantir o sucesso dos uploads. Para saber mais, veja TunnelBufferedWriter.
Como solucionar o erro "You need to specify a partitionspec along with the specified table" ao baixar dados com o Tunnel SDK?
-
Sintoma
Ao tentar baixar dados de uma tabela particionada via Tunnel SDK, o seguinte erro é retornado:
ErrorCode=MissingPartitionSpec, ErrorMessage=You need to specify a partitionspec along with the specified table. -
Causa
Para baixar dados de uma tabela particionada com o Tunnel SDK, é obrigatório informar os valores das colunas chave de partição. A ausência dessas informações gera erro.
-
Solução
Se utilizar a linha de comando do Tunnel na ferramenta de cliente do MaxCompute para exportar dados, saiba que ela permite exportar toda a tabela particionada. Os arquivos serão salvos em uma pasta.
-
Caso prefira usar o Tunnel SDK para a exportação, obtenha primeiro todas as partições da tabela por meio do SDK. Veja um exemplo de comando abaixo:
odps.tables().get(tablename) t.getPartitions()
Quais linguagens de programação o MaxCompute Tunnel SDK suporta?
Atualmente, o MaxCompute Tunnel oferece suporte ao Java SDK.
É permitido reutilizar um BlockId?
Não é possível reutilizar BlockIds dentro da mesma UploadSession. Em uma única sessão, após abrir um RecordWriter com determinado BlockId, gravar um lote de dados e chamar close(), o mesmo identificador não serve para abrir outro RecordWriter. Por padrão, o limite é de 20.000 blocos, com IDs variando de 0 a 19.999.
Existe um limite de tamanho para um bloco?
O tamanho padrão de um bloco de dados enviado ao Tunnel é de 100 MiB, sendo o máximo de 100 GB por bloco. Para volumes superiores a 64 MB, garanta que cada bloco corresponda a um único arquivo. Arquivos menores que 64 MB são considerados pequenos arquivos, e o acúmulo deles prejudica o desempenho. Em cenários de upload contínuo de grandes volumes, defina o tamanho do bloco entre 64 MB e 256 MB. Já para uploads diários em lote, configure-o em torno de 1 GB.
O uso do novo BufferedWriter facilita os uploads e ajuda a prevenir problemas como a proliferação de pequenos arquivos. Consulte TunnelBufferedWriter para mais informações.
Como resolver um timeout de leitura/escrita ou uma IOException?
Durante o upload, cada 8 KB de dados escritos pelo Writer disparam uma ação de rede. Se nenhuma atividade de rede ocorrer por 120 segundos, o servidor encerra ativamente a conexão, tornando o Writer indisponível. Para prosseguir com a escrita, abra um novo Writer.
Recomendamos o uso do TunnelBufferedWriter.
No download, o Reader segue uma lógica semelhante: a conexão cai se não houver tráfego de rede por um período prolongado. Para evitar essa situação, mantenha o processo do Reader em execução contínua, sem intercalar chamadas a outras interfaces do sistema.