Apache Sqoop
Transferência de Dados

Antes de serem processados por um sistema de aprendizado de máquina, os dados precisam ser importados. Da mesma forma, precisam ser exportados para outras aplicações antes de usados externamente.
Um "engine" de transferência de dados habilita a movimentação "para" ou "de" dispositivos de armazenamento diferentes. O trabalho real de importação é feito pelos mecanismos de processamento, que executam os trabalhos de importação e, em seguida, persistem os dados importados no dispositivo de armazenamento.
Diferentemente de outros sistemas de processamento de dados, onde os dados de entrada estão em conformidade com um esquema e são quase sempre estruturados, os dados de origem dum sistema de "machine learning" pode incluir uma mistura de fontes e formatos.

Características do Apache Sqoop
O Apache Sqoop é uma ferramenta de linha de comando criada para viabilizar a transferência de dados "em massa" entre Apache Hadoop e datastores estruturados, como SGBD Relacionais.
A integração destes ambientes é o papel do Sqoop e sua principal finalidade é realizar a importação/exportação de dados entre o ambiente relacional e o Hadoop.
O dado armazenado em databases externos não pode ser acessado diretamente pelas aplicações MapReduce. Esta abordagem colocaria o sistema em nós dos Clusters em grande risco de estresse.
O Sqoop simplifica o carregamento de grandes quantidades de dados de RDBMS para o Hadoop, solucionando essa questão.
A maior parte do procedimento é automatizada pelo Sqoop, que depende da Base de Dados para especificar a estrutura de importação de dados. Ele importa e exporta dados usando a arquitetura MapReduce, que oferece uma abordagem paralela e tolerante a falhas.
O Sqoop graduou-se da incubadora em março de 2012, tornando-se um projeto de nível superior na Apache.
Algumas de suas características merecem destaque:
- Faz a leitura linha por linha da tabela ao escrever o ficheiro no HDFS.
- Realiza importação de dados e metadados de bancos relacionais direto para o Hive.
- Fornece um processamento paralelo e tolerante a falhas* ao usar o Map Reduce em atividades import/export.
- A ferramenta Sqoop usa a estrutura YARN para importar e exportar dados, tornando-se tolerante a falhas com paralelismo.
- Possibilidade de selecionar o intervalo de colunas a serem importadas.
- Possibilidade de especificar os delimitadores e formatos de ficheiros.
- Paraleliza conexões em Base de dados executando comando SQL como SELECT(import) e Insert/Update(export)
- O Padrão do ficheiro importado do HDFS é o CSV.
- Conversão de tipos de dados: O Sqoop importa tabelas individuais ou Databases inteiros para ficheiros em HDFS.
- Um conector JDBC genérico é fornecido para conexão com qualquer Base de Dados que suporte o padrão JDBC. Possui diversos plugins para conexão com PostgreSQL, Oracle, Teradata, Netezza, Vertica, DB2, SQL Server e MySQL.
- Cria classes java que permitem a interação de usuários com o dado importado.
Arquitetura do Apache Sqoop
Sqoop disponibiliza uma interface de linha de comando para usuários finais e também pode ser acessado pela API Java.
A migração de dados entre Sqoop Hadoop e um sistema externo de armazenamento é possível por meio dos conectores Sqoop, os quais o habilitam a usar várias bases de dados relacionais conhecidos como, por exemplo, o MySQL, PostgreSQL, Oracle, etc.
Cada uma destas conexões pode se comunicar com o DBMS ao qual está vinculada.
O que ocorre durante a execução do Sqoop é bem simples: O dataset transferido é dividido em várias porções e um job somente de Map é criado com mappers distintos encarregados de carregar cada partição. O Sqoop usa as informações da Base de Dados para deduzir os tipos de dados, manipulando cada registo de maneira segura.

O Sqoop é composto, assim, de duas operações principais:
-
Importação Sqoop
Procedimento realizado com o comando Sqoop import. Cada registo carregado no SGBD Hadoop como um único registo é mantido em ficheiros texto como parte da estrutura Hadoop. Ao importar dados, também é possível carregar e dividir o Hive. O Sqoop também permite a importação incremental de dados.
-
Exportação Sqoop
Facilita a execução da tarefa com auxilio do comando export, que realiza a operação no sentido contrário. Os dados são transferidos do sistema de ficheiros Hadoop para o SGBD Relacional. Antes de finalizar a operação, os dados exportados são transformados em registos.

-
Recursos do Apache Sqoop
- É possível importar os resultados de uma query SQL em HDFS com Sqoop.
- Oferece conectores para a maior parte dos RDBMS, como MySQL, Microsoft SQL Server, PostgreSQL, etc.
- Suporta protocolo de autenticação de rede Kerberos, permitindo que os nós autentiquem usuários enquanto se comunicam com segurança numa rede insegura.
- Com um único comando, o Sqoop pode recarregar a tabela inteira ou seções específicas da tabela.
Quando usar o Apache Sqoop
- Processamento de bases OLTP usando alguma ferramenta de Big Data.
- Integração de OLTP com Hadoop
- Ingestão de dados no Hadoop
Como funciona
O Comando inserido pelo usuário é analisado pelo Sqoop e executa o Hadoop Map apenas para importar ou exportar dados, pois a fase Reduce só é necessária quando as agregações são necessárias.
Sqoop analisa os argumentos inseridos na linha de comando e prepara a tarefa Map. Um trabalho de mapeamento que executa vários mapeadores depende do número definido pelo usuário na linha de comando.
Durante uma importação, cada tarefa do map recebe uma parte dos dados a serem importados com base na linha de comando.
Sqoop distribui os dados uniformemente entre os mapeadores para garantir alto desempenho.
Em seguida cada mapeador cria uma conexão com a Base de Dados JDBC.
Boas Práticas para Apache Sqoop
-
Importação para formato binário Embora as importações para o formato de ficheiros CSV sejam fáceis de testar, alguns problemas podem surgir quando o texto armazenado na Base de dados usa caracteres especiais. A importação para o formato binário, como o Avro evitará este problema e poderá tornar mais rápido o processamento no Hadoop.
-
Controlar o paralelismo Sqoop trabalha no modelo de programação MapReduce. Importa e exporta dados a partir da maior parte de databases relacionais em paralelo. O número de tarefas Map por job determina este paralelismo. Controlar o paralelismo permite lidar com a carga dos databases e também com sua performance. Existem duas formas de explorar o paralelismo no Sqoop:
-
Alterando o número de mappers Os trabalhos típicos do Sqoop iniciam quatro mappers por padrão. Para otimizar o desempenho, recomenda-se aumentar as tarefas do Map (processos paralelos) para um valor inteiro de 8 ou 16. Isto pode mostrar um aumento no desempenho em algumas bases de dados. Usando -m ou --num--mappers pode-se definir o grau de paralelismo no Sqoop.
Terminal inputSqoop import
--connect jdbc:postgresql://postgresql.example.com/sqoop
--username sqoop
--password sqoop
--table nome-da-tabela
--num-mappers 10 -
Dividindo por consulta Ao realizar importações paralelas, o Sqoop precisa dum critério para dividir a carga de trabalho. Ele usa uma coluna de divisão para dividir a carga de trabalho.
Por padrão, identificará a coluna de chave primária (se estiver presente) numa tabela e a usará como coluna de divisão.
Os valores baixo e alto para a coluna de divisão são recuperados da Base de dados e as tarefas de map operam em componentes de tamanho uniforme do intervalo total.
O parâmetro split-by divide os dados da coluna uniformemente com base no número de mappers especificados. A sintaxe split by é:
Terminal inputCopiar código
Sqoop import
--connect jdbc:postgresql://postgresql.example.com/nome-do-database
\--username nome-do-usuário
\--password senha
\--table nome-da-tabela
\--split-by campo_idwarningO número de tarefas map deve ser menor que o número máximo de conexões de databases paralelos possíveis. O incremento no grau de paralelismo deve ser menor que aquele disponível dentro de seu Cluster Map Reduce.
-
-
Controlo do Processo de transferência de dados: Um método popular de melhorar o desempenho é gerenciando o caminho onde importamos e exportamos dados. Resumimos abaixo alguns caminhos. Para ver os argumentos existentes, Pesquise as Tabelas "Table 3" e "Table 29" -> argumentos de controlo de importação/exportação, na Guia do Usuário:
-
Batch: (em lote) Que significa que as instruções SQL podem ser agrupadas num lote quando os dados são exportados.
noteA interface JDBC disponibiliza uma API para fazer lotes numa instrução preparada com vários conjuntos de valores. Essa API está presente em todos os drivers JDBC porque é exigida pela interface JDBC.
O lote é desabilitado por padrão no Sqoop. Habilite o lote JDBC usando o parâmetro batch.
Terminal inputsqoop export
-- connect jdbc: postgresql://postgresql.example.com/_nome-do-database_
\-- username _nome-do-usuário_
\-- password _senha_
\-- table _nome_tabela_
\-- export-dir /data/_nome-do-database_
\-- *batch* -
Tamanho de busca: O número padrão de registos que podem ser importados de uma única vez é 1.000. Isso pode ser alterado pelo parâmetro Fetch-size, usado para especificar o número de registos que o Sqoop pode importar por vez.
Terminal input-- connect jdbc: postgresql://postgresql.example.com/_nome-do-database_
\-- username _nome-do-usuário_
\-- password _senha_
\-- table _nome_tabela_
\-- fetch-size=n
*/} onde n representa o número de entradas que o Sqoop deve buscar por vez.Com base na memória e largura de banda disponíveis, o valor do parâmetro fetch-size pode ser aumentado em relação ao volume de dados que precisa ser lido.
-
Por padrão, o processo de importação Sqoop usa JDBC, que disponibiliza um suporte razoável. No entanto, algumas bases de dados podem obter maior desempenho usando utilitários específicos de bases de dados pois são otimizados para disponibilizar a melhor velocidade de transferência possível, colocando menos pressão sobre o servidor da Base de Dados .
Ao disponibilizar o argumento --direct, o Sqoop é forçado a tentar usar o canal de importação direta. Este canal pode ter um desempenho maior que usar o JDBC.
Terminal inputSqoop import
-- connect jdbc: postgresql://postgresql.example.com/_nome-do-database_
\-- username _nome-do-usuário_
\-- password _senha_
\-- table _nome_tabela_
\-- directwarningExistem várias limitações que companham essa importação mais rápida. Nem todas as bases de dados possuem utilitários nativos disponiveis e esse modo não está disponível para todas as bases de dados.
Sqoop tem suporte direto para MySQL e PostgreSQL.
Consultas de limite personalizados: Como já visto, o split by distribui uniformemente os dados para importação. Se a coluna tiver valores não uniformes, a consulta de limite pode ser usada se não obtivermos os resultados desejados ao usar apenas o arqumento split-by.
Idealmente, configuramos o parâmetro de consulta de limite como min(id) e max(id) juntamente com o nome da tabela.
Terminal inputSqoop import
-- connect jdbc: postgresql://postgresql.example.com/_nome-do-database_
\-- username _nome-do-usuário_
\-- password _senha_
\-- query 'SELECT... FROM... JOIN ... USING ... WHERE $CONDITIONS'
\-- split-by id
\-- target-dir _nome-da-tabela_
\-- boundary-query "selecionar min(id), max(id) de _nome-da-tabela-normalizada_" -
Detalhes do Projeto Apache Sqoop
Apache Sqoop foi desenvolvido em JAVA.

Fontes:
[Apache Sqoop](Apache Sqoop.org) [Blog Sqoop](Blogs Sqoop.org)