Tutorial do Apache Sqoop: ArchiTextura, comandos e exemplo

โšก Resumo Inteligente

O Apache Sqoop move grandes volumes de dados entre bancos de dados relacionais e o HDFS usando uma arquitetura de conectores, gerando trabalhos MapReduce que importam tabelas para o Hive ou HBase e exportam os resultados processados โ€‹โ€‹de volta para o sistema de origem.

  • ๐Ÿ”˜ Definiรงรฃo: O Sqoop transfere dados em massa entre armazenamentos estruturados e o HDFS por meio de uma camada de conectores baseada em plugins.
  • โ˜‘๏ธ Architextura: Cada tarefa รฉ compilada em um programa MapReduce somente de mapeamento, cujas tarefas extraem fatias separadas da tabela em paralelo.
  • โœ… Conectores: Capa para motorista incluรญda MySQL, PostgreSQL, OracleSQL Server e DB2, alรฉm de uma alternativa genรฉrica JDBC.
  • ๐Ÿงช comandos: A ferramenta de importaรงรฃo extrai uma tabela para o HDFS, Hive ou HBase; a ferramenta de exportaรงรฃo envia os arquivos processados โ€‹โ€‹de volta para uma tabela.
  • ๐Ÿ› ๏ธ Modos de carregamento: O carregamento completo copia uma tabela inteira, enquanto os modos incrementais append e lastmodified buscam apenas as novas linhas.
  • โš ๏ธ Estado do projeto: Sqoop foi aposentado e enviado para o sรณtรฃo Apache em julho de 2021. Spark JDBC e NiFi agora suportam novos pipelines.

Tutorial do Apache Sqoop abordando arquitetura, conectores e comandos de importaรงรฃo e exportaรงรฃo.

O que รฉ SQOOP no Hadoop?

Apache SqoopName (SQL-to-Hadoop) รฉ uma ferramenta projetada para suportar a exportaรงรฃo e importaรงรฃo em massa de dados para HDFS A partir de armazenamentos de dados estruturados, como bancos de dados relacionais, data warehouses corporativos e sistemas NoSQL. ร‰ uma ferramenta de migraรงรฃo de dados baseada em uma arquitetura de conectores que suporta plugins para fornecer conectividade a novos sistemas externos.

Um exemplo de caso de uso do Hadoop Sqoop รฉ uma empresa que executa uma importaรงรฃo noturna do Sqoop para carregar os dados do dia de um RDBMS transacional de produรงรฃo em um Colmรฉia armazรฉm de dados para anรกlise posterior.

A seguir neste tutorial do Apache Sqoop, aprenderemos sobre a arquitetura Apache Sqoop.

Sqoop Archiarquitetura

Todos os existentes Sistemas de Gerenciamento de Banco de Dados sรฃo projetados com SQL padrรฃo em mente. No entanto, cada SGBD difere atรฉ certo ponto em relaรงรฃo ao dialeto. Portanto, esta diferenรงa coloca desafios quando se trata de transferรชncias de dados entre sistemas. Os conectores Sqoop sรฃo componentes que ajudam a superar esses desafios.

A transferรชncia de dados entre o Sqoop Hadoop e o sistema de armazenamento externo รฉ possรญvel com a ajuda dos conectores do Sqoop.

Sqoop possui conectores para trabalhar com uma variedade de bancos de dados relacionais populares, incluindo MySQL, PostgreSQL, Oracle, SQL Server e DB2. Cada um desses conectores sabe como interagir com seu SGBD associado. Hรก tambรฉm um conector JDBC genรฉrico para conexรฃo com qualquer banco de dados que suporte Javaprotocolo JDBC do Sqoop. Alรฉm disso, o Sqoop tambรฉm fornece otimizaรงรฃo para o protocolo JDBC. MySQL e PostgreSQL conectores que usam APIs especรญficas de banco de dados para realizar transferรชncias em massa com eficiรชncia.

O diagrama abaixo posiciona o cliente Sqoop entre o armazenamento de dados externo e o cluster Hadoop, com a camada de conexรฃo de um lado e o HDFS, o Hive e o HBase do outro.

Diagrama da arquitetura do Sqoop mostrando a camada de conexรฃo que liga um SGBD relacional a um cluster Hadoop.

Abaixo da camada de conectores, o Sqoop gera um Java Classe que espelha uma linha da tabela e entรฃo submete um mapa. MapaReduzir trabalho. Cada tarefa de mapeamento lรช sua prรณpria fatia do intervalo da coluna dividida, portanto, a taxa de transferรชncia รฉ proporcional ao nรบmero de mapeadores, em vez de ser proporcional a um รบnico cursor JDBC.

Alรฉm disso, o Sqoop possui diversos conectores de terceiros para armazenamento de dados, desde soluรงรตes corporativas atรฉ soluรงรตes de ponta. armazรฉns de dados (incluindo Netezza, Teradata e Oracle) para armazenamentos NoSQL (como Couchbase). No entanto, esses conectores nรฃo vรชm com o pacote Sqoop; eles precisam ser baixados separadamente e podem ser facilmente adicionados a uma instalaรงรฃo existente do Sqoop.

Por que precisamos do Sqoop?

O processamento analรญtico usando Hadoop requer o carregamento de grandes quantidades de dados de diversas fontes em clusters Hadoop. Esse processo de carregamento de dados em massa no Hadoop, a partir de fontes heterogรชneas e posterior processamento, apresenta um certo conjunto de desafios. Manter e garantir a consistรชncia dos dados e garantir a utilizaรงรฃo eficiente dos recursos sรฃo alguns fatores a serem considerados antes de selecionar a abordagem certa para o carregamento de dados.

Problemas maiores:

  1. Carregamento de dados usando scripts โ€” A abordagem tradicional de usar scripts para carregar dados nรฃo รฉ adequada para carregamento em massa de dados no Hadoop; essa abordagem รฉ ineficiente e consome muito tempo.
  2. Acesso direto a dados externos por meio de uma aplicaรงรฃo MapReduce. โ€” Fornecer acesso direto aos dados residentes em sistemas externos (sem carregรก-los no Hadoop) para aplicaรงรตes MapReduce complica essas aplicaรงรตes. Portanto, essa abordagem nรฃo รฉ viรกvel.

Alรฉm de ter a capacidade de trabalhar com enormes volumes de dados, o Hadoop pode lidar com dados em diversos formatos diferentes. Portanto, para carregar esses dados heterogรชneos no Hadoop, foram desenvolvidas diversas ferramentas. Sqoop e Calha sรฃo duas dessas ferramentas de carregamento de dados.

A seguir neste tutorial do Sqoop com exemplos, aprenderemos sobre a diferenรงa entre Sqoop, Flume e HDFS.

Sqoop vs Flume vs HDFS no Hadoop

Sqoop Calha HDFS
Sqoop รฉ usado para importar dados de fontes de dados estruturados, como RDBMS. Flume รฉ usado para mover dados de streaming em massa para HDFS. HDFS รฉ um sistema de arquivos distribuรญdo usado pelo ecossistema Hadoop para armazenar dados.
Sqoop possui uma arquitetura baseada em conector. Os conectores sabem como se conectar ร  respectiva fonte de dados e buscar os dados. Flume possui uma arquitetura baseada em agente. Aqui, รฉ escrito um cรณdigo (que รฉ chamado de 'agente') que se encarrega de buscar os dados. O HDFS possui uma arquitetura distribuรญda onde os dados sรฃo distribuรญdos entre vรกrios nรณs de dados.
HDFS รฉ um destino para importaรงรฃo de dados usando Sqoop. Os dados fluem para o HDFS atravรฉs de zero ou mais canais. HDFS รฉ o destino final para armazenamento de dados.
O carregamento de dados do Sqoop nรฃo รฉ orientado a eventos. O carregamento de dados do Flume pode ser acionado por um evento. O HDFS apenas armazena os dados fornecidos por qualquer meio.
Para importar dados de fontes de dados estruturados, รฉ necessรกrio usar apenas comandos Sqoop, pois seus conectores sabem como interagir com fontes de dados estruturados e buscar dados delas. Para carregar dados de streaming, como tweets gerados no Twitter ou arquivos de log de um servidor web, deve-se utilizar o Flume. Os agentes Flume sรฃo criados para buscar dados de streaming. O HDFS possui comandos de shell integrados para armazenar dados. O HDFS nรฃo consegue importar dados de streaming.

Principais caracterรญsticas do Sqoop

A comparaรงรฃo acima explica a qual categoria o Sqoop se encaixa. O conjunto de recursos abaixo determina se ele รฉ adequado para uma tarefa especรญfica de ingestรฃo de dados.

  • Carga mรกxima: Um รบnico comando copia uma tabela inteira, e import-all-tables Copia todas as tabelas de um esquema em uma รบnica passagem.
  • Carga incremental: append modo tracks รฉ uma coluna monotonicamente crescente, como uma chave substituta, enquanto lastmodified modo tracks รฉ uma coluna de registro de data e hora, portanto, apenas as linhas novas ou alteradas sรฃo transmitidas.
  • Transferรชncia paralela: A coluna de divisรฃo divide o intervalo de chaves entre as tarefas de mapeamento, e a contagem de mapeadores define quantas tarefas sรฃo executadas simultaneamente.
  • Importaรงรฃo de consultas de formato livre: O resultado de uma instruรงรฃo SQL arbitrรกria pode ser importado em vez de uma tabela inteira, mantendo as junรงรตes e filtros no lado do banco de dados.
  • Carregamento direto no armazรฉm: Uma importaรงรฃo pode criar e preencher um Colmรฉia tabela ou escreva diretamente em uma tabela HBase em vez de pararping em arquivos HDFS brutos.
  • Compressรฃo e formatos de arquivo: A saรญda pode ser gravada como texto delimitado, SequenceFile, Avro ou Parquet, com compressรฃo opcional em nรญvel de codec.
  • Seguranรงa: O Sqoop integra-se com o Kerberos, e as credenciais podem ser lidas de um arquivo de senhas ou solicitadas em vez de serem digitadas na linha de comando.

Comandos de importaรงรฃo e exportaรงรฃo do Sqoop

Ambas as direรงรตes da transferรชncia sรฃo executadas por meio de um รบnico utilitรกrio de linha de comando. A ferramenta de importaรงรฃo move linhas do banco de dados para o Hadoop, e a ferramenta de exportaรงรฃo move arquivos do Hadoop de volta para uma tabela do banco de dados.

Uma importaรงรฃo tรญpica especifica a conexรฃo JDBC, a tabela de origem, o diretรณrio de destino, a coluna de divisรฃo e a contagem de mapeadores:

sqoop import \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employees \
  --target-dir /user/hadoop/warehouse/employees \
  --split-by emp_no \
  --num-mappers 4

Uma exportaรงรฃo inverte o fluxo. Ela lรช os arquivos delimitados que jรก estรฃo em um diretรณrio HDFS e os insere em uma tabela existente; portanto, a tabela de destino precisa ser criada primeiro:

sqoop export \
  --connect jdbc:mysql://localhost:3306/employees \
  --username hadoop \
  --password-file /user/hadoop/.mysql.password \
  --table employee_summary \
  --export-dir /user/hadoop/warehouse/employee_summary \
  --input-fields-terminated-by ','

Uma tarefa noturna raramente precisa da tabela inteira duas vezes. Uma importaรงรฃo incremental registra o maior valor jรก visto e comeรงa a partir daรญ na prรณxima execuรงรฃo.

sqoop import \
  --connect jdbc:mysql://localhost:3306/sales \
  --table orders \
  --incremental append \
  --check-column order_id \
  --last-value 15000 \
  --target-dir /user/hadoop/warehouse/orders

Esses sรฃo os argumentos que aparecem em quase todas as vagas de emprego:

Argumento O que ele controla
--connect JDBC URL da base de dados de origem ou de destino.
--table Tabela que รฉ lida em uma importaรงรฃo ou gravada em uma exportaรงรฃo.
--target-dir Diretรณrio HDFS que receberรก a importaรงรฃo. Ele nรฃo deve existir previamente.
--export-dir Diretรณrio HDFS cujos arquivos sรฃo lidos por uma exportaรงรฃo.
--split-by Coluna cujo intervalo รฉ dividido entre tarefas de mapeamento.
--num-mappers (-m) Nรบmero de tarefas de mapeamento paralelas. O padrรฃo รฉ quatro.
--incremental Selecione% s append or lastmodified alterar tracrei.
--hive-import Cria a tabela Hive correspondente e carrega os dados importados nela.

โš ๏ธ Atenรงรฃo: Uma exportaรงรฃo nรฃo รฉ uma transaรงรฃo รบnica. Cada tarefa de mapeamento confirma seu prรณprio lote, portanto, uma falha no meio do processo pode deixar parte dos dados na tabela de destino. Direcione a gravaรงรฃo por meio de uma tabela de preparaรงรฃo quando a carga precisar ser do tipo "tudo ou nada".

Situaรงรฃo Atual do Projeto Sqoop e Alternativas Modernas

Um detalhe da versรฃo รฉ importante antes que qualquer um dos comandos acima seja inserido no agendador.

Os desenvolvedores do Sqoop votaram pelo encerramento do projeto em junho de 2021, e a mudanรงa para o Sรณtรฃo Apache Concluรญdo em julho de 2021. O site, as listas de discussรฃo, o repositรณrio git e a ediรงรฃo estรฃo disponรญveis. tracOs arquivos ker e downloads continuam disponรญveis, mas em modo somente leitura, e nรฃo hรก planos para novos lanรงamentos. A รบltima versรฃo de produรงรฃo foi o Sqoop 1.4.7, de 2017; a linha separada do Sqoop 2 (1.99.x) nunca atingiu a paridade de recursos e nunca foi declarada pronta para produรงรฃo.

Os trabalhos existentes do Sqoop ainda sรฃo executados, e as distribuiรงรตes comerciais do Hadoop continuam a fornecer e a dar suporte ร  ferramenta em suas prรณprias plataformas. No entanto, novos trabalhos de ingestรฃo geralmente sรฃo baseados em uma destas alternativas:

Alternative Melhor ajuste
Spark com a fonte de dados JDBC tabela de lotes extracts que jรก estรฃo dentro de um Spark pipeline, com leituras particionadas em vez de mapeadores.
Apache NiFiName Roteamento baseado em fluxo e configurado visualmente entre diversos sistemas heterogรชneos.
Kafka Connect com um conector CDC Captura contรญnua de dados de alteraรงรตes em vez de uma janela de lote noturna.
Plataformas ETL gerenciadas, como Talend Conectores prรฉ-configurados, agendamento e linhagem sem necessidade de escrever tarefas manualmente.

Perguntas Frequentes

O Sqoop 1 รฉ o รบnico cliente de linha de comando usado em todos os tutoriais. O Sqoop 2 adicionou um servidor, uma API REST e uma interface web, mas nunca atingiu a paridade de recursos e nunca foi considerado pronto para produรงรฃo, entรฃo a linha 1.4.x permaneceu como padrรฃo.

Os modelos analisam o perfil das tabelas de origem para inferir tipos, chaves e colunas de divisรฃo, sugerem limites de partiรงรฃo a partir da distribuiรงรฃo de linhas e sinalizam desvios de esquema antes que uma carga seja interrompida. Eles tambรฉm propรตem colunas de verificaรงรฃo incrementais ao identificar comportamentos monotรดnicos ou de carimbo de data/hora em dados de amostra.

O Copilot cria rapidamente a estrutura bรกsica dos argumentos, mas mistura a sintaxe do Sqoop 1 e do Sqoop 2 e inventa flags que nenhuma versรฃo aceita. Verifique cada argumento no Guia do Usuรกrio do Sqoop para a versรฃo instalada antes de agendar a tarefa.

O Sqoop nรฃo consegue selecionar uma coluna de divisรฃo automaticamente e a importaรงรฃo falha. Vocรช pode especificar explicitamente uma coluna numรฉrica ou de data adequada como coluna de divisรฃo ou forรงar uma รบnica tarefa de mapeamento, que serializa a transferรชncia.

A senha digitada na linha de comando fica visรญvel para qualquer pessoa que esteja listando os processos. Armazene-a em um arquivo HDFS legรญvel apenas pelo proprietรกrio da tarefa e aponte o argumento `password-file` para ele, ou use o prompt interativo.

O texto delimitado รฉ o padrรฃo. Os formatos SequenceFile, Avro e Parquet tambรฉm sรฃo suportados, cada um selecionado por seu prรณprio argumento. O formato Parquet colunar รฉ adequado para consultas analรญticas posteriores, enquanto o texto delimitado permanece o mais simples para inspeรงรฃo e para exportaรงรฃo.

Quatro รฉ o padrรฃo e um ponto de partida razoรกvel. Mais mapeadores significam mais conexรตes simultรขneas com o banco de dados, portanto, o limite prรกtico รฉ o que o servidor de origem tolera, e nรฃo o que o cluster Hadoop consegue agendar.

A Java tempo de execuรงรฃo, um configurado Hadoop ร‰ necessรกrio um cliente que consiga acessar o cluster e o arquivo JAR do driver JDBC para o banco de dados de destino, localizado no diretรณrio da biblioteca do Sqoop. A ausรชncia dos arquivos JAR do driver รฉ a causa mais comum de falha na primeira execuรงรฃo.

Resuma esta postagem com: