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: http://sqoop.apache.org/ 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: http://192.168.56.101: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 existAccumulo imports will fail.

Caso dê esse problema aí com você também, siga os seguintes passos usando o Putty.

  1. sudo mkdir /var/lib/accumulo
  2. ACCUMULO_HOME='/var/lib/accumulo'
  3. 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 avrodatafileas-textfile e as-sequencefile.

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. ;)