Operações de big data do framework Apache Spark utilizando a biblioteca pyspark.
Qual o objetivo do comando cache em Spark?
A função do cache evita que haja repetitivos acessos ao disco em busca de recursos utilizados constantemente no ambiente Spark, carregando-os na memória para um rápido acesso. Por padrão, os RDD's são carregados de forma lazy - isto é, uma vez instanciado o RDD é apenas uma abstração de instruções para a sua manipulação -, somente ao chamar uma ação, há de fato uma coleta de dados do RDD instanciado anteriormente, o que é demorado, e uma vez que se pode reutilizar esse resultado no restante da aplicação, convém usar o cache para melhorar a performance.
O mesmo código implementado em Spark é normalmente mais rápido que a implementação equivalente em MapReduce. Por quê?
Isso se deve à principal diferença em termos performáticos dos dois frameworks: o Spark executa processamento em memória RAM enquanto que o MapReduce possui escrita e leitura em disco rígido, que é comparavelmente muito mais lento.
Qual é a função do SparkContext?
Trata-se de um objeto que é a instancialização de qualquer aplicação Spark, esse objeto possibilita o cliente a se conectar à um cluster Spark e criar RDD's seguindo as configurações passadas no momento da instancialização.
Explique com suas palavras o que é Resilient Distributed Datasets (RDD).
São as estruturas de dados do framework Spark. RDD é um acrônimo para Resilient Distributed Datasets, é então uma coleção de dados tolerantes à falha que podem ser executadas em paralelo. Sua instância é por definição lazy, nela é carregada uma série de instruções para ações e transfomações para manipulação dos dados - como por exemplo as operações map
e reduce
.
GroupByKey é menos eficiente que reduceByKey em grandes dataset. Por quê?
O algoritmo do GroupByKey
transfere mais dados em suas operações do que o reduceByKey
. A eficiência da função reduceByKey
vem do fato de que, a cada operação de elementos com a mesma chave, é computado em seguida um resultado parcial, antes de ser passada a execução para o resultado final. No caso do GroupByKey
, não há o calculo de resultados parciais, o que faz carregar na memória muito mais dados para só então realizar a operação final.
Explique o que o código Scala abaixo faz.
1. val textFile = sc.textFile("hdfs://...")
2. val counts = textFile.flatMap(line => line.split(" "))
3. .map(word => (word, 1))
4. .reduceByKey(_ + _)
5. counts.saveAsTextFile("hdfs://...")
Na primeira linha, o RDD é instanciado a partir de um arquivo no ambiente da aplicação Spark. Na segunda linha, há o tratamento dos dados vindos do arquivo de texto, e então na linha seguinte, os dados são preparados para serem contabilizados - cada palavra, uma ocorrência -, e finalmente na quarta linha a operação de contabilizar por chave é realizada - reduzindo as repetidas ocorrências de uma palavra em um único elemento. Na linha 5 o resultado da operação é salvo em um arquivo no endereço especificado.
Disponível no arquivo app.py
deste repositório.
Para inicia-lo, rodar no terminal python app.py
Exemplo de retorno:
*** RESULTS ***
#1. Number of unique hosts: 137979 hosts
#2. Total of 404 errors: 20901
#3. The top 5 most frequent URL's with 404 errors:
1. | "/pub/winvn/readme.txt" | 2004 responses
2. | "/pub/winvn/release.txt" | 1732 responses
3. | "/shuttle/missions/STS-69/mission-STS-69.html" | 683 responses
4. | "/shuttle/missions/sts-68/ksc-upclose.gif" | 428 responses
5. | "/history/apollo/a-001/a-001-patch-small.gif" | 384 responses
#4. Number of 404 errors daily:
- 01/07/1995: 316 error responses
- 02/07/1995: 291 error responses
...
- 29/08/1995: 420 error responses
- 30/08/1995: 571 error responses
- 31/08/1995: 526 error responses
#5. Total number of bytes sent: 65524314915 bytes
*** END ***