Explorando o database MNIST com TensorFlow, de um modelo simples a um aplicativo Android.

Pensaram que eu não ia postar hoje né?

Parei um pouco de postar no blog PT-BR, porque eu estava participando de um estágio com Outreachy/OpenStack e acabei não traduzindo os posts de: inglês com vários erros pra português com vários erros, você pode ver esses posts aqui caso queira.

Enfim…

Eu recentemente comecei a mexer com TensorFlow que é um framework sencacional e TensorBoard em específico é muito legal.

Mas não to aqui pra dizer que TensorFlow é top (você sabe que é), mas sim pra falar um pouco do que andei fazendo com TensorFlow.

Basicamente, o HelloWorld do TensorFlow é construir um modelo pra classificar dígitos do databse MNIST , eu criei um repositório com alguns links legais que mostram como fazer isso de forma bem simples ou um pouco mais complexas, de forma ideal pra quem ta começando. E criei um repositório contendo um aplicativo Android com um modelo que reconhece digítos escritos a mão (como os do MNIST).

demo

Hope it helps somehow, have a nice day!

Advertisements
Explorando o database MNIST com TensorFlow, de um modelo simples a um aplicativo Android.

URI – Warm up OBI 2016 – segunda fase

Olá pessoal,

Há um tempo atrás rolou o aquecimento para a OBI 2016 fase 2 e escrevi um dos problemas 🙂 (escrevi alguns problemas para a primeira fase também)!

Escrevi esse lindinho aqui: Rio 2016
Segue abaixo um breve editorial, espero que ajude de alguma forma :).

Rio 2016

Por: Marianne Linhares

O problema é bem direto, lendo atentamente é fácil perceber que consiste basicamente em calcular a distância entre dois pontos e depois comparar esse valor com o tempo para occorência do jogo.

Maaaas,  cuidado com o uso de inteiros, a multiplicação pode não caber num inteiro, utilizando long long int (C++) para as variáveis envolvidas é suficiente.

Uma solulção em C++ aqui.

  • Complexidade: O(n).
URI – Warm up OBI 2016 – segunda fase

Minha primeira extensão para o Google Chrome – SpotifYoutube

Fala galera,

Parem o mundo! Tem algo muito estranho acontecendo, depois de meses de muita ocupação (estudo, trabalho, séries) consegui algumas semanas de férias e não só comecei minha primeira extensão para o Chrome como eu terminei (pasmem, eu sei fiquei tão chocada quanto você).

É uma extensão bem simples que adiciona um botão ao Youtube para procurar o título do vídeo no Spotify (claro, tomando as devidas precauções 😉 ). Aparentemente ta dando tudo certo, e to bem feliz com o resultado! Youtube é amor, Spotify é amor o resultado? Muito amor!

button.png

Espero que aproveitem!

Código fonte, Chrome Web Store!

Demo:

Minha primeira extensão para o Google Chrome – SpotifYoutube

Introdução ao Hadoop + Instalando Hadoop de forma Distribuída

Introdução a ferramentas e tecnologias Big Data

 

Guia:

  • Hadoop
        • Introdução
        • MapReduce
        • HDFS
  • Tutorial Hadoop
        • Executando localmente (Standalone).
        • Executando de forma pseudo-distribuída (Single Node Cluster).
        • Executando de forma distribuída.
  • Bibliografia

Hadoop

Introdução

Hadoop é um framework open source desenvolvido em Java para executar aplicações que manipulem uma grande quantidade de dados em ambientes “clusterizados” em vez de em poderosos computadores.

Hadoop destaca-se como uma tecnologia aberta, baseada no paradigma MapReduce, que utiliza a computação paralela e distribuída para resolver o problema da escalabilidade no processamento de Bigdata com garantias de tolerância a falhas.

Hadoop garante ao desenvolvedor:

  • Oferecer um framework que possa auxiliar no desenvolvimento de aplicações.
  • Processar uma grande quantidade de dados.
  • Easy Programming – o programador não tem que se preocupar com: onde o arquivo está localizado, como reagir a erros, como dividir as tarefas, como programar de forma “escalável”.

Hadoop é:

  • Escalável: pode armazenar e processar petabytes sem problemas.
  • Econômico: o Hadoop distribui os dados e o processamento através dos clusters. Estes clusters podem ter milhares de nós (máquinas).
  • Eficiente: por distribuir os dados, o Hadoop pode processá-los em paralelo por meio dos nós, onde os dados estão alocados. Isto é feito de forma extremamente rápida.
  • Confiável: ele automaticamente mantém múltiplas copias dos dados e automaticamente remaneja as tarefas em caso de falhas.

Hadoop é responsável por dividir os dados de entrada em blocos independentes, que são processados de forma completamente paralela, pelas chamadas map tasks (traduzindo ao pé da letra, tarefas de mapeamento). Ele ordena as saídas das map tasks, que são os dados de entrada das reduce tasks (traduzindo ao pé da letra, tarefas de redução). Normalmente tanto a entrada quanto a saída da tarefa são armazenadas no sistema de arquivo. O MapReduce se encarrega de agendar as tarefas, monitorar e “reexecutar” em caso de falha.

 

MapReduce

  • Introdução

MapReduce é o modelo de programação do Hadoop. A escolha de um modelo restringe a organização do seu programa, porém graças a isso consegue cuidar dos “bastidores” por você.
Além disso o fato de limitar o modelo de programação ao MapReduce deixa claro para o programador que o processamento é paralelo e o faz programar pesando nisso.

As seguintes etapas são seguidas no MapReduce:

  • Iterar sobre o grande número de registros
  • Tirar algo de interesse (selecionar/filtrar, transformar, decompor)
  • Organizar resultados parciais
  • Agregar resultados parciais e gerar uma saída

O que o usuário faz?

  • Especifica seleção/filtragem/transformação
  • Especifica a agregação

O que a ferramenta faz?

  • Cria trabalhadores e os instancia remotamente
  • Particiona e distribui a entrada
  • Comunica dados intermediários, busca resultados
  • Monitora máquinas e lida com falhas

 

Funções Map e Reduce

Map: (chave, valor)  >>>  (chave’, valor’)

  • Recebe uma chave de entrada e um valor
  • Produz um ou mais pares
  • Bom para: desagregar, filtrar, transformar

Reduce: (chave, lista de valores)  >>>  (chave, valor’)

  • Recebe uma chave de entrada e uma lista de valores
  • Produz um(ou nenhum) par
  • A chave é frequentemente a mesma e o valor é uma agregação de todos os valores da lista
  • Bom para: agregar resultados parciais

Exemplo de execução MapReduce – WordCount

Vamos considerar 3 trabalhadores (workers). Cada trabalhador recebe um arquivo de entrada, sendo estes respectivamente:

  • Arquivo 1: isto é um teste 
  • Arquivo 2: testando hadoop
  • Arquivo 3: testando com um teste

Saída do Map

  • Worker 1: (isto 1), (é 1), (um 1), (teste 1).
  • Worker 2: (testando 1), (hadoop 1).
  • Worker 3: (testando 1), (com 1), (um 1), (teste 1).

Entrada do Reduce

  • Reduce 1: (isto,[1])
  • Reduce 2: (é , [1])
  • Reduce 3: (testando , [1,1])
  • Reduce 4: (um, [1, 1])
  • Reduce 5: (Hadoop, [1])
  • Reduce 6: (com, [1])
  • Reduce 7: (teste, [1,1])

Saída do Reduce

  • Reduce 1: (isto 1)
  • Reduce 2: (é 1)
  • Reduce 3: (testando 2)
  • Reduce 4: (um 2)
  • Reduce 5: (Hadoop 1)
  • Reduce 6: (com 1)
  • Reduce 7: (teste 2)

 

HDFS


O que o HDFS faz?

O HDFS (Hadoop Distributed File System), que foi baseado no GFS (Google File System), como o próprio nome sugere é um sistema de arquivos distribuído. Este sistema foi desenvolvido para ser escalável, tolerante a falhas, garantir alto gerenciamento, confiabilidade, usabilidade e desempenho, além de ser capaz de trabalhar em conjunto com MapReduce.

O interessante é que quando você for desenvolver a sua aplicação você não precisa se preocupar onde os dados estão, o próprio Hadoop se encarrega dessa tarefa, ou seja, para a sua aplicação isso é transparente, seria como se os dados estivessem armazenados localmente.

Devido ao fato de o HDFS distribuir o armazenamento e o processamento entre vários clusters, a associação dos recursos armazenados pode crescer com a demanda enquanto continua a ser econômico.

Vídeo para melhor entedimento: https://www.youtube.com/watch?v=1_ly9dZnmWc

 

Tutorial Hadoop: executando localmente (Standalone), de forma pseudo-distribuída(Single Node Cluster) e de forma distribuída.

Este tutorial foi feito na versão do Hadoop 2.7.2 no Linux Ubuntu 14.04, em maio de 2016. Se quiser ver os passos de forma mais prática e rápida fiz esse script e a pasta também contém os arquivos de configuração aqui apresentados.

Devem estar instalados na máquina: Java e ssh.
A instalação de ambos será mostrada nesse tutorial caso você não os tenha instalados na sua máquina (a versão java utilizada nesse tutorial é java-7-openjdk-amd64).

A maioria dos tutoriais sugerem a criação de um usuário específico só para o Hadoop, neste tutorial isso não foi seguido, porém é importante que você utilize um certo usuário em específico como dono das pastas e que você esteja logado como este usuário.

Se houver problemas durante o tutorial é indicado visitar as páginas na Bibliografia.

1. Download hadoop
2. Unzip hadoop

 

Passo 1 e 2 no terminal:

wget http://apache.mirrors.spacedump.net/hadoop/common/stable/hadoop-2.7.2.tar.gz
tar -xvf hadoop-2.7.2.tar.gz –gzip # Extraindo hadoop
rm hadoop-2.7.2.tar.gz  # Pode deletar o zip se quiser

2.1 Setup das variáveis de ambiente

export HADOOP_HOME=~/hadoop-2.7.2
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export HADOOP_YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
# HADOOP_HOME => path para a pasta em que foi instalado o hadoop nesse caso foi instalado no home

 

3. export JAVA_HOME

3.1 Caso não tenha o JAVA instalado

sudo apt-get install openjdk-7-jdk

 

3.2 Configurando o JAVA_HOME no arquivo hadoop-env.sh

Edite o arquivo hadoop-env.sh (pode estar na pasta conf ou na pasta etc/hadoop dependendo da sua versão hadoop), colocando o caminho onde o jdk está instalado, provavelmente algo do tipo:

export JAVA_HOME=/usr/lib/jvm/sua_versao_java

Com este passo executado o Hadoop está pronto para ser executado localmentePara executar o Hadoop no modo Single Node você ainda deverá fazer os passos 4, 5 e 6.

*Opcional

3.3 Executando localmente o Hadoop

Para executar uma aplicação Hadoop deve ser criada uma pasta de entrada e será gerada uma pasta de saída, a pasta de saída não pode existir.

# Criando a pasta que será usada como entrada

mkdir input

# Copiando os arquivos da configuração para a pasta input, passo importante,as configurações sempre devem estar na pasta de entrada!!!!

cp etc/hadoop/*.xml input

# Executando (dentro da pasta onde o Hadoop foi instalado)

bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar grep input output ‘dfs[a-z.]+’

# Ver saída

$cat output/*

O último comando devera gerar algo do tipo: 1 dfsadmin

Obs I : se for lançada alguma exceção Java veja se o caminho JAVA_HOME está correto e verifique a permissão da pasta (para colocar seu usuário como “dono” da pasta execute o comando chown ou faça o mesmo comando acima com o sudo)

Obs II : se for lançada alguma exceção Java referente ao hostname verificar se a máquina em questão reconhece o hostname (/etc/hostnames) no arquivo /etc/hosts. Se o hostname não estiver definido basta defini-lo com o IP da máquina.


4. Comunicação – SSH

4.1 Instalando o SSH

Caso não tenha instalado o SSH os seguintes passos deverão ser feitos, senão pode pular para o passo 4.2.

SSH (“Secure SHell”) é um protocolo para acessar uma máquina de outra de forma segura. Hadoop usa SSH para acessar outros slaves, para começar e administrar toda a HDFS e MapReduces.

sudo apt-get install openssh-server

 

4.2 Configurando o SSH

Agora que você instalou o SSH na sua máquina, você pode se conectar a outra máquina ou permitir que outra máquina se conecte com a sua (passo importante para a execução distríbuida !!!). Entretanto nós estamos configurando uma single machine, podemos tentar conectar nossa máquina e ela mesma via SSH sem a necessidade de uma senha para tal. Para isso precisamos executar as seguintes linhas no terminal:

# Logar como o usuário, no caso do exemplo o usuário é hduser
sudo su hduser
# Gerar ssh key
ssh-keygen -t rsa
# Copiar id_rsa.pub para autorizar keys do hduser
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Obs: este passo é importante para rodar de forma distribuída e por isso será explicado novamente mais a frente em detalhes para o modo distribuído.

Teste a partir do comando “ssh localhost” se alguma senha é solicitada. Para que esteja configurado corretamente nenhuma senha deve ser pedida.

 

5. Configurações específicas

Antes de editar os arquivos, crie pastas temporárias para o namenode e o datanode. E faça o chown na pasta.

Exemplo:

# Criando as pastas temporarias para o Namenode e Datanode
mkdir -p tmp/hdfs/namenode
mkdir -p tmp/hdfs/datanode

5.1 Editando arquivos:

etc/hadoop/yarn-site.xml:

# Coloque essas linhas entre as tags <configuration> <property>
  <name>yarn.nodemanager.aux-services</name>
  <value>mapreduce_shuffle</value>
</property>
<property>
  <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
  <value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>

Configuration file : core-site.xml

# Coloque essas linhas entre as tags <configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>

Configuration file : hdfs-site.xml

# Coloque essas linhas entre as tags <configuration>
<property>
     <name>dfs.replication</name>
     <value>1</value>
</property>
<property>
     <name>dfs.namenode.name.dir</name>
     <value>/home/ubuntu/hadoop-2.7.2/tmp/hdfs/namenode</value>
</property>
<property>
     <name>dfs.datanode.data.dir</name>
     <value>/home/ubuntu/hadoop-2.7.2/tmp/hdfs/datenode</value>
</property>

OBS: se tiver criado as pastas do datanode e namenode em outro path, altere o caminho nas configurações do hdfs-site.xml

Configuration file : mapred-site.xml

# Coloque essas linhas entre as tags <configuration>
<property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
</property>

OBS: se esse arquivo não existir, copie as informações de mapred-site.template.xml para mapred-site.xml e depois o modifique como feito acima.

 

6. Formatar namenode

bin/hdfs namenode -format

7. Iniciar Hadoop

Agora sua máquina está pronta para executar o hadoop de forma pseudo-distribuída. Basta executar os seguintes comandos na pasta em que seu hadoop foi instalado:

sbin/start-dfs.sh
sbin/start-yarn.sh

Caso o hadoop tenha sido instalado corretamente ao executar o comando jps a saída deve ser algo do tipo:

20353 NodeManager
19517 DataNode
20062 ResourceManager
20309 Jps
19875 SecondayNodeManager
19222 NameNode

 

8. Executando um WordCount

Para executar uma aplicação hadoop deve ser criada uma pasta de entrada e será gerada uma pasta de saída, a pasta de saída não pode existir.

mkdir input
cp etc/hadoop/*.xml input
bin/hadoop dfs -copyFromLocal input /in # criando pasta de entrada no hdfs

# executando o wordCount
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /in output

# Pegando saida do HDFS
bin/hdfs dfs -get output output
cat output/*

Obs: quando a pasta de saída não for mais necessária remova a pasta do hdfs com o comando $bin/hdfs dfs -rm -R <nomeDaPasta>

Obs: uma possibilidade caso o job não seja executado é memória insuficiente para alocar o Application Manager que precisa por default de 1.5GB.

9. Executando seu próprio programa no hadoop

Link de classe WordCount para teste.
Até agora só executamos programas da pasta de exemplos do hadoop. Para executar o seu código Java no hadoop os seguintes passos devem ser feitos:

9.1 Criar a pasta de entrada

Da mesma forma que já foi feito para rodar de forma pseudo-distribuída deve-se criar uma pasta de entrada na HDFS com os arquivos da configuração e a pasta de saída não deve existir.

9.2 Compilar sua classe e gere um jar

Compile sua classe e gere um jar para ela com os seguintes comandos:

# Setando variáveis# No hadoop-env.sh e no .bashrcexport PATH=$JAVA_HOME/bin:$PATH export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar

# Compilando $ bin/hadoop com.sun.tools.javac.Main SUA_CLASSE.java # Gerando jar$ jar cf sua_classe.jar SUA_CLASSE*.class

OBS: faça os imports necessários do MapReduce em sua classe.
OBS 2: se quiser fazer via eclipse.

9.3 Rodar e visualizar os arquivos de saída

# Rodando, supondo que sua pasta de entrada é input e de saída output$ bin/hadoop jar sua_claasse.jar SUA_CLASSE input output

# Visualizar os arquivos$ bin/hadoop fs -get output output $ cat output/*

10. Executando o hadoop de forma distribuída

Os passos para executar o hadoop de forma distribuída são bem semelhantes aos passos para executar de forma pseudo-distribuída, porém mais configurações serão necessárias e a comunicação entre Master e Workers deve ser assegurada.

Os passos de 10.1 a 10.5 devem ser executados em todas as máquinas

10.1 Instalando o Hadoop e configurando o JAVA_HOME

Esse passo deve ser executado em todas as máquinas, e é exatamente igual aos passos de 1 a 4.1 deste tutorial.

10.2 Edite o /etc/hosts

No arquivo /etc/hosts coloque os IPs das máquinas com um identificador.

Exemplo: 3 máquinas, um master e 2 slaves.
O /etc/hosts de cada uma teria as seguintes linhas:

IP_maquina1 nome_da_maquina1 masterIP_maquina2 nome_da_maquina2 slave1IP_maquina3 nome_da_maquina3 slave2#IP nome_da_maquina identificador

Importante: remover a linha 127.0.01 localhost, isso pode gerar problemas de identificar o host.

10.3 Comunicação entre as máquinas

Esse passo é o equivalente ao passo 4.2 já mostrado para rodar de forma pseudo-distribuída. Porém como já dito deve ser possível a comunicação entre todas as máquinas.

# gera a chavessh-keygen -t rsa

#copie a chave e coloque em .ssh/authorized_keyscat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Este comando irá gerar uma chave que está no arquivo .ssh/id_rsa.pub, você irá copiar as informações deste arquivo para .ssh/authorized_keys. Isto deve ser feito em todas as máquinas. Por exemplo: se você tem 3 máquinas, um master e 2 slaves, o master deve ter no arquivo .ssh/authorized_keys a sua própria chave, e a chave dos 2 slaves. O mesmo vale para cada um dos slaves, eles devem tem sua própria chave, a chave do master e do outro slave.

10.4 Edite o .bashrc

export HADOOP_HOME=<caminho_de_instalacao_hadoop>
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

10.5 Edite os arquivos hadoop

Adicione a seguinte linha ao início do libexec/hadoop-config.sh :

export JAVA_HOME=/usr/lib/jvm/SUA_VERSAO_JAVA/

E as seguintes linhas em etc/hadoop/yarn-env.sh :

export JAVA_HOME=/usr/lib/jvm/SUA_VERSAO_JAVA/
export HADOOP_HOME=<caminho_de_instalacao_hadoop>
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop

Crie a pasta tmp onde o hadoop está instalado:

$ mkdir -p $HADOOP_HOME/tmp

Configure os seguintes arquivos:

$HADOOP_CONF_DIR/core-site.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<configuration>
 <property>
   <name>fs.default.name</name>
   <value>hdfs://master:9000</value>
 </property>
 <property>
   <name>hadoop.tmp.dir</name>
   <value>/<caminho_de_instalacao_hadoop>/tmp</value>
 </property>
</configuration>

$HADOOP_CONF_DIR/hdfs-site.xml :

<?xml version=”1.0″ encoding=”UTF-8″?>
<?xml-stylesheet type=”text/xsl” href=”configuration.xsl”?>
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
</configuration>

$HADOOP_CONF_DIR/mapred-site.xml (se o arquivo não existir faça como já foi explicado no passo 5.1):

<?xml version=”1.0″?>
<configuration>
<property>
  <name>mapreduce.framework.name</name>
  <value>yarn</value>
</property>
</configuration>

$HADOOP_CONF_DIR/yarn-site.xml :

<?xml version=”1.0″?>
<configuration>
 <property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
 </property>
 <property>
   <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
   <value>org.apache.hadoop.mapred.ShuffleHandler</value>
 </property>
 <property>
   <name>yarn.resourcemanager.resource-tracker.address</name>
   <value>master:8025</value>
 </property>
 <property>
   <name>yarn.resourcemanager.scheduler.address</name>
   <value>master:8030</value>
 </property>
 <property>
   <name>yarn.resourcemanager.address</name>
   <value>master:8040</value>
 </property>
</configuration>

 

A partir de agora estes passos devem ser executados apenas no Master.

10.6 Adicionar slaves

Adicione os slaves no arquivo $HADOOP_CONF_DIR/slaves:

slave1
slave2

Sendo esses nomes definidos pelos identificadores colocados em /etc/hosts. Se quiser colocar o master como um slave nada impede.


10.7 Formatar o Namenode

bin/hdfs namenode -format

 

10.8 Iniciar Hadoop

sbin/start-dfs.shsbin/start-yarn.sh

 

10.9 Checar Instalação

Execute o comando jps no terminal. Deve aparecer algo do tipo:

No master:

$ jps
6539 ResourceManager
8701 Jps
6234 NameNode5396 SecondaryNameNode


Nos slaves:

$ jps
8014 NodeManager
7858 DataNode
9868 Jps

Agora pode tentar rodar algum exemplo do Hadoop como já mostrado anteriormente para a versão Single Node.

Exemplos de código Map Reduce

Caso queira entender melhor o código de um job Hadoop, há alguns códigos com explicações detalhadas que desenvolvi para uma aplicação enquanto estava no LSD no seguinte link. Inclusive exemplos usando combiner.

 

 

Bibliografia:

Hadoop

http://hadoop.apache.org/
http://pt.slideshare.net/flaviofonte/o-que-o-hadoop-map-reduce-hdfs-e-hive
https://ensinar.wordpress.com/tag/cluster/
http://www.ime.usp.br/~danielc/papers/erad-hadoop-DanielCordeiro.pdf
http://br.hortonworks.com/hadoop/hdfs/

Material da Disciplina: TECC –Analise de Dados 2 Período: 2014.2,Universidade Federal de Campina Grande –UFCG,Centro de Engenharia Elétrica e Informática –CEEI, Departamento de Sistemas e Computação –DSC,Professor: Andrey Brito.

Tutorial Hadoop

http://hadoop.apache.org/docs/r1.2.1/single_node_setup.html#Prepare+to+Start+the+Hadoop+Cluster
http://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html#Example%3A+WordCount+v1.0
http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Source_Code
http://pingax.com/install-hadoop2-6-0-on-ubuntu/
https://raseshmori.wordpress.com/2012/09/23/install-hadoop-2-0-1-yarn-nextgen/
https://raseshmori.wordpress.com/2012/10/14/install-hadoop-nextgen-yarn-multi-node-cluster/
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-multi-node-cluster/#javaioioexception-incompatible-namespaceids

Material da Disciplina: TECC –Analise de Dados 2 Período: 2014.2,Universidade Federal de Campina Grande –UFCG,Centro de Engenharia Elétrica e Informática –CEEI, Departamento de Sistemas e Computação –DSC, Professor: Andrey Brito.

 

Introdução ao Hadoop + Instalando Hadoop de forma Distribuída

Breve introdução ao Apache Kafka

Introdução ao Kafka

 

Guia

  • Sistema de mensagens distribuído – Kafka

        • Definição
        • Vantagens
        • Instalação de maneira distribuída
  • Tutorial Kafka – executando de forma distribuída

  • Bibliografia

Kafka

De forma resumida, Kafka é um sistema de submissão-recebimento de mensagens que foi projetado para ser rápido, escalável e resiliente. Kafka é um serviço de log distribuído, particionado e replicado. Como muitos desses sistemas, Kafka mantém séries de mensagens em tópicos, Producers escrevem dados nos tópicos e consumers leem do tópico. Já que Kafka é um sistema distribuído, tópicos são particionados e replicados através de múltiplos nós.

O Particionamento tem vários propósitos, primeiro, permite que o log cresça além do tamanho que cabe em um único servidor. Cada partição deve caber nos servidores que a contém, mas um tópico pode ter várias partições então ele aguenta um número arbitrário de dados, segundo ele age como uma unidade de paralelismo.

Cada partição tem um servidor que age como líder e zero ou mais servidores chamados seguidores. O líder é responsável por todas as requisições de leitura e escrita para a partição enquanto os seguidores replicam as ações do líder. Se o líder falhar, um dos seguidores automaticamente se torna o novo líder. Cada servidor age como um líder para alguma de suas partições e um seguidor para outros, então a carga é bem balanceada entre os clusters.

Troca de mensagens de sua maneira tradicional tem dois modos: enfileirar ou escrita-leitura. Em um modo de fila, uma porção de consumers podem ler de um servidor e cada mensagem vai para um deles, no modo escrita-leitrua a mensagem é enviada a todos os consumidores. Kafka oferece uma única abstração que generaliza ambos: o grupo de consumo.

Cada consumidor pertence a um grupo de consumo, e cada mensagem é publicada em um tópico e enviada a um consumidor(que pertence a um grupo de consumo). Consumidores podem estar em processos distintos ou máquinas distintas. Se todos os consumidores estão no mesmo grupo de consumo, então este processo é do tipo enfileiramento que será balanceado entre os consumidores. Se todos os consumidores tem diferentes grupos de consumo, então este processo é leitura-escrita e todas as mensagens são enviadas a todos os consumidores.

Tutorial Kafka

Esse tutorial mostra como executar de forma simples o kafka de forma distribuída supondo que todas as máquinas estejam conectadas a mesma rede, para isso em todas as máquinas devem ser instalado o kafka.

    • Instalar Java: sudo apt-get install openjdk-7-jdk

Tendo instalado o kafka usaremos 4 máquinas e serão mostradas as configurações necessárias em cada uma delas, essa máquinas serão:

  • zookeeper
  • broker
  • consumer
  • producer

Zookeeper

Como preparar?

Nenhuma configuração específica é necessária. Iremos utilizar a configuração default do zookeeper.

Como rodar?

bin/zookeeper-server-start.sh config/zookeeper.properties

Broker

Como preparar?

Mude as seguintes linhas do arquivo config/server.properties do kafka:

# The id of the broker. This must be set to a unique integer for each broker.

broker.id=1

# The port the socket server listens on

port=80

# Hostname the broker will bind to. If not set, the server will bind to all interfaces

host.name=<brokerIP>

# root directory for all kafka znodes.

zookeeper.connect=<zookeeperIP>:<zookeeperPORT>

# Timeout in ms for connecting to zookeeper

zookeeper.connection.timeout.ms=1000000

# A comma seperated list of directories under which to store log files

log.dirs=/tmp/kafka-logs-<ID>

Como rodar?

sudo bin/kafka-server-start.sh config/server.properties

Consumer

Como preparar?

Não precisa de nenhuma configuração específica.

Como rodar?

bin/kafka-console-consumer.sh –zookeeper <zookeeper_IP>:<zookeeper_PORT>  –topic <topic-name>

#default zookeeper port = 2181

Producer

Como preparar?

Não precisa de nenhuma configuração especial

Como rodar?

bin/kafka-console-producer.sh –broker-list <broker-ip1>:<broker-port>,<broker-ip2>:<broker-port>, … , <broker-ipN>:<broker-port> –topic <topic-name>

 

Um simples teste para verificar se as máquinas conseguem se comunicar e as mensagens estão sendo transmitida é criar um producer e um consumer e testar como mostrado via terminal se as mensagens chegam em tempo real sem problemas.
Por exemplo: https://kafka.apache.org/08/quickstart.html

 

Bibliografia

http://kafka.apache.org/
http://blog.cloudera.com/blog/2014/09/apache-kafka-for-beginners/

 

Breve introdução ao Apache Kafka

URI – Contest de aquecimento da OBI 2016 – fase 1

E aí,

Então recentemente participei do Contest de aquecimento da OBI no URI como autora, foi uma experiência bem bacana então nada mais válido do que deixar esse fato registrado aqui :)!

Escrevi 3 problemas: Prant e a Indecisão, Ímpar, Par ou Roubo e Marcando um Encontro.

O editorial se encontra nesse link. Em breve pode sair um editorial em inglês :), fiz um breve editorial em inglês das minhas questões e se encontra nesse link.

É isso aí, abraços!

URI – Contest de aquecimento da OBI 2016 – fase 1

2016 – is it too late now to say sorry?

Primeiramente, feliz ano novo!!!! Esse é meu primeiro post em 2016 :D! (Sim, eu sei, já é quase 2017).

Enfim, quero pedir desculpas por não atualizar o blog, esse ano vou atualizar certinho, eu espero… haha.

E aproveitando a oportunidade, quero falar o que planejei para esse ano. Segue abaixo:

  • Planejo colocar meu site pessoal no github, mas eu ainda vou manter o wordpress para o blog.
  • Manter uma média de 4 posts mensais  1 post mensal (a vida ta corrida), começando de agora haha.
  • E escrever sobre algumas coisas que fiz ano passado e não tive tempo de escrever sobre.

Espero que tudo dê certo :D!

Tenha um ótimo dia :).

2016 – is it too late now to say sorry?