Aula 15 – Apache Sqoop – Continuação 02

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. 😉

 

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>