Passo a passo: machine learning com Spark e AWS (Parte I)

Parte I: Criando uma instância no Amazon EC2
Qualquer entusiasta de machine learning, mais cedo ou mais tarde, acaba se deparando com um dataset grande demais para caber na memória do laptop. Nesta hora, existem duas saídas: ou quebrar o dataset em pedaços (chunks) e computá-los na sua máquina usando uma ferramenta apropriada como o Vaex, ou distribuir todo o trabalho computacional para um cluster de máquinas.
Se você nunca fez isso antes, pode soar como uma coisa de outro mundo. Mas a verdade é que hoje em dia o registro e configuração de um cluster na nuvem é extremamente simples, rápido e acessível.
Esta é a primeira parte do tutorial onde mostrarei como executar um projeto de machine learning em Python utilizando a stack Spark + AWS.
Por que o Spark?
Quando se trata de big data, o processamento dos dados não acontece em uma máquina individualmente, mas sim de forma distribuída. Isso significa que tarefas grandes demais são repartidas em porções mais manejáveis e então delegadas para um cluster de máquinas, cada um com suas CPUs e memórias próprias. Para este tipo de tarefa, as grandes tecnologias do momento são Hadoop e Spark.
Enquanto o Hadoop armazena no disco dados intermediários durante o processamento dos dados, o Spark retém o máximo possível deles na memória. Isso é vantajoso quando se trabalha com um grande volume de dados, já que a memória RAM pode ser até 6 vezes mais rápida que o armazenamento SSD.1 Por essa e outras razões, Spark tem sido a tecnologia mais utilizada em clusters nos últimos anos.

Ranking de buscas no Google desde 2010
Por que o AWS?
Instalar, configurar e padronizar o Spark manualmente em todas as máquinas de um cluster pode dar um pouco de trabalho. Em vista disso, a Amazon oferece um serviço chamado Elastic MapReduce (EMR), que fornece máquinas virtuais com produtos como Hadoop ou Spark instaladas e pré-configurados. Além disso, você pode aumentar ou diminiuir o tamanho ou capacidade do seu cluster de acordo com a necessidade do momento.
O custo de uma instância
Todo usuário que se cadastrar na AWS pode utilizar o serviço EC2 (onde nossa instância fica hospeada) gratuitamente por 12 meses desde que suas aplicações não ultrapassem os limites oferecidos, o que inclui até o momento que escrevi este post 750 horas por mês da instância t2.micro
.
No entanto, o tipo de instância que criaremos neste tutorial (m5.xlarge
) custa aproximadamente $0.75 (quatro centavos de dólar) para cada hora de processamento.
A Amazon cobra por hora de funcionamento da instância mesmo se ela estiver ociosa — isto é, não importa se você estiver usando 100% ou 0% das CPUs. Além disso, a instância m5.xlarge, que é a categoria de instância que usaremos neste artigo, não é coberta pelo free tier. Por isso, deixe a instância desligada enquanto não estiver usando para evitar surpresas no final do mês.
Configurando o AWS
-
Acesse o site do Amazon EMR e crie uma conta, caso você ainda não tenha feito.
-
Em “Serviços da AWS”, expanda a seção “Todos os serviços” e clique em
EC2
.

-
No menu à esquerda, clique em “Pares de chaves”. Você precisará criar um par de chaves para usar mais adiante e poder logar na sua instância de forma segura.
-
Clique no botão “Criar par de chaves” e na página seguinte digite um nome para identificar o seu cluster.

Em relação ao formato do arquivo, por hora basta saber que se você estiver usando Linux ou macOS, você provavelmente usuará a chave no formato pem
para acessar o terminal remoto do cluster via SSH. Se você for utilizar o PuTTY no Windows, então selecione o formato ppk
. Mas não se preocupe com os detalhes agora, apenas escolha o tipo de chave de acordo com o seu sistema operacional.
Se funcionar, o seu navegador fará o download da chave privada para a sua máquina. Guarde este arquivo em um local seguro, pois ele será a chave para logar na sua instância.
- Em seguida, expanda a seção “Serviços” no lado esquerdo da barra escura no alto da página e clique em
EMR
na seção “Análise de Dados”. Se não conseguir encontrar, clique no campo de busca no alto da região e digite “EMR” e clique no primeiro item da lista.

-
Clique em “Criar cluster”.
-
Dê um nome sugestivo para o seu cluster ou faça como eu e batize sua nova instância com o nome de algum aglomerado de estrelas, porque soa legal pra caramba :)
-
Mantenha todas as opções que vêm de fábrica, especialmente a “Pasta do S3”.
-
“Modo de execução” dependerá da finalidade da sua instância. A opção “Execução da etapa” encerra sua instância quando o job tiver finalizado, o que pode ser uma opção econômica se você souber o que está fazendo. Mas para a maioria dos casos, sobretudo no que diz respeito a testes e análises exploratórias, é recomendado deixar a opção “Cluster” selecionada.
-
Selecione a versão mais atual da Configuração de software e como pacote de aplicativos selecione
Spark
. -
Em “Configuração do hardware”, mantenha o valor de fábrica (
m5.xlarge
). A família M de instâncias do AWS se refere ao tipo de instância multipropósito, ao passo que a família R é otimizada para trabalhos que requerem mais memória e a família C para mais CPU. -
No campo “Par de chaves EC2” da seção “Segurança e acesso”, selecione a o nome que você deu para o seu cluster. Isso é necessário para você poder acessar o cluster futuramente.
-
Se você está pronto para subir arquivos para a nuvem e pretende executar alguma rotina no seu cluster, clique em “Criar cluster”. Caso contrário, é melhor deixar esta etapa para depois, pois a partir do momento em que se ativa um cluster, a Amazon começa a cobrar por hora utilizada.
Pronto! Você acaba de criar seu primeiro cluster na nuvem.
Próximo
-
Pelo menos quando se trata de leitura sequencial. Já no modo de acesso aleatório, a memória RAM pode ser 100.000 vezes mais rápida. Veja mais em Jacob, A. (2014) The Pathologies of Big Data. ↩︎