PDF

Analise os dados de clima em seu navegador usando
Spark no Bluemix
Li Feng ([email protected])
Technical Consultant
IBM
26/Abr/2016
O Apache Spark é um mecanismo de processamento de dados distribuídos de última geração
que, pela primeira vez, está tornando totalmente disponíveis novos recursos para cientistas
de dados, analistas de negócios e desenvolvedores de aplicativos. O Analytics para Apache
Spark funciona com ferramentas comumente usadas disponíveis no IBM Bluemix, para que
seja possível iniciar rapidamente o uso do poder integral do Apache Spark. Este tutorial mostra
como usar o iPython Notebook, que usa a API Spark, para analisar dados brutos do clima do
mundo real. É possível usar este exemplo facilmente como uma base para mais análise no
Bluemix.
Apache® Spark™ é uma estrutura de computação de cluster de software livre com
processamento na memória. Com o Spark, aplicativos analíticos são executados até 100 vezes
mais rápido do que tecnologias comparáveis no mercado atual.
“ Neste tutorial, você aprenderá como criar uma instância
do Spark com um bloco de notas iPython e usar a API do
Spark para analisar dados de clima no Bluemix. ”
Em junho de 2015 a IBM anunciou o suporte para o projeto Apache Spark de software livre,
tornando o Spark disponível como um serviço de nuvem na plataforma de nuvem do IBM
Bluemix. A IBM também liberou seu software SystemML por meio de uma licença de aprendizado
de máquina para a comunidade do Spark. Em conjunto com isto, a IBM abrirá um Centro de
Tecnologia do Spark em São Francisco com planos de ensinar a Spark a mais de um milhão de
cientistas de dados e engenheiros de dados, bem como ajudar mais de 3.500 pesquisadores e
desenvolvedores a trabalhar em projetos que envolvam o Spark.
Neste tutorial, você aprenderá como criar uma instância do Spark com um bloco de notas iPython
e usar a API do Spark para analisar dados de clima no Bluemix.
Este exemplo passo a passo mostra o quão fácil é analisar dados no IBM Bluemix com apenas
poucas linhas de código em Python.
© Copyright IBM Corporation 2016. Todos os direitos reservados.
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Marcas Registradas
Página 1 de 9
developerWorks®
ibm.com/developerWorks/br/
O que você precisará seguir juntamente com este tutorial
• Uma conta Bluemix .
• Conhecimento Básico do Apache Spark (útil, porém não obrigatório)
• Familiaridade com o Python (útil, porém não obrigatório)
Etapa 1. Crie uma instância do Spark em seu Painel do Bluemix
1. Efetue login em sua conta do Bluemix (ou inscreva-se para uma avaliação grátis).
2. Abra o CATÁLOGO do Bluemix .
3. Na seção Dados e Analytics , selecione Apache Spark.
4. No campo Nome do Serviço , especifique o nome de seu serviço, por exemplo, Apache
Spark-Weather, e deixe os outros campos como padrão. Não há a necessidade de ligar o
serviço ao Aplicativo.
5. Clique em CRIAR, em seguida, aguarde seu serviço ser fornecido.
6. Clique em ABRIR no canto superior direito.
7. Isto o levará ao console de Instâncias do Spark. Clique em seu serviço recém-desenvolvido.
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 2 de 9
ibm.com/developerWorks/br/
developerWorks®
Etapa 2. Crie um bloco de notas iPython em sua instância do Spark
É possível criar um novo bloco de notas iPython, fazer upload de um bloco de notas existente ou
usar uma das amostras do Bluemix. Para criar um novo bloco de notas:
1. Clique em NOVO BLOCO DE NOTAS na parte inferior esquerda da página.
2. Na guia Em Branco , insira o Nome de seu bloco de notas, escolha
Python como Linguagem e clique em CRIAR BLOCO DE NOTAS.
Etapa 3. Faça upload dos dados em seu bloco de notas
1. Visite o site National Centers for Environmental Information (NCEI) em http://
www.ncdc.noaa.gov/data-access/quick-links.
2. Clique no segundo link, Global Historical Climatology Network-Daily (GHCN-D).
3. Clique no link Acesso ao FTP GHCN-Daily .
4. Clique no link da pasta by_year .
5. Role até o final e clique no link 2015.cs.gz para fazer download dele.
6. Descompacte o arquivo 2015.cs.gz usando o utilitário adequado em sua plataforma local.
Abra o arquivo .csv resultante em seu editor de texto favorito e inclua os cabeçalhos da
coluna a seguir como a primeira linha no arquivo:
STATION,DATE,METRIC,VALUE,C5,C6,C7,C8
7. As colunas de 2015.csv contêm um identificador
de estação climática, uma data, uma
métrica que é coletada (precipitação, temperaturas máxima e mínima diárias, temperatura no
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 3 de 9
developerWorks®
ibm.com/developerWorks/br/
horário da observação, queda de neve, profundidade da neve, etc.) e algumas informações
adicionais nas colunas C5 a C8.
8. Faça upload do arquivo .csv para o seu bloco de notas. Demorará vários minutos para fazer
upload do arquivo completo no Armazenamento de Objeto.
Etapa 4. Crie um RDD
Em seguida, crie um RDD a partir do arquivo 2015.csv usando SparkContext.
1. Antes de acessar o arquivo armazenado no Armazenamento de Objeto usando
SparkContext, defina a configuração de Hadoop. Isto pode ser feito com a função a seguir:
def: set_hadoop_config(credentials
prefix = "fs.swift.service." + credentials['name']
hconf = sc._jsc.hadoopConfiguration()
hconf.set(prefix + ".auth.url", credentials['auth_url']+'/v2.0/tokens')
hconf.set(prefix + ".auth.endpoint.prefix", "endpoints")
hconf.set(prefix + ".tenant", credentials['project_id'])
hconf.set(prefix + ".username", credentials['user_id'])
hconf.set(prefix + ".password", credentials['password'])
hconf.setInt(prefix + ".http.port", 8080)
hconf.set(prefix + ".region", credentials['region']
2. Clique no botão Inserir na barra de ferramentas para inserir uma célula e cole
o código nela. Em seguida, clique no botão Executar para executar o código.
3. Após o código ser executado, um número entre colchetes aparecerá ao lado de In. Isto
indica a ordem de execução da célula do código no bloco de notas inteiro. Neste caso, ele é
[1].
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 4 de 9
ibm.com/developerWorks/br/
developerWorks®
4. Clique em Inserir no código para criar uma nova célula de código. As
credenciais para o arquivo .csv serão coladas automaticamente nele.
5. Por conveniência, copie as credenciais fornecidas em um documento para uso posterior.
O código foi preparado com as entradas necessárias para acessar o Armazenamento de
Objeto, portanto, apenas cole as linhas credenciais e execute a célula. Para a chave 'name'
é possível inserir qualquer sequência como o valor. Neste exemplo, ele é 'keystone'.
credentials = {}
credentials['name'] = 'keystone'
credentials['auth_url'] = 'https://xxxx.xxxxxxx.xxx'
credentials['project_id'] = 'xxxxxxxxxxx'
credentials['region'] = 'xxxxxxxxxxxx'
credentials['user_id'] = 'xxxxxxxxxxxxxx'
credentials['password'] = 'xxxxxxxxxxxx'
6. Agora é possível definir a configuração de Hadoop executando o código a seguir:
set_hadoop_config(credentials)
7. Com o arquivo de dados brutos armazenado no Armazenamento de Objeto, agora é possível
acessá-lo usando o SparkContext configurado em seu bloco de notas executando o código a
seguir:
weather = sc.textFile("swift://notebooks.keystone/2015.csv")
8. O RDD criado é uma coleção de sequências correspondentes às linhas individuais no
arquivo de dados brutos. É importante lembrar que o RDD está definido, mas ainda não está
instanciado. Aplicar uma ação como count ao RDD força efetivamente sua instanciação:
print "Total records in the 2015.csv dataset:", weather.count()
9. É possível aplicar outra ação no mesmo RDD para olhar a primeira linha de dados.
print "The first row in the 2015.csv dataset:", weather.first()
O resultado deve ser o seguinte:
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 5 de 9
developerWorks®
ibm.com/developerWorks/br/
Etapa 5. Analise os dados
1. Para realmente começar a trabalhar com os dados, é necessário analisá-los nas colunas. Isto
é feito mapeando cada linha no RDD para uma função que divide a linha por vírgulas.
weatherParse = weather.map(lambda line : line.split(","))
A notação lambda em Python é usada para criar funções anônimas que não estão ligadas
a um nome. Este conceito é usado no código acima para transmitir uma função como um
parâmetro para a função de mapa. A função anônima recebe cada linha a partir do RDD
weather e a divide nos limites da vírgula.
Como resultado, o novo RDD weatherParse é definido como uma lista de listas de
sequências. Cada lista em weatherParse corresponde a uma linha em weather e as
sequências em cada lista são os elementos individuais da linha.
2. A seguir, há uma visão rápida na primeira lista:
weatherParse.first()
3. Agora observe os elementos individuais desta primeira lista na qual a primeira entrada inicia
no deslocamento zero:
weatherParse.first()[0]
4. Também é possível realizar o pull de outros elementos por índice.
weatherParse.first()[2]
5. Agora é possível reduzir o conjunto de dados selecionando somente linhas com valores de
dados de precipitação, aquelas linhas nas quais a coluna METRIC é igual a PRCP.
6. O RDD weatherPrecp contém uma lista de pares (v1, v2), em que v1 é um identificador de
estação climática e v2 é um ponto de dado de precipitação (um dia) para essa estação. A
Tabela 1 abaixo descreve esta estrutura.
Tabela 1.
Chave
Valor
Estação 1
Valor 1
Estação 2
Valor 2
Estação 1
Valor 3
Estação 2
Valor 4
Estação 3
Valor 5
...
...
7. Em seguida, transforme (mapeie) este conjunto de dados em um novo no qual cada linha
(par de dados) é aumentada com o valor 1. A Tabela 2 abaixo descreve esta nova estrutura.
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 6 de 9
ibm.com/developerWorks/br/
developerWorks®
Tabela 2.
Chave
Valor
Estação 1
(Valor 1,1)
Estação 2
(Valor 2.1)
Estação 1
(Valor 3.1)
Estação 2
(Valor 4.1)
Estação 3
(Valor 5.1)
...
...
8. Agora crie weatherPrecpCountByKey executando o código abaixo.
# x[0] is the station
# x[3] is the precipitation value
weatherPrecpCountByKey = weatherPrecp.map(lambda x : (x[0], (int(x[3]), 1)))
weatherPrecpCountByKey.first()
A Tabela 2 é apenas uma transição. A razão para o mapeamento da Tabela 2 é poder,
subsequentemente, reduzi-la para a forma representada pela Tabela 3.
Tabela 3.
Chave
Valor
Estação 1
(Valor 1 + Valor 3.2)
Estação 2
(Valor 2 + Valor 4.2)
Estação 3
(Valor 5.1)
...
...
Nesta tabela, é possível calcular a média de precipitações para cada estação dividindo a
soma de valores pela contagem correspondente. Use a função reduceByKey da API Spark
para formar a Tabela 3.
weatherPrecpAddByKey = weatherPrecpCountByKey.reduceByKey(lambda v1,v2 : (v1[0]+v2[0], v1[1]+v2[1]))
weatherPrecpAddByKey.first()
9. Agora é possível, finalmente, calcular os valores médios por estação. Crie o RDD
weatherAverages mapeando o RDD weatherPrecpAddByKey por meio de uma função que
divide a precipitação total pelo número total de leituras.
weatherAverages = weatherPrecpAddByKey.map(lambda k: (k[0], k[1][0] / float(k[1][1] ) ) )
weatherAverages.first()
10. Agora é possível imprimir as primeiras dez estações e suas precipitações médias.
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 7 de 9
developerWorks®
ibm.com/developerWorks/br/
for pair in weatherAverages.top(10):
print "Station %s had average precipitations of %f" % (pair[0],pair[1])
11. Se desejar enviar as 10 estações com a maior média de precipitação, retorne o ID da
estação e a ordem do par de valores médio. É possível fazer isso simplesmente com uma
função de mapa que troca a ordem do par.
precTop10=[]
stationsTop10=[]
for pair in weatherAverages.map(lambda (x,y) : (y,x)).top(10):
precTop10.append(pair[0])
stationsTop10.append(pair[1])
print "Station %s had average precipitations of %f" % (pair[1],pair[0])
12. Usando blocos de notas interativos, é fácil criar um plot para resultados.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
N = 10
index = np.arange(N)
bar_width = 0.5
plt.bar(index, precTop10, bar_width,
color='b')
plt.xlabel('Stations')
plt.ylabel('Precipitations')
plt.title('10 stations with the highest average precipitation')
plt.xticks(index + bar_width, stationsTop10, rotation=90)
plt.show()
Conclusão
O Apache Spark é um mecanismo de processamento de dados distribuídos de última geração
que, pela primeira vez, está tornando totalmente disponíveis novos recursos para cientistas de
dados, analistas de negócios e desenvolvedores de aplicativos. O Analytics para Apache Spark
funciona com ferramentas comumente usadas disponíveis no IBM Bluemix, para que seja possível
iniciar rapidamente o uso do poder integral do Apache Spark. Este tutorial mostrou como usar o
iPython Notebook, que usa a API Spark, para analisar dados brutos do clima do mundo real. É
possível usar este exemplo facilmente como uma base para mais análise no Bluemix.
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 8 de 9
ibm.com/developerWorks/br/
developerWorks®
Sobre o autor
Li Feng
Li Feng is a technical consultant for IBM Cloud Ecosystem Development at IBM in
China. His work is focused on cloud computing and big data solutions.
© Copyright IBM Corporation 2016. Todos os direitos reservados.
(www.ibm.com/legal/copytrade.shtml)
Marcas Registradas
(www.ibm.com/developerworks/br/ibm/trademarks/)
Analise os dados de clima em seu navegador usando Spark no
Bluemix
Página 9 de 9