Aula 13 – Apache Sqoop – Hadoop e SGBDR
Apache Sqoop
Ferramentas do ecossistema Hadoop para big data analytics
Mas afinal, o que é sqoop? Para que serve o sqoop? E quando devo usar o sqoop?
Espero que esse post deixe todas essas perguntas bem claras para vocês.
Então, vamos a um pouco de sua história.
O Apache Sqoop (TM) foi projetado para transferir com eficiência dados em massa entre o sistema Apache Hadoop e os armazenamentos de dados estruturados, como por exemplo, bancos de dados relacionais.
Ele consagrou-se com sucesso na incubadora do Apache em março de 2012 e agora é um projeto de alto nível do Apache.
O Sqoop é um subprojeto do Hadoop, ele só pode funcionar no sistema operacional Linux com o Hadoop instalado.
Nesse tutorial do ecossistema Hadoop, estamos usando uma máquina virtual da Cloudera já com todo o ecossistema instalado.
Esse é o link da documentação oficial:
A figura abaixo mostra o propósito do spoop.
Importação Sqoop
A ferramenta de import, importa tabelas individuais do RDBMS para o HDFS.
Cada linha de uma tabela é tratada como um registro no HDFS.
Todos os registros são armazenados como dados de texto em arquivos de texto ou como dados binários nos arquivos Avro e Sequence.
Exportação Sqoop
A ferramenta de exportação exporta um conjunto de arquivos do HDFS de volta para um RDBMS.
Os arquivos fornecidos como entrada para o Sqoop contêm registros, que são chamados de linhas, na tabela.
Delimitador de arquivo
Esses dados são lidos e analisados em um conjunto de registros e delimitados por um delimitador especificado pelo usuário.
Formatos de arquivos
Existem vários formatos de arquivo disponíveis ao gravar arquivos de dados no hdfs usando o Sqoop.
Os formatos de arquivos são: Avro, Parquet, Sequência e arquivo de texto.
Por padrão, o Sqoop usará -as-textfile se nenhum parâmetro for especificado.
O formato parquet, Avro e sequence são binários.
Avro é baseado em linha, o Parquet em colunas e o sequence em par chave-valor.
Se os seus dados consistem em muitas colunas, mas você está interessado em um subconjunto de colunas, você pode usar Parquet.
O Avro é rápido em recuperação, Parquet é muito mais rápido.
Avro
- Amplamente utilizado como uma plataforma de serialização.
- Baseado em linhas, oferece um formato binário compacto e rápido.
- Possui uma especificação independente da linguagem, atualmente implementadas em C, Java, Ruby, Python e PHP. Um aplicativo baseado em Python pode ler e escrever diretamente em arquivos de dados Avro.
- O esquema é codificado no arquivo para que os dados possam ser desmarcados.
- Os arquivos suportam a compressão do bloco e podem ser divididos.
- Suporta evolução do esquema.
Parquet
- Formato binário baseado nas colunas.
- Usa o algoritmo de desfiar(shredding) e montagem(assembly) descrito no trabalho Dremel (Análise interativa de conjuntos de dados em escala Web).
- Cada arquivo de dados contém os valores de um conjunto de linhas.
- Eficiente em termos de E / S de disco quando colunas específicas precisam ser consultadas.
Sequence
- Formato de arquivo binário de pares chave-valor
- Cada implementação armazenada nele são implementadas em Java.
- Não há especificação de formato independente da implementação Java.
Para a parte prática, baixe a base de dados relacional.
Segue o link para download:
retail_db
Entre na pasta onde unzipou o arquivo, usando o comando:
cd /caminho/para/o/arquivo/
Usando o winscp ou putty, crie uma pasta no sistema local de arquivos da máquina cloudera para colocar o arquivo unzipado retail_db.sql.
Por exemplo, /relational_databases
Através do winscp, arraste o arquivo retail_db.sql do seu sistema, para dentro dessa pasta /relational_databases no sistema de arquivos local da máquina cloudera.
Lembrando que o usuário é root e a senha é cloudera, para a máquina cloudera.
Abra um terminal putty e entre na máquina cloudera.
Entre na pasta /relational_databases
cd /relational_databases
Através dele, explore a base relacional com o mysql dentro da máquina cloudera.
Para entrar no mysql use:
mysql -uroot -pcloudera
Pronto, você está no prompt do mysql.
Crie o banco retail_db com:
CREATE DATABASE retail_db;
Selecione esse banco:
USE retail_db;
Agora rode o comando para popular o banco com o script sql retail_db.sql:
source retail_db.sql
O banco vai ser populado.
Dê uma explorada no banco:
SHOW TABLES;
Saída:
+———————+
| Tables_in_retail_db |
+———————+
| categories |
| customers |
| departments |
| order_items |
| orders |
| products |
+———————+
6 rows in set (0.00 sec)
SELECT * FROM categories;
+————-+————————+———————-+
| category_id | category_department_id | category_name |
+————-+————————+———————-+
| 1 | 2 | Football |
| 2 | 2 | Soccer |
| 3 | 2 | Baseball & Softball |
| 4 | 2 | Basketball |
| 5 | 2 | Lacrosse |
| 6 | 2 | Tennis & Racquet |
| 7 | 2 | Hockey |
| 8 | 2 | More Sports |
| 9 | 3 | Cardio Equipment |
| 10 | 3 | Strength Training |
| 11 | 3 | Fitness Accessories |
| 12 | 3 | Boxing & MMA |
| 13 | 3 | Electronics |
| 14 | 3 | Yoga & Pilates |
| 15 | 3 | Training by Sport |
| 16 | 3 | As Seen on TV! |
| 17 | 4 | Cleats |
| 18 | 4 | Men’s Footwear |
| 19 | 4 | Women’s Footwear |
| 20 | 4 | Kids’ Footwear |
| 21 | 4 | Featured Shops |
| 22 | 4 | Accessories |
| 23 | 5 | Men’s Apparel |
| 24 | 5 | Women’s Apparel |
| 25 | 5 | Boys’ Apparel |
| 26 | 5 | Girls’ Apparel |
| 27 | 5 | Accessories |
| 28 | 5 | Top Brands |
| 29 | 5 | Shop By Sport |
| 30 | 6 | Men’s Golf Clubs |
| 31 | 6 | Women’s Golf Clubs |
| 32 | 6 | Golf Apparel |
| 33 | 6 | Golf Shoes |
| 34 | 6 | Golf Bags & Carts |
| 35 | 6 | Golf Gloves |
| 36 | 6 | Golf Balls |
| 37 | 6 | Electronics |
| 38 | 6 | Kids’ Golf Clubs |
| 39 | 6 | Team Shop |
| 40 | 6 | Accessories |
| 41 | 6 | Trade-In |
| 42 | 7 | Bike & Skate Shop |
| 43 | 7 | Camping & Hiking |
| 44 | 7 | Hunting & Shooting |
| 45 | 7 | Fishing |
| 46 | 7 | Indoor/Outdoor Games |
| 47 | 7 | Boating |
| 48 | 7 | Water Sports |
| 49 | 8 | MLB |
| 50 | 8 | NFL |
| 51 | 8 | NHL |
| 52 | 8 | NBA |
| 53 | 8 | NCAA |
| 54 | 8 | MLS |
| 55 | 8 | International Soccer |
| 56 | 8 | World Cup Shop |
| 57 | 8 | MLB Players |
| 58 | 8 | NFL Players |
+————-+————————+———————-+
58 rows in set (0.00 sec)
Vamos listar todos os bancos que existem no mysql da máquina cloudera, através do sqoop:
sqoop list-databases \
--connect "jdbc:mysql://localhost:3306" \
--username root \
--password cloudera
Saída:
information_schema
cm
firehose
hue
metastore
mysql
nav
navms
oozie
retail_db
rman
sentry
Esses são os bancos que já existem no mysql da máquina cloudera, inclusive o que criamos e populamos(retail_db).
Lembrando que você pode interagir através da interface web da máquina.
Se você precisar de um ensaio técnico ou de ajuda para resolver um estudo de logon, recorra a profissionais da área https://essayswriting.org/ para obter ajuda, pois eles são mais experientes e podem ajudá-lo a resolver sua tarefa em pouco tempo.
Antes, abra um shell na máquina virtual e dê um ifconfig para verificar se o ip é igual a esse abaixo (192.168.56.101) , senão, troque pelo que mostra no ifconfig.
Isso é explicado em detalhes na aula 03 do tutorial do Hadoop: https://www.codigofluente.com.br/configuracao-da-maquina-cloudera/
Então acesse no browser da sua máquina física esse ip na porta 8888:
Para listar as tabelas do retail_db use:
#Lista as tabelas do banco retail_db no mysql da máquina cloudera
sqoop list-tables \
--connect "jdbc:mysql://localhost:3306/retail_db" \
--username root \
--password cloudera
Importe a tabela departamento do mysql para o hadoop HDFS
#Importa a tabela departamento do mysql para o hadoop HDFS
sqoop import \
--connect "jdbc:mysql://localhost:3306/retail_db" \
--username=root \
--password=hadoop \
--table departments \
--as-textfile \
--target-dir=/user/root/departments
Esse comandos acima podem ocasionar dois problemas, pelo menos na máquina cloudera que estou usando deu.
Primeiro, o uso dá contra-barra (‘ \ ‘) para separar os comandos em várias linhas, deu problema, por isso, logo abaixo tem uma outra versão dos comandos acima, mas, inline, isto é, na mesma linha, sem usar o contra-barra.
#Importa a tabela departamento do mysql para o hadoop HDFS
sqoop import --connect "jdbc:mysql://localhost:3306/retail_db" --username=root --password=cloudera --table departments --as-textfile --target-dir=/user/root/departments
O outro problema é em relação ao accumulo, que é sistema de armazenamento distribuído que usa chave/valor com base na tecnologia BigTable do Google.
O erro foi:
accumulo does not exist! Accumulo imports will fail.
Caso dê esse problema aí com você também, siga os seguintes passos usando o Putty.
- sudo mkdir /var/lib/accumulo
- ACCUMULO_HOME=’/var/lib/accumulo’
- export ACCUMULO_HOME
Ele definirá a variável de ambiente $ACCUMULO_HOME
E então execute novamente o:
#Importa a tabela departamento do mysql para o hadoop HDFS
sqoop import --connect "jdbc:mysql://localhost:3306/retail_db" --username=root --password=cloudera --table departments --as-textfile --target-dir=/user/root/departments
Ultrapassados esses pequenos problemas, vamos seguir.
O comando abaixo conta os registros de order_items (itens de pedido)
sqoop eval --connect "jdbc:mysql://localhost:3306/retail_db" --username root --password cloudera--query "select count(1) from order_items"
Importe todas as tabelas do mysql para o HDFS
sqoop import-all-tables \
--connect "jdbc:mysql://localhost:3306/retail_db" \
--username root \
--password cloudera \
--warehouse-dir /toti/retail_db/import-all-tables \
--driver com.mysql.jdbc.Driver
Na próxima aula continuaremos a explorar o sqoop.
Veremos como importar todas as tabelas do banco retail_db do mysql para o diretório /apps/hive/warehouse/
A gente também vai ver como importar os dados como avrodatafile, as-textfile e as-sequencefile.