14 julho 2014

Tutorial MySQL Applier for Hadoop na VM Cloudera Quickstart - parte 1

O MySQL Applier for Hadoop é um projeto ainda em estágio alfa de desenvolvimento, mas muito promissor. O objetivo é fornecer uma solução que aplica os dados do MySQL no HDFS em tempo real, ou seja, uma alternativa ao tradicional uso de Sqoop para extrair dados do MySQL para Hadoop. Há uma explicação mais completa do MySQL Hadoop Applier aqui.

Você pode baixar os fontes em http://labs.mysql.com e compilá-los para qualquer distribuição.

Neste tutorial mostraremos como é este processo para a “VM Cloudera Quickstart”, que pode ser baixada aqui. A versão da VM utilizada neste post foi 4.4.0-1. Esta é uma imagem para VMWare, portanto você precisará do VMWare Player ou similar para executá-la.

Na distribuição que testamos, encontramos pré-instalado o Hadoop Version 2.0.0. Sendo assim, os procedimentos abaixo aplicam-se a esta mesma versão. Verifique a versão acessando a URL http://localhost:50070/dfshealth.jsp na VM.

Passo 1: Configuração do HDFS


A única configuração diferente da padrão da VM é dfs.support.broken.append = true . Para alterá-la, acesse na VM http://localhost:7180 e navegue até Services > Service hdfs1 > Configuration > View and Edit .

Procure por for "HDFS Client Configuration Safety Valve” (for hdfs-site.xml) e adicione a seguinte configuração:
 <property>
   <name>dfs.support.broken.append</name>
   <value>true</value>
 </property>

hdfs-config1.png

Note que a property correta é do Client, que está no final da página. Não é "HDFS Service Configuration Safety Valve".

hdfs-config2.png

Passo 2: Instalação do MySQL 5.6 via YUM (repositório Oracle)


O MySQL Applier for Hadoop usa a Binlog API do MySQL. Esta API foi implementada a partir da versão 5.6 do MySQL.

Para obter a versão mais atualizada do MySQL Community, vamos adicionar o repositório oficial Oracle:
$ su (password Cloudera)
# mkdir /opt/mysql5.6
# cd /opt/mysql5.6
# wget https://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm --no-check-certificate
# yum localinstall mysql-community-release-el6-5.noarch.rpm
(Um comando alternativo seria: # rpm -ivh mysql-community-release-el6-5.noarch.rpm)

Depois de instalado o repositório Oracle, basta fazer:
# yum update mysql-libs
# yum install mysql-server

Verifique se instalou o MySQL 5.6 corretamente:
# service mysqld start
# mysql -uroot
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.6.17    |
+-----------+
1 row in set (0.00 sec)

Passo 3: Configuração do my.cnf para habilitar log binário no formato Row


O log binário do MySQL ainda não está habilitado, como verificado pelo comando:
mysql> SHOW GLOBAL VARIABLES LIKE 'log_bin%';
| log_bin                         | OFF                             |
mysql> exit

Para configurar o MySQL, edite o arquivo my.cnf:
# yum install nano
# nano /etc/my.cnf

Descomentar linha log_bin, ou seja, remover “#” do inicio:
log_bin

Adicionar as seguintes linhas:
binlog_format='ROW'
binlog_checksum=NONE
server_id=10

Ctrl+X para sair do nano e Salvar.

Reiniciar o serviço:
# service mysqld restart

Note que agora o binlog está habilitado:
# mysql -uroot
mysql> SHOW GLOBAL VARIABLES LIKE 'log_bin%';
+---------------------------------+---------------------------------+
| Variable_name                   | Value                           |
+---------------------------------+---------------------------------+
| log_bin                         | ON                              |
| log_bin_basename                | /var/lib/mysql/mysqld-bin       |
| log_bin_index                   | /var/lib/mysql/mysqld-bin.index |
| log_bin_trust_function_creators | OFF                             |
| log_bin_use_v1_row_events       | OFF                             |
+---------------------------------+---------------------------------+
5 rows in set (0.05 sec)

Note também que o binlog está configurado para formato ‘ROW’ e checksum desligado:
mysql> SHOW GLOBAL VARIABLES LIKE 'binlog%';
+-----------------------------------------+-------+
| Variable_name                           | Value |
+-----------------------------------------+-------+
| binlog_cache_size                       | 32768 |
| binlog_checksum                         | NONE  |
| binlog_direct_non_transactional_updates | OFF   |
| binlog_format                           | ROW   |
| binlog_max_flush_queue_time             | 0     |
| binlog_order_commits                    | ON    |
| binlog_row_image                        | FULL  |
| binlog_rows_query_log_events            | OFF   |
| binlog_stmt_cache_size                  | 32768 |
+-----------------------------------------+-------+
9 rows in set (0.09 sec)
mysql> exit

Passo 4: Instalação do MySQL Applier for Hadoop


Como o MySQL Applier for Hadoop é um projeto em estágio alfa, ainda não temos um processo simplificado de instalação como temos para o MySQL 5.6. Para instalar o MySQL Applier for Hadoop a única opção é baixar e compilar a partir do código fonte. Nem sempre este é um procedimento simples de entender, então deixaremos essa parte para a parte 2 deste tutorial.

Para simplificar, compartilhei o binário já compilado para a distribuição “VM Cloudera Quickstart”. Baixe com os seguintes comandos:
# mkdir /opt/mysql-happlier
# cd /opt/mysql-happlier
# wget --no-check-certificate -O happlier https://docs.google.com/uc?id=0B72QNK1Qd-A9RFB4S3VuQUJoUjA&export=download
# chmod 777 happlier

Nota: este binário foi compilado especificamente para a “VM Cloudera Quickstart” que pode ser baixada aqui. A versão da VM utilizada neste post foi 4.4.0-1. Para gerar um binário em sua distribuição, siga as intruções da parte 2 deste tutorial.

Passo 5: Execução


Para executar o MySQL Applier for Hadoop é necessário exportar as variáveis de ambiente e configurar o classpath do Java. Para facilitar o processo, crie um script:

# nano load.sh:
source /usr/lib/bigtop-utils/bigtop-detect-javahome
export CLASSPATH=/etc/hadoop/conf
for file in `ls /usr/lib/hadoop/client/*.jar`
do
 export CLASSPATH=$CLASSPATH:$file
done
export LD_LIBRARY_PATH="$JAVA_HOME/jre/lib/amd64/server/"
/opt/mysql-happlier/happlier --field-delimiter=, mysql://root@127.0.0.1:3306 hdfs://localhost:8020

Dê permissão de execução para o script com:
# chmod 777 load.sh

Execute o script com:
# sudo -u mysql ./load.sh
Change the default data warehouse directory? (Y or N) N

Passo 6: Testes


Para testar se o MySQL Applier for Hadoop está funcionando corretamente, abra um novo terminal, crie um banco de dados de teste no MySQL:

#mysql -uroot
mysql> CREATE DATABASE meudb;
mysql> SHOW DATABASES;
mysql> USE meudb;
mysql> CREATE TABLE simples (id INT AUTO_INCREMENT PRIMARY KEY, texto VARCHAR(200));
mysql> INSERT INTO simples VALUES (NULL, 'Primeiro teste');
mysql> SELECT * from simples;
mysql> INSERT INTO simples VALUES (NULL, 'Segundo teste');
mysql> SELECT * from simples;

Navegue até o HDFS acessando na VM http://localhost:50070 , clique em “Browse the filesystem” e vá até o diretório /user/hive/warehouse/meudb.db; verifique se os arquivos correspondentes apareceram.
Neste video é possível ver o MySQL Applier for Hadoop em ação e outros exemplos de testes, inclusive com Hive.


Referências

3 comentários:

Mathias Brem disse...

Excelente artigo! É dificil encontrar bons artigos sobre Hadoop em português, e mais tão técnicos assim!

Eu esperava ver mais empresas usarem Hadoop aqui no Brasil, está começando a se popularizar agora

Rafael Dantas disse...

Airton,

existe alguma maneira de receber ou ser notificado assim que novos posts forem publicados ?

Abs

Airton Lastori disse...

Olá Rafael,

Você pode se inscrever no feed aqui: http://www.alastori.com.br/feeds/posts/default

Pode também acompanhar o Facebook.com/mysqlbr ou o twitter.com/mysqlbr.