Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Python Brasil 2016 - PySpark Tutorial

Python Brasil 2016 - PySpark Tutorial

Robson Júnior

October 16, 2016
Tweet

More Decks by Robson Júnior

Other Decks in Programming

Transcript

  1. @bsao • +13 anos como desenvolvedor (+10 com python) •

    senior data engineer @ vivareal.com • contratando muito: https://jobs.lever.co/vivareal/ rupy brazil chairman startup vale co-founder agilevale co-founder
  2. big data é o imenso volume de dados estruturados ou

    não que impactam o dia a dia dos negócios.
  3. Computação Distribuida • Problemas de big data não podem ser

    resolvidos apenas em um computador; • Paralelizar; • Distribuir; • Processar mais dado em menos tempo;
  4. Desafios 1. Falhas de Hardware; 2. Particionamento dos Dados; 3.

    Comunicação entre as maquinas e processos; 4. Escalonagem;
  5. Falhas de Hardware • Falhas de Energia; • Falhas de

    Memória; • Falhas na Rede; • Falhas no Disco;
  6. Particionamento • Como dividir os dados em cada computador? •

    Como manter os dados que fazem sentido de serem processados juntos? • Divisão de carga entre os processo, ou seja, qual a carga de dados que cada computador vai executar? • Se hover “desbalanceio", a computação atrasa; • A computação só termina quando todos os processos estão finalizados;
  7. Comunicação entre Maquinas e Processos • Latência da Rede &

    Envio de mensagens; • Comunicação dos resultados parciais;
  8. Escalonamento • Quem vai executar o que? • Qual a

    ordem de execução? • Sincronização;
  9. +

  10. • framework para processamento de big-data • foco em velocidade

    • abstração de analises sofisticadas • nasceu da academia em Berkeley, 2009 • open source 2010 • fácil/rápido/escalável/framework para cluster computing • o core é escrito em scala (jvm) • apis completas para Python e o resto (Java/Scala/R) • um projeto muito ativo desde 2014
  11. características • extende MapReduce; • suporta mais do que apenas

    as funções de Map e Reduce; • evita mover dados durante o processamento, • “cachea” dados em memória e processamento proximo do tempo real. • detem dados intermediários em memória, para processar o mesmo conjunto de dados varias vezes • o disco é usado quando a memória acaba. • REPL
  12. arquitetura • API - criação de aplicações (Scala, Java ou

    Python) • Armazenamento de dados - Usa o HDFS para armezar os dados, ou seja, consegue processar nativamente qualquer dado compatível. • Framework de gerenciamento - Gestão da infraestrutura.
  13. RDD Resilient Distributed Datasets é a estrutura de dado fundamental

    do Spark é uma coleção de dados distribuida pode conter qualquer tipo de dados python / java ou scala tolerante a falhas
  14. SparkContext • é a porta de entrada para o spark

    • configuração e provisionamento
  15. beatles = sc.textFile(‘storage/file’) storage partição partição partição beatles = beatles.map(loads)

    collect beatles.collect() partição partição partição beatles = beatles.filter(lambda b: b[‘track_duration’] > 25000)
  16. behind the scenes - python • py4j - permite que

    um programa python rodando dentro de um interpretador python possa acessar objetos java em uma jvm. • pickle
  17. driver worker Python SparkContext beatles = sc.textFile(‘storage/file’) py4j Java SparkContext

    sc = SparkContext() java executor task beatles = beatles.map(loads) Python Code Python Code task beatles = beatles.filter(lambda b: b[‘track_duration’] > 25000)
  18. SparkContext • o SparkContext é a porta de entrada de

    tudo, diz ao PySpark como acessar o cluster Spark; • acesse a variável “sc"
  19. parametro master local é o default, roda o spark localmente

    com uma worker thread (sem paralelismo) local[K] roda o spark com K worker threads (idealmente o numero de cores da maquina) spark://HOST:PORT conecta em um cluster spark, a porta default é 7077 mesos://HOST:PORT conecta em um cluster mesos, a porta default 5050
  20. clusters • o master conecta no manager do cluster; •

    aloca recursos; • aloca executors; • envia o código da app para os executors;
  21. persistencia dos dados • o Spark pode persistir (cache) os

    dados em memória; • cada maquina do cluster guarda pedaços dos dados e reusa em futuras operações, o que faz o Spark ser até 100x mais rápido em futuras operações; • o cache é tolerante a falhas, se qualquer maquina ou partição enfrentar problemas, será automaticamente recomputado;
  22. MEMORY_ONLY guarda um RDD como um objeto deserializado em memoria

    na JVM, se o objeto não couber na memória, as partições que não couberem não serão armazenadas e serão recomputadas em tempo de execução; MEMORY_AND_DISK mesmo que o MEMORY_ONLY mas, se os dados não couberem na memória, serão persistidos em disco. MEMORY_ONLY_SER mesmo que o MEMORY_ONLY mas armazena um objeto serializado em memória. Tende a ser mais eficiente, mas consome mais CPU. MEMORY_AND_DISK_SER mesmo que MEMORY_ONLY_SER, mas, se os dados não couberem na memória, serão persistidos em disco. DISK_ONLY armazena somente em disco MEMORY_ONLY_2
 MEMORY_AND_DISK_2 exatamente mesma coisa que as informações acima, porem replica a partição em 2 nós.
  23. transformations map(f) aplica uma função para cada registro do rdd

    filter(f) filtra um rdd baseada em uma função flatMap(f) igual ao map, mas entrega uma collection flat union(rdd) une dois rdd's distinct() realiza um distinção de valores baseado em uma cahve groupByKey() agrega valores pela key de uma tupla reduceByKey(f) agrega uma rdd baseada em uma funcao com retorno de um key
  24. sortByKey(f) ordena um rdd baseado em uma funcao que retorna

    bool. join(f) realiza a união de um rdd baseada em uma chave cogroup(rdd) agrupa sequencias baseada em uma chave
  25. actions reduce(f) agrega um rdd baseado em uma função; f

    recebe dois argumentos e retorna um. collect() retorna todos elementos de rdd count() conta os elementos de um rdd first() primeiro registro do rdd take(n) retornar n valores do rdd saveAsTextFile(path) save o rdd para um arquivo texto
  26. Broadcast • permite que uma variável seja armazenada em cada

    nó sem que elas sejam enviadas através das tasks; • para melhor eficiência da comunicação entre as maquinas;
  27. Accumulators • São contadores, que só podem ser somados; •

    Permitem soma e contagens eficientes em tarefas com paralelismo; • Permite tipos númericos ou collections; • Pode ser extendido; • SOMENTE O DRIVER CONSEGUE LER O ACCUMULADOR;
  28. ac = sc.accumulator(0) rdd = sc.parallelize([1, 2, 3, 4]) def

    f(x): global ac ac += x rdd.foreach(f) print(ac.value)
  29. Parquet • formato de arquivo colunar do ecossistema hadoop; •

    Spark suporta nativamente leitura e escrita de parquet files preservando os esquemas do RDD; • Suporta DSL como RDD :)