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.
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.
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:
- 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.
- 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-tablesCopia todas as tabelas de um esquema em uma รบnica passagem. - Carga incremental:
appendmodo tracks รฉ uma coluna monotonicamente crescente, como uma chave substituta, enquantolastmodifiedmodo 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. |

