Apache Sqoop - Big Data Analytics

Ferramentas de big data analytics do ecossistema hadoop

O Apache Sqoop é uma ferramenta que intermedia o Hadoop file system e bancos relacionais (SGBDR)

Antes de começar, quero deixar meu link de afiliados na Hostinger, tá valendo a pena, dêem uma olhada: Hostinger

Dêem um joinha ? na página do Código Fluente no Facebook Facebook

Meu link de referidos na digitalocean pra vocês.

Quem se cadastrar por esse link, ganha $100.00 dólares de crédito na digitalocean:

Digital Ocean

Esse outro é da one.com:

One.com

Agora sim, vamos lá! :)

Os comandos a seguir anexam ( append )  informações em uma tabela ou diretório existente, senão existir ele cria. Customiza o número de threads (Num-Mappers) para duas thread e define o delimitador de campo como pipe ( | ) e o de linha como \n.

O out-dir é usado para armazenar alguns arquivos java internos do sqoop.

Ao usar o split-by, usar coluna indexada é altamente recomendado, se a coluna não estiver indexada, o desempenho será ruim por causa da varredura completa da tabela feita por cada uma das threads. Por isso a escolha do split ser pelo ID. sqoop import \ --connect "jdbc:mysql://localhost:3306/retail_db" \ --username=root \ --password=cloudera \ --table departments \ --target-dir /apps/hive/warehouse/retail_ods.db/departments \ --append \ --fields-terminated-by '|' \ --lines-terminated-by '\n' \ --num-mappers 2 \ --split-by department_id \ --outdir java_files O fields-terminated-by define como será o delimitador dos campos, no caso um pipe ( | ) e o lines-terminated-by define que as linhas terminam com \n. Ao importar para arquivos delimitados, a escolha do delimitador é importante. Delimitadores que aparecem dentro de campos baseados em string podem causar uma análise ambígua dos dados importados pelas etapas subsequentes de análise. Por exemplo, a string "Olá, é um prazer te conhecer" não deve ser importada com o delimitador de campo definido como uma vírgula. Delimitadores podem ser um caracter de escape também. Por exemplo:--fields-terminated-by \t. Nesse caso o delimitador é a tabulação.
Os caracteres de escape suportados são:
  • \b (backspace)
  • \n (newline)
  • \r (carriage return)
  • \t (tab)
  • \" (double-quote)
  • \\' (single-quote)
  • \\ (backslash)
  • \0 (NUL) - Insere caracteres NUL entre campos ou linhas, ou desabilita o enclosing/escaping  se usado por um dos argumentos --enclosed-by--optionally-enclosed-by, ou --escaped-by .
  • Pode ser usado representação octal de um caracter UTF-8.
    • Por exemplo, --fields-terminated-by \001 que produz o caracter  ^A.
  • Pode ser usado a representação hexadecimal de um caracter UTF-8.
    • Por exemplo, --fields-terminated-by \0x10 produz o caracter carriage return.

Agora vamos usar o where:

sqoop import \ --connect "jdbc:mysql://localhost:3306/retail_db" \ --username=root \ --password=cloudera \ --table departments \ --target-dir /apps/hive/warehouse/retail_ods.db/departments \ --append \ --fields-terminated-by '|' \ --lines-terminated-by '\n' \ --split-by department_id \ --where "department_id > 5" \ --outdir java_files O where tá restringindo os registros aos que tem ID maior que 5.

Você pode usar o argumento incremental para especificar o tipo de importação incremental a ser executada.

sqoop import \ --connect "jdbc:mysql://localhost:3306/retail_db" \ --username=root \ --password=cloudera \ --table departments \ --target-dir /apps/hive/warehouse/retail_ods.db/departments \ --append \ --fields-terminated-by '|' \ --lines-terminated-by '\n' \ --check-column "department_id" \ --incremental append \ --last-value 7 \ --outdir java_files Você deve especificar o modo do append ao importar uma tabela em que novas linhas são adicionadas continuamente com valores de id de linha crescentes. Você deve especificar a coluna que contém o ID da linha com check-column. O Sqoop importa as linhas nas quais a coluna de verificação possui um valor maior que o especificado com last-value, no caso 7.

Sqoop Job

sqoop job --create sqoop_job \ -- import \ --connect "jdbc:mysql://localhost:3306/retail_db" \ --username=root \ --password=cloudera \ --table departments \ --target-dir /toti/departments \ --append \ --fields-terminated-by '|' \ --lines-terminated-by '\n' \ --split-by department_id \ --outdir java_files A Sqoop Job nos permite criar e trabalhar com Jobs salvos. Os Jobs salvos guardam os parâmetros que foram usados, por isso, podemos reexecutá-los chamando o Job pelo identificador. Então é isso, o Sqoop job cria e salva os comandos de importação e exportação. Nos comandos Sqoop Job anterior mostrado um pouco acima, foi criado um job com o nome sqoop_job , que importa os dados da tabela do RDBMS para o HDFS. Agora temos o Job (sqoop_job ) disponível na lista de Jobs salvos, vamos listar: sqoop job --list Podemos verificar a configuração de um Job: sqoop job --show sqoop_job Podemos executar o Job usando o exec: sqoop job --exec sqoop_job Se ele pedir a senha é só digitar cloudera. Para deletar esse job que criamos, o sqoop_job é só dá um: sqoop job --delete sqoop_job

Criando uma tabela Hive com Sqoop

Com os comandos abaixo, é criada a tabela departments_test no Hive, serão gerados quatro arquivos já que não especificamos o número de threads, e eles vão ficar na pasta padrão do hive na máquina cloudera: /user/hive/warehouse. Vamos usar o fields-terminated-by para definir o separador dos campos como pipe ( | ) e lines-terminated-by para definir o final de linha como \n. sqoop import \ --connect "jdbc:mysql://localhost:3306/retail_db" \ --username=root \ --password=cloudera \ --table departments \ --fields-terminated-by '|' \ --lines-terminated-by '\n' \ --hive-import \ --hive-table departments_test \ --create-hive-table \ --outdir java_files Os comandos a seguir sobrescrevem ( --hive-overwrite ) os dados existentes associados à tabela hive departments_test na pasta do HDFS /user/hive/warehouse/ sqoop import \ --connect "jdbc:mysql://localhost:3306/retail_db" \ --username=root \ --password=cloudera \ --table departments \ --fields-terminated-by '|' \ --lines-terminated-by '\n' \ --hive-import \ --hive-overwrite \ --hive-table departments_test \ --outdir java_files

Exports

Como exportar dados do HDFS para o banco de dados RDBMS?

Usando o export do sqoop!

No export do sqoop, a tabela de destino deve existir no banco de dados de destino. Os arquivos que são fornecidos como entrada para o Sqoop contêm registros, que são chamados de linhas na tabela. Esses arquivos são lidos e analisados em um conjunto de registros e delimitados por um delimitador especificado pelo usuário. A operação padrão é inserir todo o registro dos arquivos de entrada na tabela do banco de dados usando a instrução INSERT. No modo de atualização, o Sqoop gera a instrução UPDATE, que substitui o registro existente no banco de dados.

Exemplo usando a tabela departments

É obrigatório que a tabela a ser exportada seja criada manualmente e esteja presente no banco de dados para onde ela vai ser exportada. A consulta a seguir é usada para criar o banco de dados retail_sqoop_db e nele a tabela departments. Primeiro entre no mysql: $ mysql -u root -p Digite seu password. mysql> CREATE DATABASE retail_sqoop_db; mysql> USE retail_sqoop_db; mysql> CREATE TABLE departments ( department_id int(11) NOT NULL AUTO_INCREMENT, department_name varchar(45) NOT NULL, PRIMARY KEY (department_id) ); Agora já podemos exportar do HDFS nossa tabela departments da pasta /user/root/departments no HDFS para o banco retail_sqoop_db na tabela departments. sqoop export --connect "jdbc:mysql://localhost:3306/retail_sqoop_db" \ --username=root \ --password=cloudera \ --table departments \ --export-dir /user/root/departments \ --batch \ --outdir java_files \ --num-mappers 1 \ --update-key department_id \ --update-mode allowinsert Entre no mysql novamente para vê se o export funcionou: $ mysql -u root -p Digite seu password. mysql> USE retail_sqoop_db; mysql> select * from departments; Especifique como as atualizações são executadas quando novas linhas são encontradas com chaves não correspondentes no banco de dados. O update-key só pode atualizar as colunas já presentes na tabela, não pode inseri-las, a menos que você também configure o update-Mode para allowinsert (que não é suportado por todos os bancos de dados). Se você tentar atualizar usando a chave de atualização (update-key), ele atualizará as linhas da chave mencionada no update-key. Os valores legais para o mode incluem: updateonly (padrão) e allowinsert. Ative o batch JDBC usando o parâmetro --batch com o comando de exportação. Usando esse modo para a execução básica da instrução, ativa o modo em lote(batch) no driver JDBC, as consultas são enfileiradas, entregando os resultados em lote. O --batch especifica que podemos agrupar as instruções SQL relacionadas em um lote quando exportamos os dados. A interface JDBC expõe uma API para fazer batches em uma instrução preparada com vários conjuntos de valores. Essa API está presente em todos os drivers JDBC porque é requerida pela interface JDBC.

Eval

O eval permite que os usuários executem consultas no banco de dados e visualizem o resultado no console. sqoop eval --connect "jdbc:mysql://localhost:3306/retail_db" \ --username root \ --password cloudera \ --query "select * from departments"

Com isso encerramos as aulas sobre o sqoop.

Para mais informações sobre o sqoop acesse:

https://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

Esse são meus link de afiliados na Hostinger: Hostinger

Curta a página do Código Fluente no Facebook https://www.facebook.com/Codigofluente-338485370069035/

Meu link de referidos na digitalocean .

Quem se cadastrar por esse link, ganha $100.00 dólares de crédito na digitalocean:

Digital Ocean

E o da one.com:

One.com

Obrigado, até a próxima e bons estudos. ;)