Esta página foi elaborada, com informações básicas, sobre como importar dados do MySQL para o HDFS com Apache Sqoop, em um ambiente de desenvolvimento e testes local.
- Máquina com sistema operacional Linux;
- Java(TM) SE Runtime Environment (build 1.8.0_281-b09)
- Docker instalado e configurado;
- MySQL Server instalado e configurado em um container Docker ou na máquina local;
- Apache Hadoop Pseudo Cluster instalado e configurado em um container Docker ou máquina local;
- Conector/JDBC do MySQL
- Apache Sqoop 1.4.7 instalado e configurado
O Sqoop versão 1.4.7 não é homologado para funcionar com Hadoop versão 3 ou superior. Por esse motivo, temos que incluir manualmente um pacote que está faltando, commons-lang-2.6
, para que funcione normalmente.
Você pode baixar este pacote no endereço: https://github.com/dsacademybr/Libs
Descompacte o pacote e copie o arquivo commons-lang-2.6.jar para o diretório LIB do sqoop. No meu ambiente o sqoop foi instalado em /opt/sqoop.
$ cp commons-lang-2.6.jar /opt/sqoop/lib/
Você também precisa baixar e copiar o Connector/J 8.0.24 para a pasta LIB do Apache Sqoop
$ cp mysql-connector-java-8.0.24.jar /opt/sqoop/lib/
Para ilustração do exemplo de importação de dados no HDFS com Sqoop, criei previamente uma base de testes no MySQL com alguns registros.
Testaremos a conexão do Sqoop com o banco de dados MySQL, criando uma "string" de conexão que liste todos os bancos de dados.
$ sqoop list-databases --connect jdbc:mysql://ip_servidor_mysql:3306/ --username seu_usuário -P
A conexão foi realizada com sucesso, os bancos de dados listados. Temos algumas mensagens de WARNINGS mas isto não é um problema, porque vamos conseguir realizar as operações de importações.
$ sqoop import --connect jdbc:mysql://ip_servidor_mysql:3306/banco_dados?serverTimezone=UTC \
--username usuário -P \
--table tabela_do_banco --m 1
O Sqoop conecta no banco de dados MySQL, executa um "select" na tabela indicada, gera um job mapreduce e envia para o HDFS, o Yarn gerencia a execução dos jobs, e a importação será realizada com sucesso.
Job enviado para HDFS
E lá está! job executado com sucesso.
Agora, confirmaremos o JOB que foi gravado no HDFS.
$ hdfs dfs -ls /user/hadoop/pedido
E lá está! o job foi executado com sucesso e gravado no diretório /user/hadoop/pedido/part-m-00000
Baixaremos o arquivo gerado e gravado Hadoop HDFS no diretório da máquina local.
$ hdfs dfs -get /user/hadoop/pedido/part-m-00000
Listaremos o coteúdo do arquivo.
$ nano part-m-00000
Eis um fragmento dos dados que foram importados do MySQL para o HDFS via Sqoop.
Finalizando, vou copiar os dados do container Hadoop para minha máquina local.
Copiarei os dados, e o JOB que o Apache Sqoop gerou para gravar no HDFS. Como estou trabalhando em container Docker, uma das formas é listar os volumes compartilhados, para saber onde os arquivos do Hadoop foram gravados na máquina local.
$ docker volume ls
$ docker volume inspect hadoop_home
Lá está! o conteúdo do diretório home/hadoop do container está sendo gravado na máquina local em /var/lib/docker/volumes/hadoop_home/_data
Listagem do diretório compartilhado entre a máquina local e o container.
Copiaremos os aquivos: part-m-00000 onde foi gravado os dados da tabela do MySQL, e o arquivo pedido.java que é a classe java, que gerou o JOB mapreduce e que gravou os dados no HDFS.
$ sudo cp /var/lib/docker/volumes/hadoop_home/_data/part-m-00000 ~/home/
$ sudo cp /var/lib/docker/volumes/hadoop_home/_data/pedido.java ~/home/
Feito! os arquivos foram copiados do "container" para máquina local.
Realizamos teste com Apache Sqoop, importamos tabela do servidor MySQL para o Apache Hadoop e gravamos os dados no HDFS. Por fim, copiamos os dados do container Hadoop para máquina local.
Apache Sqoop (TM) é uma ferramenta projetada para transferir dados em massa de maneira eficiente entre o Apache Hadoop e armazenamentos de dados estruturados, como bancos de dados relacionais.
Espero ter contribuido com o seu desenvolvimento de alguma forma.
Instalação e configuração do MySQL Communit Server no Linux com Docker
Instalação e Configuração de um container Docker Apache Hadoop
Dumping Data in SQL Format with mysqldump