Microdados ENEM com R / Hadoop / Spark / Hive

A definição de Big Data que acho mais interessante é algo mais ou menos assim:

  • “Big Data são os dados que não cabem na memória RAM”

Quem desenvolve em R sabe que essa definição é perfeita…

O problema é que há uns 15 anos atrás HDs de 100GB de memória eram raros e de lá para cá essa capacidade de armazenamento aumentou muito. Atualmente HDs de 1TB são bem comuns, porém a velocidade com que os dados são lidos não aumentou na mesma velocidade. Então, para ler um HD inteiro, leva-se mais tempo hoje do que a 15 anos atrás.

Mapreduce

Até que alguém teve uma ideia muito simples que é ler dados de diversos HDs ao mesmo tempo, uma analogia interessante é:

Você tem que contar os livros de uma biblioteca, uma opção seria contar um a um até chegar no total ou chamar seus amigos e dizer:

  • “Ok, temos 8 corredores (MAP), cada um de vocês conta os livros de cada corredor(REDUCE) e me fala o total”

Atualmente a aplicação mais famosa de Mapreduce é o Hadoop, que é provavelmente o projeto de Open Source de maior impacto no mundo dos negócios até hoje.

O problema agora, como comentei no meu post anterior (https://dadosdadosdados.wordpress.com/2015/11/09/o-varian-pirou/ ), é que existe um gigantesco ecossistema de ‘coisas’ para estudar, aprender, usar e manter o que torna impraticável na ‘vida real’, ou vai demandar uma gigantesca dedicação.

Spark

SPARK

A partir de meados de 2015 o R foi integrado ao Spark, que é uma plataforma de computação em cluster que foi desenhada para ser rápida e genérica. Sua diferença básica com o Hadoop é que ele faz suas computações na memória (ram) ao invés de usar os discos (hd), isso permite a ele realizar cálculos que antes eram bem complicados de serem feitos em uma operação de Mapreduce comum.

Outro ponto importante é que ao invés de termos que focar em diversas tecnologias ao mesmo tempo, a filosofia do Spark é de prover um pacote completo para os analistas não terem que gastar tempo mantendo 15 sistemas ao mesmo tempo, o que diminui drasticamente os custos.

No final das contas, com o Spark conseguimos nos aproximar muito do modelo proposto pelo Varian para análise de dados, com um overhead menor, seja em custos de se manter sistemas, em horas de aprendizado.

Simulando um ambiente

Para efeitos de treino/testes, é possível simular um ambiente de Spark em apenas 01 cluster, ou seja, ao invés de distribuir os cálculos em várias máquinas, usamos somente nosso computador. Não é a coisa mais eficiente do mundo (computação distribuída em 01 computador não é distribuída), mas é possível desenvolver seu código nesse cluster único e depois subir para a nuvem quando ele estiver pronto.

Pré requisitos:

1 – Virtualbox
https://www.virtualbox.org/wiki/Downloads

Eu costumo configurar essas máquinas virtuais com 50GB de HD, 8GB de RAM e 64MB de memória de vídeo, essas configurações devem variar dependendo da máquina que você vai rodar isso.

No meu notebook eu uso 2GB de RAM e 12MB de vídeo somente.

2 – Linux no virtualbox – A versão que uso é o Mint (Rafaela)
http://linuxmint.com/

3 – Extension pack do Virtual box
https://www.virtualbox.org/wiki/Downloads

No linux:
4 – Java
$ sudo apt-get install openjdk-7-jdk
$ export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

5 – Hadoop

https://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/SingleCluster.html

6 – Hive
https://cwiki.apache.org/confluence/display/Hive/AdminManual+Installation#AdminManualInstallation-InstallingHive

7 – Spark – prestar atenção na versão do Hadoop, a versão pre-built serve
http://spark.apache.org/downloads.html

8 – R – Note que para o R, Trusty é a versão do Linux que estou usando, se você estiver usando uma versão diferente, é possível que você tenha que mudar o final do endereço

Adicionar em: /etc/apt/sources.list
deb https://cran.rstudio.com/bin/linux/ubuntu trusty/

Atualizar e instalar:
$ sudo apt-get update
$ sudo apt-get install r-base

$ R para checar a versão

9 – R-Studio
https://www.rstudio.com/products/rstudio/download/

Um caso real – Microdados ENEM

A pior coisa de usar tutoriais e demos é que tudo sempre dá certo, é uma beleza! O próprio tutorial do Spark usa um data.frame de umas 600 linhas, que meigo…

Eu encorajo a todos a tentarem algo diferente, para ver os problemas e dificuldades e o exemplo que vou mostrar aqui é dos microdados do ENEM.

É realmente uma pena a demora do INEP a divulgar os dados, pois os dados mais novos disponíveis são de 2013, mas é o que tem para hoje…

http://portal.inep.gov.br/basica-levantamentos-acessar

O legal dessa base de dados é que ela tem 5.1GB de dados, com 7.173.564 linhas e 166 colunas, o suficiente para travar minha máquina virtual, mesmo que ela possua 8GB de RAM, então ‘tecnicamente’ podemos considera-la como ‘BIG Data’.

Para essa análise quero comparar as notas das provas entre os estados do Brasil.

Rodando

O sparkR é realmente bacana, você basicamente precisa de dois comandos para começar a usar:

sc <- sparkR.init(master = 'local')
hiveContext <- sparkRHive.init(sc)

O primeiro comando inicia um contexto Spark e o segundo cria um contexto HIVE desse primeiro.

Depois, e é aí que as coisas começam a ficar diferentes de um exemplo comum, na hora de montar uma query no HIVE, você tem que declarar as colunas, o que é lindo quando você tem duas ou três, mas quando você tem 166 no caso do ENEM, você apela…

st <- rep('string', length(colnames(sample)))

st[match('NOTA_CN' ,colnames(sample))] <- 'int'
st[match('NOTA_CH' ,colnames(sample))] <- 'int'
st[match('NOTA_LC' ,colnames(sample))] <- 'int'
st[match('NOTA_MT' ,colnames(sample))] <- 'int'

Como queremos analisar somente as notas médias, vou forçar todos os campos a serem strings e somente a notas como números inteiros.

c1 <- paste(colnames(sample), st)
campos <- paste(c1, sep=',',  collapse = ', ')
cTable <- paste("Create external table src1 (", campos, ") row format delimited fields terminated by ';' SET skip.header.line.count = 1 ")

sql(sqlContext, "DROP TABLE src1")
sql(sqlContext, cTable)
sql(sqlContext, "LOAD DATA LOCAL INPATH '/home/sandor/Enem/2013/DADOS/MICRODADOS_ENEM_2013.csv' OVERWRITE INTO TABLE src1")

Agora é só agrupar os dados em um select comum

results1 <- sql(sqlContext, "SELECT UF_RESIDENCIA,
                avg(NOTA_MT) as AVG_MT,
                avg(NOTA_CN) as AVG_CN,
                avg(NOTA_CH) as AVG_CH,
                avg(NOTA_LC) as AVG_LC
                FROM src1 GROUP BY UF_RESIDENCIA")

Para transformar em data.frame do R usamos o comando ‘collect()’

tabela <- collect(results1)

Temos que pro fim ‘stopar’ o Spark

sparkR.stop()

O resultado

Agora, pegamos a nota média por estado por prova e subtraímos da média total para comparar as notas entre provas e estados.

Note que:

MT = Nota da prova de Matemática

LC = Nota da prova de Linguagens e Códigos

CH = Nota da prova de Ciências Humanas

CN = Nota da prova de Ciências da Natureza

plot of chunk unnamed-chunk-8

Advertisements

O Varian pirou?

Durante meus anos de estudo na universidade, Microeconomia tornou-se uma de minhas matérias preferidas e os livros texto do Varian certamente ajudaram a despertar esse interesse.

https://en.wikipedia.org/wiki/Hal_Varian

Em 2002 ele foi trabalhar no Google como um consultor e de lá para cá começou a se inclinar para o “Lado Negro da Força”.

Em 2009, Hal Varian comentou que o emprego mais ‘sexy’ dos próximos 10 anos seriam os estatísticos:

I keep saying the sexy job in the next ten years will be statisticians. People think I’m joking, but who would’ve guessed that computer engineers would’ve been the sexy job of the 1990s?”

E em 2013, publicou um artigo que capturou minha atenção, seu título é:

Big Data: New Tricks for Econometrics

http://people.ischool.berkeley.edu/~hal/Papers/2013/ml.pdf

E aí as coisas começaram a ficar mais interessantes…

O texto sobre Big Data e econometria tenta conciliar duas linhas de pensamento que até então andam separadas, que são a Econometria de um lado e os métodos computacionais de outro.

Para Varian, que está sentado em um trono de ouro no Google e possui centenas de engenheiros de software para fazer sua vontade, conectar Big Data e econometria ao mesmo tempo que propõe a utilização de novas ferramentas é trivial. Ele toca um sino e um estagiário traz um notebook em uma almofada vermelha para ele clicar ‘Run’.

A arrogância do texto é tanta que ele sugere logo nos primeiros parágrafos para que seus estudantes frequentem uma aula sobre “Machine Learning”:

…go to the computer science department and take a class in machine learning…

Resolvido…

 

O que ele sugere

No seu texto dedica basicamente 01 página as ferramentas para manipular big data (“01 Tools to manipulate big data“) e mostra em uma tabela as ferramentas que podem ser utilizadas. Resumidamente:

  • Hadoop File System: Um sistema de arquivos para ‘quebrar’ arquivos gigantescos em várias máquinas
  • Cassandra: Tabela de dados que vive no HDFS
  • Hadoop: Metodologia de ‘mapear’ os dados distribuídos em vários computadores e resumi-los fazendo calculos parciais (‘reduzidos’) em cada um deles
  • PIG: Uma linguagem específica para acessar esses dados
  • Hive, Drill, Impala: Funcionam de uma maneira semelhante ao PIG, mas são mais parecidas com os comandos SQL.

Fácil, não é? É só jogar meus arquivos nesse tal de HDFS e usar o PIG para fazer um resumo, o que pode dar errado?

A verdade é que não é tão fácil quanto parece. Existe um enorme buraco entre importar um arquivo de texto no Eviews versão estudante, Stata etc e utilizar as ferramentas sugeridas pelo Varian.

 

OK, então existem uma série de coisas para aprender, o que precisamos fazer?

Vou tentar fazer um breve resumo do que temos que aprender para poder começar a tentar trabalhar da forma proposta pelo Varian, eu estimo de 06 meses a 01 ano de estudo (dependendo da dedicação) para um estudante tornar-se proficiente em criar modelos que passem por todos os níveis da pilha, por isso o nível de sarcasmo dos próximos parágrafos é mais alto do que de costume neste blog.

Já ouviu falar do Linux? Essas coisas só funcionam bem nele, então a primeira coisa a fazer é montar um PC com o linux como sistema operacional.

Não tem um PC sobrando e não quer formatar sua máquina? Existem dois caminhos, ou você cria um dual boot para escolher qual o sistema operacional seu computador vai abrir ou cria uma máquina virtual usando, por exemplo o Virtualbox para rodar um linux dentro do windows. Essa última opção é mais lenta já que você fica com recursos compartilhados, mas é a melhor para quem está aprendendo.

Agora é só aprender a usar linux com linha de comando…

Depois, (felizmente) boa parte dessas tecnologias são open source o que é ótimo para aprender a usa-las, porém você vai eventualmente ter que instalar algumas coisas usando um negócio chamado Github, que de forma bem simplificada é um sistema usado para fazer controle de versões.

Então é só criar uma conta no github e aprender a usar por linha de comando, afinal você está no linux.

Obs: para o pessoal que está começando agora a escrever scripts no R, o github é de longe um dos melhores companheiros. Mesmo se você não trabalha em equipe, ter um controle das suas alterações e dos resultados intermediários da sua análise é algo fantástico.

Ótimo, agora temos um problema…as implementações do R ainda são limitadas e, principalmente para quem está aprendendo, não é uma boa seguir por modelos pre-estruturados como o Revolution Analytics ou Mapr, pois você fica amarrado. É possível até ser criativo, mas se vc quer a experiência completa, falta um pouco ainda para o R chegar lá.

Portanto você vai ser mais feliz usando o Python e veja só que legal, o linux geralmente vem com uma versão do Python instalada, então você não precisa instalar…

…Só aprender Python…( vale lembrar que hoje existem duas versões diferentes de Python rolando, então é bem comum você ter problemas com as versões)

Ótimo, agora é só instalar um Data serialization schema chamado AVRO, assim você pode mapear arquivos não estruturados.

Depois disso, instalar o PIG e aprender a usar…

Ótimo, agora estamos prontos para começar a brincar como o Varian…

 

Mais ou menos…

Com isso montamos a versão mais simples possível de uma pilha de tecnologia usando o Hadoop usando apenas 01 cluster (seu próprio PC), agora é possível começar a estudar como trabalhar com big data, mas para conseguir efetivamente tirar algum proveito você vai precisar escalar isso ou juntando vários PCs em um cluster ou usando algum serviço na nuvem como o Azure ou a Amazon, qualquer opção vai gerar custos altos para o estudante.

Em outras palavras, você se dedicou, estudou, estudou e estudou e no final das contas o resultado que você vai atingir usando sua aplicação caseira não é muito melhor do que abrir um CSV no R.

O verdadeiro ganho está em, quando surgir a necessidade, escalar essa aplicação na Nuvem e rodar o que for necessário de maneira escalável, portanto existe um bom valor em entender seu funcionamento. Essas aplicações na Nuvem costumam cobrar por horas de processamento, então você pode subir um cluster, processar o que precisa e desmontar, pagando alguns dólares por tudo.

 

Próximos passos

Essa é só a ponta do iceberg, tanto que o que descrevi acima é chamado de Hadoop 1.0, implementações mais modernas usam o Hadoop 2.0 que tem diversas melhorias na redundância dos dados, na forma como os clusters são gerenciados e trocentas formas diferentes de trabalhar os dados no HDFS.

hadoopstack

Na minha opinião, o Varian não pirou ( talvez só um pouco) , pois as tecnologias por ele sugeridas seriam reproduzíveis por um estudante em casa, o problema é a quantidade de trabalho e estudo que isso demanda.

Em um futuro próximo vejo que a melhor forma de conciliar a Econometria com Big Data seria o trabalho colaborativo entre pessoas com diferentes habilidades ou a utilização de pilhas de tecnologia pre-configuradas como o Cloudera, Revolution Analytics, Mapr, Horton, HDinsight e etc, mas ainda assim não nos livramos de ter que aprender uma série de novas tecnologias para fazer basicamente a mesma coisa que antigamente, só que maior…