Conteúdo


Analise os dados de clima em seu navegador usando Spark no Bluemix

Comments

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.

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. Apache Spark Weather page
    Apache Spark Weather page
  7. Isto o levará ao console de Instâncias do Spark. Clique em seu serviço recém-desenvolvido. Analytics for Spark
    Analytics for Spark

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. Create Notebook page
    Create Notebook page

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 horário da observação, queda de neve, profundidade da neve, etc.) e algumas informações adicionais nas colunas C5 a C8. data
    data
  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. Add data source
    Add data source

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. toolbar
    toolbar
  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]. data
    data
  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. codecode credentials name keystorne
    code credentials name keystorne
  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:

    code output
    code output

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]
    input output
    input output
  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.
    ChaveValor
    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.
    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()
    code in out 11-14
    code in out 11-14
  10. Agora é possível imprimir as primeiras dez estações e suas precipitações médias.
    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()
bar chart highest average percipitation
bar chart highest average percipitation

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.


Recursos para download


Comentários

Acesse ou registre-se para adicionar e acompanhar os comentários.

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Big data e análise de dados, Cloud computing
ArticleID=1030641
ArticleTitle=Analise os dados de clima em seu navegador usando Spark no Bluemix
publish-date=04262016