A integração de dados do DataWorks oferece suporte à sincronização de dados de alto desempenho entre fontes heterogêneas por meio do formato de armazenamento em colunas Apache Arrow. Essa solução utiliza transferência direta em memória e tecnologia zero-copy para converter a transferência de dados de um modelo baseado em linhas para um baseado em colunas, aumentando significativamente o throughput de sincronização para grandes volumes de dados. Em cenários de teste, o desempenho pode aumentar quase 10 vezes.
Casos de uso
Ao processar grandes volumes de dados, soluções de sincronização baseadas em armazenamento em linhas frequentemente enfrentam gargalos de desempenho. Tais gargalos resultam de serializações, desserializações e conversões de tipo frequentes. Esse problema é particularmente crítico durante migrações de data warehouse, como de Hive para MaxCompute, ou na construção de arquiteturas de data lakehouse. Tempos prolongados de sincronização para terabytes de dados podem comprometer o lançamento de service e a eficiência da análise de dados. Esta solução resolve a ineficiência no encaminhamento de dados entre source de armazenamento em colunas de grande escala e reduz o tempo de sincronização de horas para minutos.
Cenário 1: Migração de big data
Desafio: Migrar centenas de terabytes de dados do Hive para o MaxCompute consome muito tempo e atrasa o lançamento de service.Solução: Ative a sincronização Arrow para transferência direta em formato colunar e evite conversões de formato.Resultado: O tempo de migração cai de horas para minutos, elevando a eficiência em mais de 10 vezes.
Cenário 2: Integração de source de dados heterogêneas e arquitetura de data lakehouse
Os dados fluem de forma livre e eficiente entre o data lake (como o ecossistema Hive) e o data warehouse (Hologres/MaxCompute). O valor central reside no uso de uma única cópia dos dados para múltiplas finalidades, viabilizando a sinergia entre lake e warehouse.
Arquitetura da solução
A integração de dados do DataWorks incorpora o padrão Apache Arrow para armazenamento colunar em memória. Ela refatora o método de transferência de dados entre o Reader e o Writer e altera o processo de um tratamento baseado em linhas para uma passagem direta baseada em colunas.
Arquitetura tradicional de sincronização com armazenamento em linhas
Na arquitetura tradicional, o processamento dos dados ocorre linha a linha. Mesmo quando origem e destino utilizam formato de armazenamento em colunas, como Parquet ou ORC, os dados são convertidos em objetos Record genéricos baseados em linhas dentro do mecanismo de sincronização. Esse formato foi projetado para armazenamento de linhas individuais. Cada objeto Record define várias Columns, e cada Column contém o Value correspondente àquela coluna na linha atual. Considere, por exemplo, a sincronização de dados em formato colunar do MaxCompute (ODPS) para o MaxCompute (ODPS):
Esse processo envolve as etapas abaixo e gera a seguinte sobrecarga de desempenho:
Decodificação pelo Reader: O Reader lê os dados em formato colunar da source, como o MaxCompute. Em seguida, decodifica esses dados e os converte, linha por linha, em objetos
Recordinternos do framework.Transferência pelo framework: O framework transfere uma grande quantidade de objetos
Recordna fila de memória.Codificação pelo Writer: O Writer recupera os objetos
Recorddo framework, codifica-os no formato de armazenamento em colunas exigido pelo destino e grava os dados.
Esse fluxo exige múltiplas conversões de formato de dados, serialização e desserialização, além de criação frequente de objetos. Como consequência, há alto consumo de recursos de CPU e memória, coleta de lixo (GC) recorrente e limitação do throughput geral.
Arquitetura de sincronização com armazenamento em colunas Arrow
A nova arquitetura baseada em Arrow implementa um fluxo de dados colunar ponta a ponta. Os dados mantêm seu formato de armazenamento em colunas ao longo de todo o pipeline de sincronização, eliminando a sobrecarga da conversão baseada em linhas.
Com a introdução da estrutura de dados ArrowTabularRecord, o processo de sincronização é otimizado da seguinte forma:
Leitura direta pelo Reader: O Reader utiliza a API Tunnel Arrow do MaxCompute para ler diretamente os dados em formato colunar da source. Depois, encapsula esses dados em objetos
ArrowTabularRecorde os entrega ao framework em lotes.Transferência pelo framework: O framework transmite diretamente os objetos
ArrowTabularRecord, que contêm dados binários em formato colunar.Gravação direta pelo Writer: O Writer usa a API Tunnel Arrow para recuperar dados binários formatados em Arrow diretamente do
ArrowTabularRecorde emprega tecnologia zero-copy para transferi-los ao destino, como um Tunnel Server, sem nova serialização.
Essa arquitetura fornece suporte nativo ao Arrow e elimina a etapa intermediária de conversão baseada em linhas. Assim, alcança-se uma "sincronização em curto-circuito" ponta a ponta para armazenamentos em colunas, o que aumenta expressivamente o throughput e reduz a latência.
Etapas de implementação
Adicione parâmetros específicos a uma tarefa de integração de dados do DataWorks para ativar a sincronização Arrow de alto desempenho. Atualmente, esse recurso é compatível com tarefas de sincronização offline de banco de dados completo e de tabela única nas quais a source e o destino são MaxCompute, Hologres ou Hive/OSS/Hadoop Distributed File System (HDFS) (Parquet/ORC).
Método 1: Sincronização offline de banco de dados completo
Utilize o recurso full-database offline synchronization task de integração de dados. Por exemplo, em uma sincronização offline do Hive para o MaxCompute, o sistema detecta automaticamente os tipos de campo das tabelas de origem e destino e ativa a sincronização Arrow de alto desempenho. Nenhuma configuração manual é necessária. Visualize essa configuração em no canto superior direito do editor de tarefas.
No Runtime Config, localize o parâmetro Enable Arrow short-circuit transfer. As opções disponíveis são Auto (padrão), Force enable e Force disable.
Método 2: Sincronização offline de tabela única
Ao configurar uma tarefa de sincronização offline de tabela única, ative manualmente o recurso no code editor. Para isso, adicione "useArrow": true à configuração de parameter tanto do Reader quanto do Writer.
Pré-requisito: Para ativar esse recurso, as definições de tipos de coluna das tabelas de origem e destino devem ser idênticas. Isso ocorre porque esse modo ignora a etapa de conversão de tipos e transfere os dados diretamente na memória.
Veja abaixo um exemplo de configuração para sincronizar dados do Hive (Reader) para o MaxCompute (Writer):
{
"type": "job",
"steps": [
{
"stepType": "hive",
"parameter": {
"useArrow": true,
"datasource": "my_datasource",
"column": [
"col1",
"col2"
],
"readMode": "hdfs",
"table": "table"
},
"name": "Reader",
"category": "reader"
},
{
"stepType": "odps",
"parameter": {
"useArrow": true,
"truncate": false,
"datasource": "odps_test",
"column": [
"col1",
"col2"
],
"table": "table"
},
"name": "Writer",
"category": "writer"
}
],
"setting": {
"speed": {
"concurrent": 3
}
}
}
Validação de desempenho
As seções a seguir apresentam a melhoria de desempenho para diversas combinações de source de dados. As condições de teste para validação de desempenho são:
Condições do teste de estresse: Especificações do servidor: 64 núcleos, 256 GB de memória. Placa de rede: 25 Gbit/s.
Volume de dados do teste: 42.045.700 registros.
|
Fonte de dados |
Recurso suportado |
Melhoria no desempenho de replicação |
|
MaxCompute |
Leitura direta de dados em formato colunar via API Tunnel Arrow |
Desempenho de replicação melhorou em 200% |
|
Hologres |
Suporte à exportação em formato Arrow para evitar gargalos baseados em linhas do Java Database Connectivity (JDBC) |
Desempenho de replicação melhorou em 95% |
|
Hive, OSS, HDFS e outros sistemas de arquivos distribuídos |
Leitura direta de dados subjacentes em formato Arrow a partir de Parquet/ORC |
Desempenho de sincronização PARQUET melhorou em 5,55 vezes. Desempenho de sincronização ORC melhorou em 9,85 vezes. |
Cenário 1: Sincronização em curto-circuito com armazenamento em colunas do MaxCompute (Arrow → Arrow)
|
Simultaneidade |
Armazenamento em linhas tradicional |
Armazenamento em colunas Arrow |
Melhoria de desempenho |
|
1 |
67,8 MB/s 3740 R/s |
212,6 MB/s 11462 R/s |
+206,5% |
|
3 |
185,6 MB/s 10226 R/s |
569,9 MB/s 30728 R/s |
+200,5% |
|
8 |
462,1 MB/s 25467 R/s |
1321,0 MB/s 71143 R/s |
+197,4% |
Cenário 2: Sincronização Hologres → MaxCompute
|
Simultaneidade |
Sincronização tradicional |
Sincronização Arrow |
Melhoria de desempenho |
|
4 |
439,1 MB/s 216480 R/s |
906,1 MB/s 404270 R/s |
+87% |
|
8 |
773,3 MB/s 381300 R/s |
1669,1 MB/s 745654 R/s |
+95% |
Cenário 3: Sincronização Parquet/ORC → MaxCompute
|
Formato de armazenamento em colunas |
Sincronização tradicional |
Sincronização Arrow |
Melhoria de desempenho |
|
Parquet |
26,1 MB/s 35631 R/s |
1198,1 MB/s 233587 R/s |
5,55 vezes |
|
ORC |
21,4 MB/s 27661 R/s |
3256,3 MB/s 300326 R/s |
9,85 vezes |
Parquet e ORC são formatos de armazenamento em colunas utilizados em sistemas de arquivos distribuídos, como HDFS e OSS.