Por que usar o ClickHouse Cloud em vez do BigQuery?
Carregar dados do BigQuery para o ClickHouse Cloud
Conjunto de dados
post, vote, user, comment e badge registrados no Stack Overflow de 2008 até abril de 2024. O esquema do BigQuery para esses dados é mostrado abaixo:
Para os usuários que desejam carregar esse conjunto de dados em uma instância do BigQuery para testar as etapas de migração, fornecemos os dados dessas tabelas em formato Parquet em um GCS bucket, e os comandos DDL para criar e carregar as tabelas no BigQuery estão disponíveis aqui.
Migração de dados
- Carga inicial em massa com atualizações periódicas - Um conjunto de dados inicial precisa ser migrado junto com atualizações periódicas em intervalos definidos, por exemplo, diariamente. Aqui, as atualizações são feitas reenviando as linhas que foram alteradas, identificadas por uma coluna que possa ser usada para comparação (por exemplo, uma data). As exclusões são tratadas com uma recarga periódica completa do conjunto de dados.
- Replicação em tempo real ou CDC - Um conjunto de dados inicial precisa ser migrado. As alterações nesse conjunto de dados precisam ser refletidas no ClickHouse quase em tempo real, sendo aceitável apenas um atraso de alguns segundos. Na prática, isso é um processo de captura de dados de alteração (CDC), em que as tabelas no BigQuery precisam ser sincronizadas com o ClickHouse, ou seja, inserções, atualizações e exclusões na tabela do BigQuery precisam ser aplicadas a uma tabela equivalente no ClickHouse.
Carregamento em massa via Google Cloud Storage (GCS)
- Exporte as 7 tabelas para o GCS. Os comandos para isso estão disponíveis aqui.
-
Importe os dados para o ClickHouse Cloud. Para isso, podemos usar a função de tabela gcs. O DDL e as consultas de importação estão disponíveis aqui. Observe que, como uma instância do ClickHouse Cloud é composta por vários nós de processamento, em vez da função de tabela
gcs, estamos usando a função de tabela s3Cluster. Essa função também funciona com buckets do GCS e utiliza todos os nós de um serviço do ClickHouse Cloud para carregar os dados em paralelo.
- A funcionalidade de exportação do BigQuery oferece suporte a um filtro para exportar um subconjunto dos dados.
- O BigQuery oferece suporte à exportação nos formatos Parquet, Avro, JSON e CSV e a vários tipos de compressão — todos compatíveis com o ClickHouse.
- O GCS oferece suporte ao gerenciamento do ciclo de vida de objetos, permitindo que dados já exportados e importados para o ClickHouse sejam excluídos após um período especificado.
- O Google permite exportar até 50 TB por dia para o GCS gratuitamente. Os usuários pagam apenas pelo armazenamento no GCS.
- As exportações geram vários arquivos automaticamente, limitando cada um a no máximo 1 GB de dados da tabela. Isso é benéfico para o ClickHouse, pois permite paralelizar as importações.
Replicação em tempo real ou CDC por meio de consultas agendadas
Projetando esquemas
posts. O esquema do BigQuery correspondente é mostrado abaixo:
Otimizando tipos
INSERT INTO SELECT simples, lendo os dados exportados do gcs com a função de tabela gcs. Observe que, no ClickHouse Cloud, você também pode usar a função de tabela s3Cluster, compatível com gcs, para paralelizar o carregamento em vários nós:
insert acima os converte implicitamente nos valores padrão dos respectivos tipos - 0 para inteiros e string vazia para strings. O ClickHouse também converte automaticamente qualquer valor numérico para a precisão de destino.
Como as chaves primárias do ClickHouse são diferentes?
- Eficiência de memória e de disco é fundamental na escala em que o ClickHouse costuma ser usado. Os dados são gravados nas tabelas do ClickHouse em fragmentos chamados partes, com regras aplicadas para mesclar essas partes em segundo plano. No ClickHouse, cada parte tem seu próprio índice primário. Quando as partes são mescladas, os índices primários da parte resultante também são mesclados. Observe que esses índices não são criados para cada linha. Em vez disso, o índice primário de uma parte tem uma entrada de índice por grupo de linhas — essa técnica é chamada de indexação esparsa.
- A indexação esparsa é possível porque o ClickHouse armazena em disco as linhas de uma parte ordenadas por uma chave especificada. Em vez de localizar diretamente linhas individuais (como um índice baseado em B-Tree), o índice primário esparso permite identificar rapidamente (por meio de uma busca binária nas entradas do índice) grupos de linhas que podem corresponder à consulta. Os grupos localizados de linhas potencialmente correspondentes são então transmitidos em paralelo para o engine do ClickHouse a fim de encontrar as correspondências. Esse projeto de índice permite que o índice primário seja pequeno (cabendo inteiramente na memória principal) e, ainda assim, acelere significativamente o tempo de execução das consultas, especialmente em consultas de intervalo, típicas de casos de uso de análise de dados. Para mais detalhes, recomendamos este guia detalhado.
Todas as colunas de uma tabela serão ordenadas com base no valor da chave de ordenação especificada, independentemente de estarem incluídas na própria chave. Por exemplo, seCreationDatefor usada como chave, a ordem dos valores em todas as outras colunas corresponderá à ordem dos valores na colunaCreationDate. É possível especificar várias chaves de ordenação — isso ordenará os dados com a mesma semântica de uma cláusulaORDER BYem uma consultaSELECT.
Escolhendo uma chave de ordenação
Técnicas de modelagem de dados
Partições
PARTITION BY. Essa cláusula pode conter uma expressão SQL sobre qualquer coluna, e o resultado dela definirá para qual partição uma linha será enviada.
As partes de dados são associadas logicamente a cada partição no disco e podem ser consultadas de forma isolada. No exemplo abaixo, particionamos a tabela posts por ano usando a expressão toYear(CreationDate). À medida que linhas são inseridas no ClickHouse, essa expressão é avaliada para cada linha — e então as linhas são direcionadas para a partição resultante na forma de novas partes de dados pertencentes a essa partição.
Aplicações
- Gerenciamento de dados - No ClickHouse, você deve considerar o particionamento principalmente como um recurso de gerenciamento de dados, e não como uma técnica de otimização de consultas. Ao separar os dados logicamente com base em uma chave, cada partição pode ser gerenciada de forma independente, por exemplo, sendo excluída. Isso permite mover partições e, assim, subconjuntos entre camadas de armazenamento de forma eficiente com base no tempo ou expirar dados/excluí-los com eficiência do cluster. No exemplo abaixo, removemos posts de 2008:
- Otimização de consultas - Embora as partições possam ajudar no desempenho das consultas, isso depende muito dos padrões de acesso. Se as consultas atingirem apenas algumas partições (idealmente uma só), o desempenho pode melhorar. Em geral, isso só é útil se a chave de particionamento não estiver na chave primária e você estiver filtrando por ela. No entanto, consultas que precisam abranger muitas partições podem ter desempenho pior do que sem particionamento (já que o particionamento pode resultar em mais partes). O benefício de atingir uma única partição será ainda menos perceptível — ou até inexistente — se a chave de particionamento já aparecer no início da chave primária. O particionamento também pode ser usado para otimizar consultas
GROUP BYse os valores em cada partição forem únicos. No entanto, em geral, você deve garantir que a chave primária esteja otimizada e só considerar o particionamento como técnica de otimização de consultas em casos excepcionais, quando os padrões de acesso se concentram em um subconjunto específico e previsível dos dados, por exemplo, particionamento por dia, com a maioria das consultas voltada para o último dia.
Recomendações
ORDER BY.
Internamente, o ClickHouse cria partes para os dados inseridos. À medida que mais dados são inseridos, o número de partes aumenta. Para evitar um número excessivamente alto de partes, o que degradará o desempenho da consulta (porque há mais arquivos para ler), as partes são mescladas em um processo assíncrono em segundo plano. Se o número de partes exceder um limite pré-configurado, o ClickHouse lançará uma exceção durante a inserção na forma de um erro de “partes em excesso”. Isso não deve acontecer em condições normais de operação e só ocorre se o ClickHouse estiver mal configurado ou sendo usado incorretamente, por exemplo, com muitas inserções pequenas. Como as partes são criadas isoladamente por partição, aumentar o número de partições faz com que o número de partes também aumente; ou seja, ele é um múltiplo do número de partições. Portanto, chaves de particionamento de alta cardinalidade podem causar esse erro e devem ser evitadas.
Visões materializadas vs projeções
ORDER BY para uma tabela.
Em modelagem de dados do ClickHouse, exploramos como visões materializadas podem ser usadas
no ClickHouse para pré-calcular agregações, transformar linhas e otimizar consultas
para diferentes padrões de acesso. Neste último caso, fornecemos um exemplo em que
a visão materializada envia linhas para uma tabela de destino com uma chave de ordenação diferente
da tabela original que recebe inserções.
Por exemplo, considere a seguinte consulta:
UserId
não é a chave de ordenação. Anteriormente, resolvemos isso usando uma visão materializada
que atuava como uma forma de consulta para o PostId. O mesmo problema pode ser resolvido com uma projeção.
O comando abaixo adiciona uma projeção com ORDER BY user_id.
ALTER, a criação será assíncrona
quando o comando MATERIALIZE PROJECTION for executado. Você pode acompanhar o andamento
dessa operação com a consulta a seguir, aguardando is_done=1.
EXPLAIN, também confirmamos que a projeção foi usada para processar esta consulta:
Quando usar projeções
- É necessária uma reordenação completa dos dados. Embora a expressão na projeção possa, em teoria, usar um
GROUP BY,as visões materializadas são mais eficazes para manter agregações. O otimizador de consultas também tende a aproveitar mais projeções que usam uma reordenação simples, ou seja,SELECT * ORDER BY x. Você pode selecionar um subconjunto de colunas nessa expressão para reduzir o uso de armazenamento. - Os usuários estiverem confortáveis com o aumento associado no uso de armazenamento e com a sobrecarga de gravar os dados duas vezes. Teste o impacto na velocidade de inserção e avalie a sobrecarga de armazenamento.
Reescrevendo consultas do BigQuery no ClickHouse
ClickHouse
Funções de agregação
argMax para calcular a pergunta mais visualizada de cada ano.
BigQuery
ClickHouse
Condicionais e arrays
HAVING e SELECT.
BigQuery
ClickHouse