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
.
- Por exemplo,
- Pode ser usado a representação hexadecimal de um caracter UTF-8.
- Por exemplo,
--fields-terminated-by \0x10
produz o caracter carriage return.
- Por exemplo,
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. 😉