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